Skip to content
This repository has been archived by the owner on Jul 15, 2022. It is now read-only.

Commit

Permalink
feat: centralized image view
Browse files Browse the repository at this point in the history
  • Loading branch information
Leonardo Chaia committed Oct 26, 2018
1 parent 18100a6 commit 514ae08
Show file tree
Hide file tree
Showing 35 changed files with 642 additions and 364 deletions.
14 changes: 2 additions & 12 deletions src/app/app-tabs.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ import { SystemContainerComponent } from './daemon-tools/system-container/system
import {
ApplicationListContainerComponent
} from './application-templates/application-list-container/application-list-container.component';
import { ImageListContainerComponent } from './daemon-tools/image-list-container/image-list-container.component';
import { SettingsContainerComponent } from './settings/settings-container/settings-container.component';
import {
ApplicationLaunchContainerComponent
} from './application-templates/application-launch-container/application-launch-container.component';
import { ContainerCreateContainerComponent } from './daemon-tools/container-create-container/container-create-container.component';
import { RegistryListContainerComponent } from './registry/registry-list-container/registry-list-container.component';
import { HomeContainerComponent } from './home/home-container/home-container.component';
import { TimoneerTabs } from './timoneer-tabs';
import { VolumeListContainerComponent } from './daemon-tools/volume-list-container/volume-list-container.component';
Expand All @@ -29,9 +27,9 @@ import {
ApplicationEditListContainerComponent
} from './application-templates/application-edit-list-container/application-edit-list-container.component';
import { ContainerLogsContainerComponent } from './daemon-tools/container-logs-container/container-logs-container.component';
import { DockerHubRepoListContainerComponent } from './docker-hub/docker-hub-repo-list-container/docker-hub-repo-list-container.component';
import { ImagePreviewContainerComponent } from './docker-images/image-preview-container/image-preview-container.component';
import { DockerImagesModule } from './docker-images/docker-image.module';
import { ImageSourceListContainerComponent } from './docker-images/image-source-list-container/image-source-list-container.component';

