Skip to content

Commit 92504d2

Browse files
Izak88jkuri
authored andcommitted
feat(images): removeing docker images
1 parent ebdd61c commit 92504d2

File tree

5 files changed

+109
-2
lines changed

5 files changed

+109
-2
lines changed

src/api/image-builder.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,37 @@ export function buildDockerImage(data: ImageData): void {
8080
});
8181
}
8282

83+
export function deleteImage(data: ImageData): void {
84+
let msg: LogMessageType = {
85+
message: `starting image delete ${data.name}`,
86+
type: 'info',
87+
notify: false
88+
};
89+
logger.next(msg);
90+
91+
try {
92+
docker.getImage(data.name).remove(() => {
93+
const folderPath =
94+
data.base ? getFilePath(`base-images/${data.name}`) : getFilePath(`images/${data.name}`);
95+
fs.remove(folderPath);
96+
97+
msg = {
98+
message: `Image ${data.name} successfully deleted`,
99+
type: 'info',
100+
notify: false
101+
};
102+
logger.next(msg);
103+
});
104+
} catch {
105+
msg = {
106+
message: `error removeing docker image ${data.name}`,
107+
type: 'error',
108+
notify: false
109+
};
110+
logger.next(msg);
111+
}
112+
}
113+
83114
function prepareDirectory(data: ImageData): Promise<void> {
84115
const folderPath =
85116
data.base ? getFilePath(`base-images/${data.name}`) : getFilePath(`images/${data.name}`);

src/api/socket.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
stopBuild,
1515
terminalEvents
1616
} from './process-manager';
17-
import { imageBuilderObs, buildDockerImage } from './image-builder';
17+
import { imageBuilderObs, buildDockerImage, deleteImage } from './image-builder';
1818
import { getConfig } from './utils';
1919
import * as https from 'https';
2020
import * as http from 'http';
@@ -150,6 +150,17 @@ export class SocketServer {
150150
}
151151
break;
152152

