mirror of
https://github.com/caprover/caprover
synced 2026-08-05 23:30:57 +00:00
breaking RegistriesDataStore off
This commit is contained in:
@@ -23,8 +23,6 @@ class AppsDataStore {
|
||||
this.namepace = namepace;
|
||||
}
|
||||
setEncryptor(encryptor) {
|
||||
if (this.encryptor)
|
||||
return;
|
||||
this.encryptor = encryptor;
|
||||
}
|
||||
saveApp(appName, app) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -3,12 +3,11 @@
|
||||
* Created by kasra on 27/06/17.
|
||||
*/
|
||||
const Configstore = require("configstore");
|
||||
const uuid = require("uuid/v4");
|
||||
const fs = require("fs-extra");
|
||||
const ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
const CaptainConstants = require("../utils/CaptainConstants");
|
||||
const Encryptor = require("../utils/Encryptor");
|
||||
const AppsDataStore = require("./AppsDataStore");
|
||||
const RegistriesDataStore = require("./RegistriesDataStore");
|
||||
const NAMESPACE = 'namespace';
|
||||
const HASHED_PASSWORD = 'hashedPassword';
|
||||
const CUSTOM_DOMAIN = 'customDomain';
|
||||
@@ -16,8 +15,6 @@ const HAS_ROOT_SSL = 'hasRootSsl';
|
||||
const FORCE_ROOT_SSL = 'forceRootSsl';
|
||||
const HAS_REGISTRY_SSL = 'hasRegistrySsl';
|
||||
const EMAIL_ADDRESS = 'emailAddress';
|
||||
const DOCKER_REGISTRIES = 'dockerRegistries';
|
||||
const DEFAULT_DOCKER_REGISTRY_ID = 'defaultDockerRegId';
|
||||
const NET_DATA_INFO = 'netDataInfo';
|
||||
const NGINX_BASE_CONFIG = 'NGINX_BASE_CONFIG';
|
||||
const NGINX_CAPTAIN_CONFIG = 'NGINX_CAPTAIN_CONFIG';
|
||||
@@ -39,10 +36,12 @@ class DataStore {
|
||||
this.namespace = namespace;
|
||||
this.data.set(NAMESPACE, namespace);
|
||||
this.appsDataStore = new AppsDataStore(this.data, namespace);
|
||||
this.registriesDataStore = new RegistriesDataStore(this.data, namespace);
|
||||
}
|
||||
setEncryptionSalt(salt) {
|
||||
this.encryptor = new Encryptor.CaptainEncryptor(this.namespace + salt);
|
||||
this.appsDataStore.setEncryptor(this.encryptor);
|
||||
this.registriesDataStore.setEncryptor(this.encryptor);
|
||||
}
|
||||
getNameSpace() {
|
||||
return this.data.get(NAMESPACE);
|
||||
@@ -143,170 +142,8 @@ class DataStore {
|
||||
getAppsDataStore() {
|
||||
return this.appsDataStore;
|
||||
}
|
||||
getDefaultPushRegistryId() {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.data.get(DEFAULT_DOCKER_REGISTRY_ID);
|
||||
});
|
||||
}
|
||||
setDefaultPushRegistryId(registryId) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let found = false;
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i];
|
||||
if (registry.id === registryId) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
// registryId can be NULL/Empty, meaning that no registry will be the default push registry
|
||||
if (!found && !!registryId) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry not found');
|
||||
}
|
||||
self.data.set(DEFAULT_DOCKER_REGISTRY_ID, registryId);
|
||||
});
|
||||
}
|
||||
deleteRegistry(registryId) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!registryId)
|
||||
throw new Error('Empty registry id to delete!');
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
const newReg = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i];
|
||||
if (registry.id !== registryId) {
|
||||
newReg.push(registry);
|
||||
}
|
||||
}
|
||||
if (newReg.length === registries.length) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry not found');
|
||||
}
|
||||
self.saveAllRegistries(newReg);
|
||||
});
|
||||
}
|
||||
getAllRegistries() {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
return self.data.get(DOCKER_REGISTRIES) || [];
|
||||
})
|
||||
.then(function (registries) {
|
||||
const unencryptedList = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i];
|
||||
unencryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPassword: self.encryptor.decrypt(element.registryPasswordEncrypted),
|
||||
registryType: element.registryType,
|
||||
});
|
||||
}
|
||||
return unencryptedList;
|
||||
});
|
||||
}
|
||||
updateRegistry(id, registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!id ||
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.ILLEGAL_PARAMETER, 'User, password and domain are required.');
|
||||
}
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let found = false;
|
||||
for (let idx = 0; idx < registries.length; idx++) {
|
||||
const element = registries[idx];
|
||||
if (element.id === id) {
|
||||
element.registryUser = registryUser;
|
||||
element.registryPassword = registryPassword;
|
||||
element.registryDomain = registryDomain;
|
||||
element.registryImagePrefix = registryImagePrefix;
|
||||
element.registryType = registryType;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry ID not found');
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
});
|
||||
return self.saveAllRegistries(registries);
|
||||
});
|
||||
}
|
||||
addRegistryToDb(registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.ILLEGAL_PARAMETER, 'User, password and domain are required.');
|
||||
}
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let id = uuid();
|
||||
let isAlreadyTaken = true;
|
||||
while (isAlreadyTaken) {
|
||||
id = uuid();
|
||||
isAlreadyTaken = false;
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
if (registries[i].id === id) {
|
||||
isAlreadyTaken = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
});
|
||||
return self.saveAllRegistries(registries);
|
||||
});
|
||||
}
|
||||
saveAllRegistries(registries) {
|
||||
const self = this;
|
||||
return Promise.resolve() //
|
||||
.then(function () {
|
||||
const encryptedList = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i];
|
||||
encryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPasswordEncrypted: self.encryptor.encrypt(element.registryPassword),
|
||||
registryType: element.registryType,
|
||||
});
|
||||
}
|
||||
self.data.set(DOCKER_REGISTRIES, encryptedList);
|
||||
});
|
||||
getRegistriesDataStore() {
|
||||
return this.registriesDataStore;
|
||||
}
|
||||
setUserEmailAddress(emailAddress) {
|
||||
const self = this;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,181 @@
|
||||
"use strict";
|
||||
const uuid = require("uuid/v4");
|
||||
const ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
const DOCKER_REGISTRIES = 'dockerRegistries';
|
||||
const DEFAULT_DOCKER_REGISTRY_ID = 'defaultDockerRegId';
|
||||
class RegistriesDataStore {
|
||||
constructor(data, namepace) {
|
||||
this.data = data;
|
||||
this.namepace = namepace;
|
||||
}
|
||||
setEncryptor(encryptor) {
|
||||
this.encryptor = encryptor;
|
||||
}
|
||||
getDefaultPushRegistryId() {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.data.get(DEFAULT_DOCKER_REGISTRY_ID);
|
||||
});
|
||||
}
|
||||
setDefaultPushRegistryId(registryId) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let found = false;
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i];
|
||||
if (registry.id === registryId) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
// registryId can be NULL/Empty, meaning that no registry will be the default push registry
|
||||
if (!found && !!registryId) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry not found');
|
||||
}
|
||||
self.data.set(DEFAULT_DOCKER_REGISTRY_ID, registryId);
|
||||
});
|
||||
}
|
||||
deleteRegistry(registryId) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!registryId)
|
||||
throw new Error('Empty registry id to delete!');
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
const newReg = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i];
|
||||
if (registry.id !== registryId) {
|
||||
newReg.push(registry);
|
||||
}
|
||||
}
|
||||
if (newReg.length === registries.length) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry not found');
|
||||
}
|
||||
self.saveAllRegistries(newReg);
|
||||
});
|
||||
}
|
||||
getAllRegistries() {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
return self.data.get(DOCKER_REGISTRIES) || [];
|
||||
})
|
||||
.then(function (registries) {
|
||||
const unencryptedList = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i];
|
||||
unencryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPassword: self.encryptor.decrypt(element.registryPasswordEncrypted),
|
||||
registryType: element.registryType,
|
||||
});
|
||||
}
|
||||
return unencryptedList;
|
||||
});
|
||||
}
|
||||
updateRegistry(id, registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!id ||
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.ILLEGAL_PARAMETER, 'User, password and domain are required.');
|
||||
}
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let found = false;
|
||||
for (let idx = 0; idx < registries.length; idx++) {
|
||||
const element = registries[idx];
|
||||
if (element.id === id) {
|
||||
element.registryUser = registryUser;
|
||||
element.registryPassword = registryPassword;
|
||||
element.registryDomain = registryDomain;
|
||||
element.registryImagePrefix = registryImagePrefix;
|
||||
element.registryType = registryType;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.NOT_FOUND, 'Registry ID not found');
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
});
|
||||
return self.saveAllRegistries(registries);
|
||||
});
|
||||
}
|
||||
addRegistryToDb(registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve()
|
||||
.then(function () {
|
||||
if (!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.ILLEGAL_PARAMETER, 'User, password and domain are required.');
|
||||
}
|
||||
return self.getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let id = uuid();
|
||||
let isAlreadyTaken = true;
|
||||
while (isAlreadyTaken) {
|
||||
id = uuid();
|
||||
isAlreadyTaken = false;
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
if (registries[i].id === id) {
|
||||
isAlreadyTaken = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
});
|
||||
return self.saveAllRegistries(registries);
|
||||
});
|
||||
}
|
||||
saveAllRegistries(registries) {
|
||||
const self = this;
|
||||
return Promise.resolve() //
|
||||
.then(function () {
|
||||
const encryptedList = [];
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i];
|
||||
encryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPasswordEncrypted: self.encryptor.encrypt(element.registryPassword),
|
||||
registryType: element.registryType,
|
||||
});
|
||||
}
|
||||
self.data.set(DOCKER_REGISTRIES, encryptedList);
|
||||
});
|
||||
}
|
||||
}
|
||||
module.exports = RegistriesDataStore;
|
||||
//# sourceMappingURL=RegistriesDataStore.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -127,7 +127,7 @@ class CaptainManager {
|
||||
return certbotManager.init(myNodeId);
|
||||
})
|
||||
.then(function () {
|
||||
return dataStore.getAllRegistries();
|
||||
return dataStore.getRegistriesDataStore().getAllRegistries();
|
||||
})
|
||||
.then(function (registries) {
|
||||
let localRegistry = undefined;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -4,9 +4,8 @@ const Logger = require("../utils/Logger");
|
||||
const CaptainConstants = require("../utils/CaptainConstants");
|
||||
class DockerRegistryHelper {
|
||||
constructor(dataStore, dockerApi) {
|
||||
this.dataStore = dataStore;
|
||||
this.dockerApi = dockerApi;
|
||||
//
|
||||
this.registriesDataStore = dataStore.getRegistriesDataStore();
|
||||
}
|
||||
retagAndPushIfDefaultPushExist(imageName, version, buildLogs) {
|
||||
const self = this;
|
||||
@@ -94,13 +93,13 @@ class DockerRegistryHelper {
|
||||
setDefaultPushRegistry(registryId) {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.dataStore.setDefaultPushRegistryId(registryId);
|
||||
return self.registriesDataStore.setDefaultPushRegistryId(registryId);
|
||||
});
|
||||
}
|
||||
getDefaultPushRegistryId() {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.dataStore.getDefaultPushRegistryId();
|
||||
return self.registriesDataStore.getDefaultPushRegistryId();
|
||||
});
|
||||
}
|
||||
deleteRegistry(registryId) {
|
||||
@@ -113,25 +112,25 @@ class DockerRegistryHelper {
|
||||
if (registryId === registryIdDefaultPush) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.ILLEGAL_PARAMETER, 'Cannot remove the default push');
|
||||
}
|
||||
return self.dataStore.deleteRegistry(registryId);
|
||||
return self.registriesDataStore.deleteRegistry(registryId);
|
||||
});
|
||||
}
|
||||
getAllRegistries() {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.dataStore.getAllRegistries();
|
||||
return self.registriesDataStore.getAllRegistries();
|
||||
});
|
||||
}
|
||||
addRegistry(registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.dataStore.addRegistryToDb(registryUser, registryPassword, registryDomain, registryImagePrefix, registryType);
|
||||
return self.registriesDataStore.addRegistryToDb(registryUser, registryPassword, registryDomain, registryImagePrefix, registryType);
|
||||
});
|
||||
}
|
||||
updateRegistry(id, registryUser, registryPassword, registryDomain, registryImagePrefix, registryType) {
|
||||
const self = this;
|
||||
return Promise.resolve().then(function () {
|
||||
return self.dataStore.updateRegistry(id, registryUser, registryPassword, registryDomain, registryImagePrefix, registryType);
|
||||
return self.registriesDataStore.updateRegistry(id, registryUser, registryPassword, registryDomain, registryImagePrefix, registryType);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"DockerRegistryHelper.js","sourceRoot":"","sources":["../../src/user/DockerRegistryHelper.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"DockerRegistryHelper.js","sourceRoot":"","sources":["../../src/user/DockerRegistryHelper.ts"],"names":[],"mappings":"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"}
|
||||
@@ -31,8 +31,6 @@ class AppsDataStore {
|
||||
constructor(private data: configstore, private namepace: string) {}
|
||||
|
||||
setEncryptor(encryptor: CaptainEncryptor) {
|
||||
if (this.encryptor) return
|
||||
|
||||
this.encryptor = encryptor
|
||||
}
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
* Created by kasra on 27/06/17.
|
||||
*/
|
||||
import Configstore = require('configstore')
|
||||
import uuid = require('uuid/v4')
|
||||
import fs = require('fs-extra')
|
||||
import ApiStatusCodes = require('../api/ApiStatusCodes')
|
||||
import CaptainConstants = require('../utils/CaptainConstants')
|
||||
import Logger = require('../utils/Logger')
|
||||
import Encryptor = require('../utils/Encryptor')
|
||||
import AppsDataStore = require('./AppsDataStore')
|
||||
import RegistriesDataStore = require('./RegistriesDataStore')
|
||||
|
||||
const NAMESPACE = 'namespace'
|
||||
const HASHED_PASSWORD = 'hashedPassword'
|
||||
@@ -17,8 +17,6 @@ const HAS_ROOT_SSL = 'hasRootSsl'
|
||||
const FORCE_ROOT_SSL = 'forceRootSsl'
|
||||
const HAS_REGISTRY_SSL = 'hasRegistrySsl'
|
||||
const EMAIL_ADDRESS = 'emailAddress'
|
||||
const DOCKER_REGISTRIES = 'dockerRegistries'
|
||||
const DEFAULT_DOCKER_REGISTRY_ID = 'defaultDockerRegId'
|
||||
const NET_DATA_INFO = 'netDataInfo'
|
||||
const NGINX_BASE_CONFIG = 'NGINX_BASE_CONFIG'
|
||||
const NGINX_CAPTAIN_CONFIG = 'NGINX_CAPTAIN_CONFIG'
|
||||
@@ -39,6 +37,7 @@ class DataStore {
|
||||
private namespace: string
|
||||
private data: Configstore
|
||||
private appsDataStore: AppsDataStore
|
||||
private registriesDataStore: RegistriesDataStore
|
||||
|
||||
constructor(namespace: string) {
|
||||
const data = new Configstore('captain-store', {})
|
||||
@@ -48,10 +47,13 @@ class DataStore {
|
||||
this.namespace = namespace
|
||||
this.data.set(NAMESPACE, namespace)
|
||||
this.appsDataStore = new AppsDataStore(this.data, namespace)
|
||||
this.registriesDataStore = new RegistriesDataStore(this.data, namespace)
|
||||
}
|
||||
|
||||
setEncryptionSalt(salt: string) {
|
||||
this.encryptor = new Encryptor.CaptainEncryptor(this.namespace + salt)
|
||||
this.appsDataStore.setEncryptor(this.encryptor)
|
||||
this.registriesDataStore.setEncryptor(this.encryptor)
|
||||
}
|
||||
|
||||
getNameSpace(): string {
|
||||
@@ -174,231 +176,8 @@ class DataStore {
|
||||
return this.appsDataStore
|
||||
}
|
||||
|
||||
getDefaultPushRegistryId(): Promise<string | undefined> {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve().then(function() {
|
||||
return self.data.get(DEFAULT_DOCKER_REGISTRY_ID)
|
||||
})
|
||||
}
|
||||
|
||||
setDefaultPushRegistryId(registryId: string) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let found = false
|
||||
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i]
|
||||
if (registry.id === registryId) {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
// registryId can be NULL/Empty, meaning that no registry will be the default push registry
|
||||
if (!found && !!registryId) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry not found'
|
||||
)
|
||||
}
|
||||
|
||||
self.data.set(DEFAULT_DOCKER_REGISTRY_ID, registryId)
|
||||
})
|
||||
}
|
||||
|
||||
deleteRegistry(registryId: string) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (!registryId) throw new Error('Empty registry id to delete!')
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
const newReg = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i]
|
||||
if (registry.id !== registryId) {
|
||||
newReg.push(registry)
|
||||
}
|
||||
}
|
||||
|
||||
if (newReg.length === registries.length) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry not found'
|
||||
)
|
||||
}
|
||||
|
||||
self.saveAllRegistries(newReg)
|
||||
})
|
||||
}
|
||||
|
||||
getAllRegistries() {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
return self.data.get(DOCKER_REGISTRIES) || []
|
||||
})
|
||||
.then(function(registries: IRegistryInfoEncrypted[]) {
|
||||
const unencryptedList: IRegistryInfo[] = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i]
|
||||
unencryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPassword: self.encryptor.decrypt(
|
||||
element.registryPasswordEncrypted
|
||||
),
|
||||
registryType: element.registryType,
|
||||
})
|
||||
}
|
||||
return unencryptedList
|
||||
})
|
||||
}
|
||||
|
||||
updateRegistry(
|
||||
id: string,
|
||||
registryUser: string,
|
||||
registryPassword: string,
|
||||
registryDomain: string,
|
||||
registryImagePrefix: string,
|
||||
registryType: IRegistryType
|
||||
) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (
|
||||
!id ||
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType
|
||||
) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.ILLEGAL_PARAMETER,
|
||||
'User, password and domain are required.'
|
||||
)
|
||||
}
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let found = false
|
||||
for (let idx = 0; idx < registries.length; idx++) {
|
||||
const element = registries[idx]
|
||||
if (element.id === id) {
|
||||
element.registryUser = registryUser
|
||||
element.registryPassword = registryPassword
|
||||
element.registryDomain = registryDomain
|
||||
element.registryImagePrefix = registryImagePrefix
|
||||
element.registryType = registryType
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry ID not found'
|
||||
)
|
||||
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
})
|
||||
|
||||
return self.saveAllRegistries(registries)
|
||||
})
|
||||
}
|
||||
|
||||
addRegistryToDb(
|
||||
registryUser: string,
|
||||
registryPassword: string,
|
||||
registryDomain: string,
|
||||
registryImagePrefix: string,
|
||||
registryType: IRegistryType
|
||||
) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType
|
||||
) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.ILLEGAL_PARAMETER,
|
||||
'User, password and domain are required.'
|
||||
)
|
||||
}
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let id: string = uuid()
|
||||
let isAlreadyTaken = true
|
||||
|
||||
while (isAlreadyTaken) {
|
||||
id = uuid()
|
||||
isAlreadyTaken = false
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
if (registries[i].id === id) {
|
||||
isAlreadyTaken = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
})
|
||||
|
||||
return self.saveAllRegistries(registries)
|
||||
})
|
||||
}
|
||||
|
||||
private saveAllRegistries(registries: IRegistryInfo[]) {
|
||||
const self = this
|
||||
return Promise.resolve() //
|
||||
.then(function() {
|
||||
const encryptedList: IRegistryInfoEncrypted[] = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i]
|
||||
encryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPasswordEncrypted: self.encryptor.encrypt(
|
||||
element.registryPassword
|
||||
),
|
||||
registryType: element.registryType,
|
||||
})
|
||||
}
|
||||
self.data.set(DOCKER_REGISTRIES, encryptedList)
|
||||
})
|
||||
getRegistriesDataStore() {
|
||||
return this.registriesDataStore
|
||||
}
|
||||
|
||||
setUserEmailAddress(emailAddress: string) {
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
import { CaptainEncryptor } from "../utils/Encryptor";
|
||||
import configstore = require('configstore')
|
||||
import uuid = require('uuid/v4')
|
||||
import ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
|
||||
const DOCKER_REGISTRIES = 'dockerRegistries'
|
||||
const DEFAULT_DOCKER_REGISTRY_ID = 'defaultDockerRegId'
|
||||
|
||||
class RegistriesDataStore{
|
||||
|
||||
private encryptor: CaptainEncryptor
|
||||
|
||||
constructor(private data: configstore, private namepace: string) {}
|
||||
|
||||
setEncryptor(encryptor: CaptainEncryptor) {
|
||||
this.encryptor = encryptor
|
||||
}
|
||||
|
||||
getDefaultPushRegistryId(): Promise<string | undefined> {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve().then(function() {
|
||||
return self.data.get(DEFAULT_DOCKER_REGISTRY_ID)
|
||||
})
|
||||
}
|
||||
|
||||
setDefaultPushRegistryId(registryId: string) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let found = false
|
||||
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i]
|
||||
if (registry.id === registryId) {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
// registryId can be NULL/Empty, meaning that no registry will be the default push registry
|
||||
if (!found && !!registryId) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry not found'
|
||||
)
|
||||
}
|
||||
|
||||
self.data.set(DEFAULT_DOCKER_REGISTRY_ID, registryId)
|
||||
})
|
||||
}
|
||||
|
||||
deleteRegistry(registryId: string) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (!registryId) throw new Error('Empty registry id to delete!')
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
const newReg = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const registry = registries[i]
|
||||
if (registry.id !== registryId) {
|
||||
newReg.push(registry)
|
||||
}
|
||||
}
|
||||
|
||||
if (newReg.length === registries.length) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry not found'
|
||||
)
|
||||
}
|
||||
|
||||
self.saveAllRegistries(newReg)
|
||||
})
|
||||
}
|
||||
|
||||
getAllRegistries() {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
return self.data.get(DOCKER_REGISTRIES) || []
|
||||
})
|
||||
.then(function(registries: IRegistryInfoEncrypted[]) {
|
||||
const unencryptedList: IRegistryInfo[] = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i]
|
||||
unencryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPassword: self.encryptor.decrypt(
|
||||
element.registryPasswordEncrypted
|
||||
),
|
||||
registryType: element.registryType,
|
||||
})
|
||||
}
|
||||
return unencryptedList
|
||||
})
|
||||
}
|
||||
|
||||
updateRegistry(
|
||||
id: string,
|
||||
registryUser: string,
|
||||
registryPassword: string,
|
||||
registryDomain: string,
|
||||
registryImagePrefix: string,
|
||||
registryType: IRegistryType
|
||||
) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (
|
||||
!id ||
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType
|
||||
) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.ILLEGAL_PARAMETER,
|
||||
'User, password and domain are required.'
|
||||
)
|
||||
}
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let found = false
|
||||
for (let idx = 0; idx < registries.length; idx++) {
|
||||
const element = registries[idx]
|
||||
if (element.id === id) {
|
||||
element.registryUser = registryUser
|
||||
element.registryPassword = registryPassword
|
||||
element.registryDomain = registryDomain
|
||||
element.registryImagePrefix = registryImagePrefix
|
||||
element.registryType = registryType
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.NOT_FOUND,
|
||||
'Registry ID not found'
|
||||
)
|
||||
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
})
|
||||
|
||||
return self.saveAllRegistries(registries)
|
||||
})
|
||||
}
|
||||
|
||||
addRegistryToDb(
|
||||
registryUser: string,
|
||||
registryPassword: string,
|
||||
registryDomain: string,
|
||||
registryImagePrefix: string,
|
||||
registryType: IRegistryType
|
||||
) {
|
||||
const self = this
|
||||
|
||||
return Promise.resolve()
|
||||
.then(function() {
|
||||
if (
|
||||
!registryUser ||
|
||||
!registryPassword ||
|
||||
!registryDomain ||
|
||||
!registryType
|
||||
) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.ILLEGAL_PARAMETER,
|
||||
'User, password and domain are required.'
|
||||
)
|
||||
}
|
||||
|
||||
return self.getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let id: string = uuid()
|
||||
let isAlreadyTaken = true
|
||||
|
||||
while (isAlreadyTaken) {
|
||||
id = uuid()
|
||||
isAlreadyTaken = false
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
if (registries[i].id === id) {
|
||||
isAlreadyTaken = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registries.push({
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
registryImagePrefix,
|
||||
registryType,
|
||||
})
|
||||
|
||||
return self.saveAllRegistries(registries)
|
||||
})
|
||||
}
|
||||
|
||||
private saveAllRegistries(registries: IRegistryInfo[]) {
|
||||
const self = this
|
||||
return Promise.resolve() //
|
||||
.then(function() {
|
||||
const encryptedList: IRegistryInfoEncrypted[] = []
|
||||
for (let i = 0; i < registries.length; i++) {
|
||||
const element = registries[i]
|
||||
encryptedList.push({
|
||||
id: element.id,
|
||||
registryDomain: element.registryDomain,
|
||||
registryImagePrefix: element.registryImagePrefix,
|
||||
registryUser: element.registryUser,
|
||||
registryPasswordEncrypted: self.encryptor.encrypt(
|
||||
element.registryPassword
|
||||
),
|
||||
registryType: element.registryType,
|
||||
})
|
||||
}
|
||||
self.data.set(DOCKER_REGISTRIES, encryptedList)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export = RegistriesDataStore
|
||||
@@ -195,7 +195,7 @@ class CaptainManager {
|
||||
return certbotManager.init(myNodeId)
|
||||
})
|
||||
.then(function() {
|
||||
return dataStore.getAllRegistries()
|
||||
return dataStore.getRegistriesDataStore().getAllRegistries()
|
||||
})
|
||||
.then(function(registries) {
|
||||
let localRegistry: IRegistryInfo | undefined = undefined
|
||||
|
||||
@@ -5,10 +5,12 @@ import CaptainConstants = require('../utils/CaptainConstants')
|
||||
import DockerApi = require('../docker/DockerApi')
|
||||
import BuildLog = require('./BuildLog')
|
||||
import { AnyError } from '../models/OtherTypes'
|
||||
import RegistriesDataStore = require('../datastore/RegistriesDataStore')
|
||||
|
||||
class DockerRegistryHelper {
|
||||
constructor(private dataStore: DataStore, private dockerApi: DockerApi) {
|
||||
//
|
||||
private registriesDataStore: RegistriesDataStore
|
||||
constructor(dataStore: DataStore, private dockerApi: DockerApi) {
|
||||
this.registriesDataStore = dataStore.getRegistriesDataStore()
|
||||
}
|
||||
|
||||
retagAndPushIfDefaultPushExist(
|
||||
@@ -122,14 +124,14 @@ class DockerRegistryHelper {
|
||||
setDefaultPushRegistry(registryId: string) {
|
||||
const self = this
|
||||
return Promise.resolve().then(function() {
|
||||
return self.dataStore.setDefaultPushRegistryId(registryId)
|
||||
return self.registriesDataStore.setDefaultPushRegistryId(registryId)
|
||||
})
|
||||
}
|
||||
|
||||
getDefaultPushRegistryId() {
|
||||
const self = this
|
||||
return Promise.resolve().then(function() {
|
||||
return self.dataStore.getDefaultPushRegistryId()
|
||||
return self.registriesDataStore.getDefaultPushRegistryId()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -147,14 +149,14 @@ class DockerRegistryHelper {
|
||||
)
|
||||
}
|
||||
|
||||
return self.dataStore.deleteRegistry(registryId)
|
||||
return self.registriesDataStore.deleteRegistry(registryId)
|
||||
})
|
||||
}
|
||||
|
||||
getAllRegistries() {
|
||||
const self = this
|
||||
return Promise.resolve().then(function() {
|
||||
return self.dataStore.getAllRegistries()
|
||||
return self.registriesDataStore.getAllRegistries()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -167,7 +169,7 @@ class DockerRegistryHelper {
|
||||
) {
|
||||
const self = this
|
||||
return Promise.resolve().then(function() {
|
||||
return self.dataStore.addRegistryToDb(
|
||||
return self.registriesDataStore.addRegistryToDb(
|
||||
registryUser,
|
||||
registryPassword,
|
||||
registryDomain,
|
||||
@@ -187,8 +189,7 @@ class DockerRegistryHelper {
|
||||
) {
|
||||
const self = this
|
||||
return Promise.resolve().then(function() {
|
||||
|
||||
return self.dataStore.updateRegistry(
|
||||
return self.registriesDataStore.updateRegistry(
|
||||
id,
|
||||
registryUser,
|
||||
registryPassword,
|
||||
|
||||
Reference in New Issue
Block a user