Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Scott committed Nov 1, 2021
1 parent c1c0f10 commit 7f46a63
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 18 deletions.
5 changes: 3 additions & 2 deletions src/agent/agentService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ function createAgentService({
vaultId = makeVaultId(idUtils.fromString(vaultNameOrId));
vaultName = await vaultManager.getVaultName(vaultId);
} catch (err) {
throw new vaultsErrors.ErrorVaultUndefined();
await genWritable.throw(new vaultsErrors.ErrorVaultUndefined());
return;
}
} else {
vaultName = vaultNameOrId;
Expand Down Expand Up @@ -141,7 +142,7 @@ function createAgentService({
try {
vaultId = makeVaultId(vaultNameOrId);
} catch (err) {
throw new vaultsErrors.ErrorVaultUndefined();
return;
}
}
await vaultManager.openVault(vaultId);
Expand Down
32 changes: 19 additions & 13 deletions src/vaults/VaultInternal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class VaultInternal {
const dir = path.join(vaultsUtils.makeVaultIdPretty(vaultId), 'contents');
const gitdir = path.join(vaultsUtils.makeVaultIdPretty(vaultId), '.git');
if (fresh) {
logger.info(
`Initialising Vault '${vaultsUtils.makeVaultIdPretty(vaultId)}'`,
);
try {
await efs.rmdir(vaultsUtils.makeVaultIdPretty(vaultId), {
recursive: true,
Expand Down Expand Up @@ -92,12 +95,9 @@ class VaultInternal {
workingDir,
logger,
});
logger.info(
`Initialising vault at '${vaultsUtils.makeVaultIdPretty(vaultId)}'`,
);
return vault;
} else {
// Loading an existing vault.
logger.info(`Starting Vault '${vaultsUtils.makeVaultIdPretty(vaultId)}'`);
const efsVault = await efs.chroot(dir);
await efsVault.start();
const workingDir = (await efs.readFile(path.join(gitdir, 'workingDir'), {
Expand All @@ -111,9 +111,6 @@ class VaultInternal {
workingDir,
logger,
});
logger.info(
`Starting vault at '${vaultsUtils.makeVaultIdPretty(vaultId)}'`,
);
return vault;
}
}
Expand Down Expand Up @@ -149,6 +146,9 @@ class VaultInternal {

public async destroy(): Promise<void> {
const release = await this.lock.acquire();
this.logger.info(
`Destroying Vault '${vaultsUtils.makeVaultIdPretty(this.vaultId)}'`,
);
try {
await this.efsRoot.writeFile(
path.join(
Expand All @@ -161,9 +161,6 @@ class VaultInternal {
} finally {
release();
}
this.logger.info(
`Destroying vault at '${vaultsUtils.makeVaultIdPretty(this.vaultId)}'`,
);
}

@ready(new vaultsErrors.ErrorVaultDestroyed())
Expand Down Expand Up @@ -230,6 +227,11 @@ class VaultInternal {
}
}
if (message.length !== 0) {
this.logger.info(
`Committing to Vault '${vaultsUtils.makeVaultIdPretty(
this.vaultId,
)}'`,
);
this.workingDir = await git.commit({
fs: this.efsRoot,
dir: this.baseDir,
Expand Down Expand Up @@ -299,19 +301,23 @@ class VaultInternal {
return {
oid: readCommit.oid,
committer: readCommit.commit.committer.name,
timeStamp: readCommit.commit.committer.timestamp * 1000, // Needs to be in milliseconds for Date.
// Needs to be in milliseconds for Date
timeStamp: readCommit.commit.committer.timestamp * 1000,
message: readCommit.commit.message,
};
});
}

@ready(new vaultsErrors.ErrorVaultDestroyed())
public async version(commit: string): Promise<void> {
// Checking for special tags.
// Checking for special tags
const commit_ = commit.toLowerCase() === lastTag ? 'HEAD' : commit;
// TODO: add a tag for the start of the histoy so we can use that as the operator.
// TODO: add a tag for the start of the histoy so we can use that as the operator

try {
this.logger.info(
`Checking out Vault '${vaultsUtils.makeVaultIdPretty(this.vaultId)}'`,
);
await git.checkout({
fs: this.efsRoot,
dir: this.baseDir,
Expand Down
61 changes: 61 additions & 0 deletions src/vaults/VaultManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,9 @@ class VaultManager {
const lock = new Mutex();
this.vaultsMap.set(idUtils.toString(vaultId), { lock });
return await this._transaction(async () => {
this.logger.info(
`Storing metadata for Vault ${vaultsUtils.makeVaultIdPretty(vaultId)}`,
);
await this.db.put(this.vaultsNamesDbDomain, idUtils.toBuffer(vaultId), {
name: vaultName,
});
Expand All @@ -243,6 +246,9 @@ class VaultManager {

@ready(new vaultsErrors.ErrorVaultManagerDestroyed())
public async destroyVault(vaultId: VaultId) {
this.logger.info(
`Destroying Vault ${vaultsUtils.makeVaultIdPretty(vaultId)}`,
);
await this._transaction(async () => {
const vaultName = await this.getVaultName(vaultId);
if (!vaultName) return;
Expand Down Expand Up @@ -287,6 +293,9 @@ class VaultManager {
vaultId: VaultId,
newVaultName: VaultName,
): Promise<void> {
this.logger.info(
`Renaming Vault ${vaultsUtils.makeVaultIdPretty(vaultId)}`,
);
await this._transaction(async () => {
const meta = await this.db.get<POJO>(
this.vaultsNamesDbDomain,
Expand Down Expand Up @@ -363,6 +372,11 @@ class VaultManager {
const vaultId = await this.generateVaultId();
const lock = new Mutex();
this.vaultsMap.set(idUtils.toString(vaultId), { lock });
this.logger.info(
`Cloning Vault ${vaultsUtils.makeVaultIdPretty(
vaultId,
)} on Node ${nodeId}`,
);
return await this._transaction(async () => {
await this.efs.mkdir(
path.join(vaultsUtils.makeVaultIdPretty(vaultId), 'contents'),
Expand Down Expand Up @@ -405,13 +419,27 @@ class VaultManager {
}
});
// The polykey error is caught and the error flag set
// If there was an error, we return an empty generator so
// isomorphic git does not complain about an undefined res body
try {
for await (const resp of response) {
yield resp.getChunk_asU8();
}
} catch (err) {
error = err;
throw err;
} finally {
if (error) {
// eslint-disable-next-line
return {
url: url,
method: method,
body: [],
headers: headers,
statusCode: 400,
statusMessage: 'Server Error',
};
}
}
},
};
Expand Down Expand Up @@ -513,6 +541,11 @@ class VaultManager {
defaultPullNode: nodeId,
defaultPullVault: idUtils.toString(remoteVaultId),
});
this.logger.info(
`Cloned Vault ${vaultsUtils.makeVaultIdPretty(
vaultId,
)} on Node ${nodeId}`,
);
return vault;
}, [vaultId]);
}
Expand Down Expand Up @@ -557,6 +590,13 @@ class VaultManager {
vaultMeta.defaultPullVault = idUtils.toString(pullVaultNameOrId);
}
}
this.logger.info(
`Pulling Vault ${vaultsUtils.makeVaultIdPretty(
pullVaultNameOrId,
)} on Node ${pullNodeId} into Vault ${vaultsUtils.makeVaultIdPretty(
vaultId,
)}`,
);
const nodeConnection = await this.nodeManager.getConnectionToNode(
pullNodeId!,
);
Expand Down Expand Up @@ -594,13 +634,27 @@ class VaultManager {
}
});
// The polykey error is caught and the error flag set
// If there was an error, we return an empty generator so
// isomorphic git does not complain about an undefined res body
try {
for await (const resp of response) {
yield resp.getChunk_asU8();
}
} catch (err) {
error = err;
throw err;
} finally {
if (error) {
// eslint-disable-next-line
return {
url: url,
method: method,
body: [],
headers: headers,
statusCode: 400,
statusMessage: 'Server Error',
};
}
}
},
};
Expand Down Expand Up @@ -689,6 +743,13 @@ class VaultManager {
}
const vault = await this.getVault(vaultId);
await vault.readWorkingDirectory();
this.logger.info(
`Pulling Vault ${vaultsUtils.makeVaultIdPretty(
pullVaultNameOrId,
)} on Node ${pullNodeId} into Vault ${vaultsUtils.makeVaultIdPretty(
vaultId,
)}`,
);
return vault;
}, [vaultId]);
}
Expand Down
9 changes: 6 additions & 3 deletions tests/vaults/VaultManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import os from 'os';
import path from 'path';
import fs from 'fs';
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
import { utils as idUtils } from '@matrixai/id';

import { KeyManager } from '@/keys';
import { NodeManager } from '@/nodes';
Expand All @@ -24,7 +25,6 @@ import { IAgentServer } from '@/proto/js/Agent_grpc_pb';
import { errors as vaultErrors } from '@/vaults';
import { makeCrypto } from '../utils';
import { makeVaultId } from '@/vaults/utils';
import { utils as idUtils } from '@matrixai/id';

describe('VaultManager', () => {
const password = 'password';
Expand Down Expand Up @@ -776,6 +776,9 @@ describe('VaultManager', () => {
firstVault.vaultId,
nodeManager.getNodeId(),
);
await expect(() =>
vaultManager.cloneVault(targetNodeId, 'not-existing' as VaultName),
).rejects.toThrow(vaultErrors.ErrorVaultUndefined);
await vaultManager.cloneVault(targetNodeId, vaultName);
const vaultId = await vaultManager.getVaultId(vaultName);
const vaultClone = await vaultManager.openVault(vaultId!);
Expand Down Expand Up @@ -837,7 +840,7 @@ describe('VaultManager', () => {
names.sort(),
);
},
global.defaultTimeout * 3,
global.defaultTimeout * 4,
);
test(
'reject cloning and pulling when permissions are not set',
Expand Down Expand Up @@ -994,7 +997,7 @@ describe('VaultManager', () => {
names.sort(),
);
},
global.defaultTimeout * 3,
global.defaultTimeout * 5,
);
test(
'manage pulling from different remotes',
Expand Down

0 comments on commit 7f46a63

Please sign in to comment.