const TIMONEER_AVAILABLE_TABS: TabConfiguration[] = [
{
Expand All @@ -54,7 +52,7 @@ const TIMONEER_AVAILABLE_TABS: TabConfiguration[] = [
{
id: TimoneerTabs.DOCKER_IMAGES,
title: 'Images',
component: ImageListContainerComponent,
component: ImageSourceListContainerComponent,
},
{
id: TimoneerTabs.DOCKER_CONTAINER_LIST,
Expand Down Expand Up @@ -95,14 +93,6 @@ const TIMONEER_AVAILABLE_TABS: TabConfiguration[] = [
id: TimoneerTabs.APPLICATION_LAUNCH,
component: ApplicationLaunchContainerComponent,
},
{
id: TimoneerTabs.REGISTRY_IMAGES,
component: RegistryListContainerComponent,
},
{
id: TimoneerTabs.DOCKERHUB_IMAGES,
component: DockerHubRepoListContainerComponent,
},
{
id: TimoneerTabs.IMAGE_PREVIEW,
component: ImagePreviewContainerComponent,
Expand Down
7 changes: 7 additions & 0 deletions src/app/daemon-tools/daemon-tools.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ import { ContainerInspectCardsComponent } from './container-inspect-cards/contai
import { ContainerLogsContainerComponent } from './container-logs-container/container-logs-container.component';
import { ContainerActionButtonsComponent } from './container-action-buttons/container-action-buttons.component';
import { ContainerHeaderCardComponent } from './container-header-card/container-header-card.component';
import { ImageSource } from '../docker-images/image-source.model';
import { DockerDaemonImageSource } from './docker-daemon.image-source';

@NgModule({
imports: [
Expand Down Expand Up @@ -125,6 +127,11 @@ import { ContainerHeaderCardComponent } from './container-header-card/container-
DockerSystemService,
DockerContainerService,
DockerVolumeService,
{
provide: ImageSource,
useClass: DockerDaemonImageSource,
multi: true
}
],
entryComponents: [
PullImageJobLogsComponent,
Expand Down
49 changes: 49 additions & 0 deletions src/app/daemon-tools/docker-daemon.image-source.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ImageSource, ImageListFilter, ImageListItemData, ImageSourceDeletion } from '../docker-images/image-source.model';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';
import { map, switchMap } from 'rxjs/operators';
import { DockerImageService } from './docker-image.service';
import { DockerEventsService } from './docker-events.service';

@Injectable()
export class DockerDaemonImageSource
extends ImageSource
implements ImageSourceDeletion {

public priority = 0;
public readonly name = 'Docker Daemon';

constructor(
private readonly dockerEvents: DockerEventsService,
private readonly dockerImage: DockerImageService) {
super();
}

public loadList(filter?: ImageListFilter): Observable<ImageListItemData[]> {
return this.dockerEvents.bindAll(['delete', 'import', 'load', 'pull', 'tag', 'untag'], 'image')
.pipe(
switchMap(() => this.getImages(filter))
);
}

public deleteImage(image: ImageListItemData): Observable<void> {
return this.dockerImage.removeImage(image.id);
}

protected getImages(filter?: ImageListFilter) {
let dockerFilter: any;
if (filter && filter.term) {
dockerFilter = { reference: { [`*${filter.term}*`]: true } };
}
return this.dockerImage.imageList({
all: filter ? filter.displayDanglingImages : false,
filters: dockerFilter,
}).pipe(
map(r => r.map(i => ({
name: i.RepoTags ? i.RepoTags.join(', ') : i.Id,
id: i.Id,
size: i.Size
} as ImageListItemData)))
);
}
}
4 changes: 2 additions & 2 deletions src/app/daemon-tools/docker-events.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Injectable, OnDestroy, NgZone } from '@angular/core';
import { Subject, combineLatest } from 'rxjs';
import { DockerEvent } from 'dockerode';
import { switchMap, takeUntil, startWith, throttle, throttleTime } from 'rxjs/operators';
import { switchMap, takeUntil, startWith, throttle, throttleTime, debounceTime } from 'rxjs/operators';
import { DockerService } from './docker.service';
import { streamToObservable } from './stream-to-observable';
import { ElectronService } from '../electron-tools/electron.service';
Expand Down Expand Up @@ -50,7 +50,7 @@ export class DockerEventsService implements OnDestroy {
const subject = new Subject<DockerEvent>();
this.events.set(event, subject);
return subject.asObservable()
.pipe(throttleTime(500));
.pipe(debounceTime(250));
}
}

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

40 changes: 40 additions & 0 deletions src/app/docker-hub/docker-hub.image-source.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { ImageSource, ImageListFilter, ImageListItemData } from '../docker-images/image-source.model';
import { Observable, throwError } from 'rxjs';
import { Injectable } from '@angular/core';
import { DockerHubService } from './docker-hub.service';
import { map, switchMap } from 'rxjs/operators';
import { SettingsService } from '../settings/settings.service';

@Injectable()
export class DockerHubImageSource extends ImageSource {
public priority = 1;
public readonly name = 'Docker Hub';

constructor(
private readonly settings: SettingsService,
private readonly dockerHub: DockerHubService) {
super();
}

public loadList(filter?: ImageListFilter): Observable<ImageListItemData[]> {
filter = filter || {};
return this.settings.getDockerIOSettings()
.pipe(
switchMap(settings => {
if (settings && settings.username && settings.password) {
return this.dockerHub.getReposForUser(null)
.pipe(
map(r => r.results
.map(i => ({
name: `${i.namespace}/${i.name}`
} as ImageListItemData))
.filter(item => !filter.term || item.name.includes(filter.term))
),
);
} else {
return throwError('Docker Hub is not configured');
}
})
);
}
}
19 changes: 9 additions & 10 deletions src/app/docker-hub/docker-hub.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DockerHubRepoListComponent } from './docker-hub-repo-list/docker-hub-repo-list.component';
import { HttpClientModule } from '@angular/common/http';
import { MatCardModule, MatIconModule, MatButtonModule } from '@angular/material';
import { SharedModule } from '../shared/shared.module';
import { FlexLayoutModule } from '@angular/flex-layout';
import { DockerHubRepoListContainerComponent } from './docker-hub-repo-list-container/docker-hub-repo-list-container.component';
import { ImageSource } from '../docker-images/image-source.model';
import { DockerHubImageSource } from './docker-hub.image-source';

@NgModule({
imports: [
Expand All @@ -17,15 +17,14 @@ import { DockerHubRepoListContainerComponent } from './docker-hub-repo-list-cont
MatButtonModule,
FlexLayoutModule,

SharedModule,

],
declarations: [
DockerHubRepoListComponent,
DockerHubRepoListContainerComponent
SharedModule
],
exports: [
DockerHubRepoListComponent
providers: [
{
provide: ImageSource,
useClass: DockerHubImageSource,
multi: true
}
]
})
export class DockerHubModule { }
Loading

0 comments on commit 514ae08

Please sign in to comment.