breaking RegistriesDataStore off

This commit is contained in:
Kasra Bigdeli
2018-12-02 15:30:31 -08:00
parent f5ca018247
commit 3a89b30ba2
15 changed files with 466 additions and 423 deletions
@@ -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
+5 -168
View File
@@ -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
+1 -1
View File
@@ -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
}
+7 -228
View File
@@ -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
+1 -1
View File
@@ -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
+10 -9
View File
@@ -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,