153+
case 'deleteImage': {
154+
if (this.clients[clientIndex].username === 'anonymous') {
155+
conn.next({ type: 'error', data: 'not authorized' });
156+
} else {
157+
conn.next({ type: 'request_received' });
158+
const imageData = event.data;
159+
deleteImage(imageData);
160+
}
161+
}
162+
break;
163+
153164
case 'subscribeToImageBuilder': {
154165
if (this.clients[clientIndex].username === 'anonymous') {
155166
conn.next({ type: 'error', data: 'not authorized' });

src/app/components/app-images/app-images.component.html

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,34 @@ <h1>Docker Build Images</h1>
3737
<div *ngIf="tab === 'images'">
3838
<div class="content-box image-builder-box">
3939

40+
<div class="content-box approve" *ngIf="removeingImage">
41+
<div class="columns is-multiline">
42+
<div class="column is-12">
43+
<h1>Warning:</h1>
44+
</div>
45+
<div class="column is-12">
46+
<div class="column is-12">
47+
Are you sure you want to delete image {{form.name}}?
48+
</div>
49+
<div class="column is-12">
50+
This step cannot be revert once delete is performed.
51+
</div>
52+
</div>
53+
<div class="column is-6">
54+
<button class="button is-fullwidth" name="btn-build" type="button" (click)="startDelete()">
55+
<i class="ionicon ion-checkmark"></i>
56+
<span>Delete</span>
57+
</button>
58+
</div>
59+
<div class="column is-6">
60+
<button class="button is-fullwidth" name="btn-cancel" type="button" (click)="removeingImage = false">
61+
<i class="ionicon ion-close"></i>
62+
<span>Cancel</span>
63+
</button>
64+
</div>
65+
</div>
66+
</div>
67+
4068
<div class="columns" *ngIf="!baseImages?.length">
4169
<div class="column is-12">
4270
<div class="message">
@@ -61,6 +89,9 @@ <h1>Base Images</h1>
6189
<div class="columns is-multiline">
6290
<div class="column is-3" *ngFor="let i of baseImages; let index = index;">
6391
<div class="base-image-item">
92+
<div class="remove-image" *ngIf="baseImages.length > 1">
93+
<i class="ionicon ion-close pointer" (click)="removeImage(index, true)"></i>
94+
</div>
6495
<h2>{{ i.name }}</h2>
6596
<span class="version">{{ i.version }}</span>
6697
<img src="/images/logos/docker.svg" class="docker-img">
@@ -79,6 +110,9 @@ <h1>Custom Images</h1>
79110
<div class="columns is-multiline">
80111
<div class="column is-4" *ngFor="let i of customImages; let index = index;">
81112
<div class="image-item">
113+
<div class="remove-image">
114+
<i class="ionicon ion-close pointer" (click)="removeImage(index, false)"></i>
115+
</div>
82116
<h2>{{ i.name }}</h2>
83117
<span class="version">{{ i.version }}</span>
84118
<img src="/images/logos/docker.svg" class="docker-img">

src/app/components/app-images/app-images.component.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export class AppImagesComponent implements OnInit, OnDestroy {
3232
building: boolean;
3333
editingImage: boolean;
3434
success: boolean;
35+
removeingImage: boolean;
3536
baseImages: any[];
3637
baseImage: string;
3738
customImages: any[];
@@ -87,6 +88,7 @@ export class AppImagesComponent implements OnInit, OnDestroy {
8788
this.initEditorOptions = Object.assign({}, this.editorOptions, { language: 'plaintext' });
8889
this.building = false;
8990
this.editingImage = false;
91+
this.removeingImage = false;
9092
this.tab = 'images';
9193

9294
this.resetForm(!!this.baseImages.length);
@@ -234,6 +236,16 @@ export class AppImagesComponent implements OnInit, OnDestroy {
234236

235237
editImage(index: number, base: boolean): void {
236238
this.editingImage = true;
239+
this.updateForm(index, base);
240+
this.tab = 'build';
241+
}
242+
243+
removeImage(index: number, base: boolean): void {
244+
this.removeingImage = true;
245+
this.updateForm(index, base);
246+
}
247+
248+
updateForm(index: number, base: boolean): void {
237249
if (base) {
238250
this.form.name = this.baseImages[index].name;
239251
this.form.dockerfile = this.baseImages[index].dockerfile;
@@ -244,7 +256,6 @@ export class AppImagesComponent implements OnInit, OnDestroy {
244256
this.form.initsh = this.customImages[index].initsh;
245257
}
246258
this.form.base = base;
247-
this.tab = 'build';
248259
}
249260

250261
fetchImages(): void {
@@ -342,6 +353,18 @@ export class AppImagesComponent implements OnInit, OnDestroy {
342353
this.socketService.emit({ type: 'buildImage', data: this.form });
343354
}
344355

356+
startDelete(): void {
357+
this.removeingImage = false;
358+
if (this.form.base) {
359+
let index = this.baseImages.findIndex(i => i.name === this.form.name);
360+
this.baseImages.splice(index, 1);
361+
} else {
362+
let index = this.customImages.findIndex(i => i.name === this.form.name);
363+
this.customImages.splice(index, 1);
364+
}
365+
this.socketService.emit({ type: 'deleteImage', data: this.form });
366+
}
367+
345368
changeBaseImageSelect(e: Event): void {
346369
let tmp = this.form.dockerfile.split('\n');
347370
if (tmp) {

src/app/styles/images.sass

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@
2828
border-radius: 4px
2929
height: 600px
3030

31+
.remove-image
32+
position: relative
33+
34+
.ionicon
35+
position: absolute
36+
top: 0px
37+
right: 0px
38+
3139
.image-builder-box
3240
background: transparent
3341
border: none

0 commit comments

Comments
 (0)