Skip to content
This repository was archived by the owner on Nov 23, 2022. It is now read-only.

Commit 27174e8

Browse files
committed
Merge branch 'develop', prepare 5.0.3
2 parents 837ab47 + ebc96cb commit 27174e8

File tree

5 files changed

+47
-16
lines changed

5 files changed

+47
-16
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,6 @@ dist/
88
bin/server-core.js
99
bin/runner.js
1010
bin/home.html
11+
12+
.idea/
13+
package-lock.json

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "exoframe-server",
3-
"version": "5.0.2",
3+
"version": "5.0.3-dev",
44
"description": "Exoframe is a self-hosted tool that allows simple one-command deployments using Docker",
55
"main": "bin/server-core.js",
66
"bin": "bin/exoframe-server.js",

src/routes/deploy.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,16 @@ module.exports = fastify => {
175175
const resultStream = _();
176176
// deploy new versions
177177
deploy({username, folder, payload: request.payload, resultStream});
178-
// schedule cleanup
179-
scheduleCleanup({username, project, existing});
180178
// reply with deploy stream
181179
const responseStream = new Readable().wrap(resultStream);
182180
reply.code(200).send(responseStream);
183-
// schedule temp folder cleanup on end
184-
responseStream.on('end', () => cleanTemp(folder));
181+
// schedule temp folder and container cleanup on deployment end
182+
responseStream.on('end', () => {
183+
// schedule container cleanup
184+
scheduleCleanup({username, project, existing});
185+
// clean temp folder
186+
cleanTemp(folder);
187+
});
185188
},
186189
});
187190
};

src/routes/remove.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,29 @@ const removeUserContainer = async ({username, id, reply}) => {
2020
return;
2121
}
2222

23-
// if not found by name - try to find by project
24-
const containers = allContainers.filter(
23+
// if not found by name - try to find by domain.
24+
const containersByUrl = allContainers.filter(c => {
25+
return c.Labels['exoframe.user'] === username && c.Labels['traefik.frontend.rule'] === 'Host:' + id;
26+
});
27+
28+
if (containersByUrl.length) {
29+
await Promise.all(containersByUrl.map(removeContainer));
30+
reply.code(204).send('removed');
31+
return;
32+
}
33+
34+
// if not found by name and url - try to find by project
35+
const containersByProject = allContainers.filter(
2536
c => c.Labels['exoframe.user'] === username && c.Labels['exoframe.project'] === id
2637
);
27-
if (!containers.length) {
28-
reply.code(404).send({error: 'Container or function not found!'});
38+
39+
if (containersByProject.length) {
40+
await Promise.all(containersByProject.map(removeContainer));
41+
reply.code(204).send('removed');
2942
return;
3043
}
31-
// remove all
32-
await Promise.all(containers.map(removeContainer));
33-
// reply
34-
reply.code(204).send('removed');
44+
45+
reply.code(404).send({error: 'Container or function not found!'});
3546
};
3647

3748
module.exports = fastify => {

test/remove.test.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const projectName = 'rmtestproject';
2727
// fastify ref
2828
let fastify;
2929

30-
const generateContainerConfig = ({name, username, project, baseName}) => ({
30+
const generateContainerConfig = ({name, username, project, baseName, url}) => ({
3131
Image: 'busybox:latest',
3232
Cmd: ['sh', '-c', 'sleep 1000'],
3333
name,
@@ -36,7 +36,7 @@ const generateContainerConfig = ({name, username, project, baseName}) => ({
3636
'exoframe.user': username,
3737
'exoframe.project': project,
3838
'traefik.backend': baseName,
39-
'traefik.frontend.rule': 'Host:test',
39+
'traefik.frontend.rule': 'Host:' + url,
4040
},
4141
});
4242

@@ -57,6 +57,7 @@ beforeAll(async () => {
5757
username: 'admin',
5858
project: 'rmtest1',
5959
baseName: 'exo-admin-rmtest1',
60+
url: 'test',
6061
});
6162
const container = await docker.createContainer(containerConfig);
6263
await container.start();
@@ -67,15 +68,17 @@ beforeAll(async () => {
6768
username: 'admin',
6869
project: projectName,
6970
baseName: 'exo-admin-rmtest2',
71+
url: 'test',
7072
});
7173
const projectContainer1 = await docker.createContainer(prjContainerConfig1);
7274
await projectContainer1.start();
7375
// second project container
7476
const prjContainerConfig2 = generateContainerConfig({
7577
name: 'rmtest3',
7678
username: 'admin',
77-
project: projectName,
79+
project: projectName + '_custom',
7880
baseName: 'exo-admin-rmtest3',
81+
url: 'test.example.com',
7982
});
8083
const projectContainer2 = await docker.createContainer(prjContainerConfig2);
8184
await projectContainer2.start();
@@ -133,3 +136,14 @@ test('Should return error when removing nonexistent project', async done => {
133136
expect(result).toMatchObject({error: 'Container or function not found!'});
134137
done();
135138
});
139+
140+
test('Should remove by url', async done => {
141+
const options = Object.assign({}, baseOptions, {
142+
url: `/remove/test.example.com`,
143+
});
144+
145+
const response = await fastify.inject(options);
146+
147+
expect(response.statusCode).toEqual(204);
148+
done();
149+
});

0 commit comments

Comments
 (0)