Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/frontend/src/app/admin/admin-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ import { KubeStatefulsetComponent } from './kubernetes/statefulset/kube-stateful
import { KubeDaemonsetComponent } from './kubernetes/daemonset/kube-daemonset.component';
import { KubeCronjobComponent } from './kubernetes/cronjob/kube-cronjob.component';
import { KubeJobComponent } from './kubernetes/job/kube-job.component';
import { KubeReplicasetComponent } from './kubernetes/replicaset/kube-replicaset.component';


const routes: Routes = [
Expand Down Expand Up @@ -178,6 +179,8 @@ const routes: Routes = [
{path: 'kubernetes/cronjob/:cluster', component: KubeCronjobComponent},
{path: 'kubernetes/job', component: KubeJobComponent},
{path: 'kubernetes/job/:cluster', component: KubeJobComponent},
{path: 'kubernetes/replicaset', component: KubeReplicasetComponent},
{path: 'kubernetes/replicaset/:cluster', component: KubeReplicasetComponent},
...ADMINROUTES
]
}
Expand Down
4 changes: 3 additions & 1 deletion src/frontend/src/app/admin/admin.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import { KubeStatefulsetModule } from './kubernetes/statefulset/kube-statefulset
import { KubeDaemonsetModule } from './kubernetes/daemonset/kube-daemonset.module';
import { KubeCronjobModule } from './kubernetes/cronjob/kube-cronjob.module';
import { KubeJobModule } from './kubernetes/job/kube-job.module';
import { KubeReplicasetModule } from './kubernetes/replicaset/kube-replicaset.module';

@NgModule({
imports: [
Expand Down Expand Up @@ -108,7 +109,8 @@ import { KubeJobModule } from './kubernetes/job/kube-job.module';
KubeStatefulsetModule,
KubeDaemonsetModule,
KubeCronjobModule,
KubeJobModule
KubeJobModule,
KubeReplicasetModule
],
providers: [
AdminAuthCheckGuard,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
<wayne-checkbox-group [(ngModel)]="showList">
<wayne-checkbox value="name">{{'ADMIN.KUBERNETES.JOB.LIST.NAME' | translate}}</wayne-checkbox>
<wayne-checkbox value="label">{{'ADMIN.KUBERNETES.JOB.LIST.LABEL' | translate}}</wayne-checkbox>
<wayne-checkbox value="containers">{{'ADMIN.KUBERNETES.JOB.LIST.IMAGES' | translate}}</wayne-checkbox>
<wayne-checkbox value="status">{{'ADMIN.KUBERNETES.JOB.LIST.STATUS' | translate}}</wayne-checkbox>
<wayne-checkbox value="age">{{'ADMIN.KUBERNETES.JOB.LIST.AGE' | translate}}</wayne-checkbox>
</wayne-checkbox-group>
</wayne-filter-box>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import { ListJobComponent } from './list-job/list-job.component';
const showState = {
'name': {hidden: false},
'label': {hidden: false},
'containers': {hidden: false},
'status': {hidden: false},
'age': {hidden: false},
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
</clr-dg-cell>
<clr-dg-cell>
{{obj.status.succeeded ? obj.status.succeeded : 0}}/{{obj.spec.completions }}
<clr-icon style="color: #FF3434" shape="exclamation-triangle" *ngIf="obj.spec.completions !== obj.status.succeeded"
<clr-icon style="color: #FF3434" shape="exclamation-triangle" *ngIf="!isReady(obj)"
class="is-solid"></clr-icon>
<clr-icon style="color: green" shape="success-standard" *ngIf="obj.spec.completions === obj.status.succeeded"
<clr-icon style="color: green" shape="success-standard" *ngIf="isReady(obj)"
class="is-solid"></clr-icon>
</clr-dg-cell>
<clr-dg-cell> {{ obj.metadata.creationTimestamp | relativeTime}} </clr-dg-cell>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,10 @@ export class ListJobComponent extends KubernetesNamespacedListResource {
super(tplDetailService);
}

isReady(obj: any): boolean {
const readyNumber = obj.status.succeeded ? obj.status.succeeded : 0;
const desiredNumber = obj.spec.completions;
return readyNumber === desiredNumber;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<div class="clr-row">
<div class="clr-col-lg-12 clr-col-md-12 clr-col-sm-12 clr-col-xs-12">
<div class="table-search">
<div class="table-search-left">
<button class="wayne-button normal" (click)="createResource()">
{{'ADMIN.KUBERNETES.REPLICASET.CREATE' | translate}}
</button>
<button class="wayne-button normal" (click)="retrieveResource()">
{{'ADMIN.KUBERNETES.ACTION.REFRESH' | translate}}
</button>
<wayne-filter-box (confirm)="onConfirmEvent()" (cancel)="onCancelEvent()">
<wayne-checkbox-group [(ngModel)]="showList">
<wayne-checkbox value="name">{{'ADMIN.KUBERNETES.REPLICASET.LIST.NAME' | translate}}</wayne-checkbox>
<wayne-checkbox value="label">{{'ADMIN.KUBERNETES.REPLICASET.LIST.LABEL' | translate}}</wayne-checkbox>
<wayne-checkbox value="containers">{{'ADMIN.KUBERNETES.REPLICASET.LIST.IMAGES' | translate}}</wayne-checkbox>
<wayne-checkbox value="status">{{'ADMIN.KUBERNETES.REPLICASET.LIST.STATUS' | translate}}</wayne-checkbox>
<wayne-checkbox value="age">{{'ADMIN.KUBERNETES.REPLICASET.LIST.AGE' | translate}}</wayne-checkbox>
</wayne-checkbox-group>
</wayne-filter-box>
<label for="namespace_name" class="clr-col-md-3">{{'ADMIN.KUBERNETES.LABEL.NAMESPACE' | translate}}</label>
<wayne-select [(ngModel)]="namespace" (change)="retrieveResource()"
searchable
name="namespace_name"
[placeholder]="'PLACEHOLDER.CHOOSE' | translate"
style="margin-left: 12px;">
<wayne-option *ngFor="let ns of namespaces" [value]="ns">{{ns}}</wayne-option>
</wayne-select>
</div>
</div>

<wayne-list-replicaset
[resources]="resources"
[showState]="showState"
(delete)="onDeleteResourceEvent($event)"
(edit)="onEditResourceEvent($event)"
[page]="pageState.page"
[cluster]="cluster"
(paginate)="retrieveResource($event)">
</wayne-list-replicaset>
</div>
</div>
<deletion-dialog (outputObj)="confirmDeleteEvent($event)"></deletion-dialog>
<wayne-ace-editor (createOutputObj)="onCreateResourceEvent($event)" (outputObj)="onSaveResourceEvent($event)"></wayne-ace-editor>
<wayne-float-window value="{{ cluster }}">
<wayne-float-window-item *ngFor="let cluster of clusters" [value]="cluster"
(click)="jumpToHref(cluster)"></wayne-float-window-item>
</wayne-float-window>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { MessageHandlerService } from '../../../shared/message-handler/message-handler.service';
import { ClusterService } from '../../../shared/client/v1/cluster.service';
import { AuthService } from '../../../shared/auth/auth.service';
import { AceEditorComponent } from '../../../shared/ace-editor/ace-editor.component';
import { KubernetesClient } from '../../../shared/client/v1/kubernetes/kubernetes';
import { KubeResourceReplicaSet } from '../../../shared/shared.const';
import { KubernetesNamespacedResource } from '../../../shared/base/kubernetes-namespaced/kubernetes-namespaced-resource';
import { DeletionDialogComponent } from '../../../shared/deletion-dialog/deletion-dialog.component';
import { ListReplicasetComponent } from './list-replicaset/list-replicaset.component';

const showState = {
'name': {hidden: false},
'label': {hidden: false},
'containers': {hidden: false},
'status': {hidden: false},
'age': {hidden: false},
};

@Component({
selector: 'wayne-kube-replicaset',
templateUrl: './kube-replicaset.component.html'
})

export class KubeReplicasetComponent extends KubernetesNamespacedResource implements OnInit, OnDestroy {
@ViewChild(ListReplicasetComponent)
listResourceComponent: ListReplicasetComponent;

@ViewChild(AceEditorComponent)
aceEditorModal: AceEditorComponent;

@ViewChild(DeletionDialogComponent)
deletionDialogComponent: DeletionDialogComponent;

constructor(public kubernetesClient: KubernetesClient,
public route: ActivatedRoute,
public router: Router,
public clusterService: ClusterService,
public authService: AuthService,
public messageHandlerService: MessageHandlerService) {
super(kubernetesClient, route, router, clusterService, authService, messageHandlerService);
super.registResourceType('replicaset');
super.registKubeResource(KubeResourceReplicaSet);
super.registShowSate(showState);
}

ngOnInit() {
super.ngOnInit();
}

ngOnDestroy(): void {
super.ngOnDestroy();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { NgModule } from '@angular/core';
import { SharedModule } from '../../../shared/shared.module';
import { ReactiveFormsModule } from '@angular/forms';
import { KubeReplicasetComponent } from './kube-replicaset.component';
import { KubernetesClient } from '../../../shared/client/v1/kubernetes/kubernetes';
import { DeletionDialogModule } from '../../../shared/deletion-dialog/deletion-dialog.module';
import { ListReplicasetComponent } from './list-replicaset/list-replicaset.component';

@NgModule({
imports: [
SharedModule,
ReactiveFormsModule,
DeletionDialogModule
],
providers: [
KubernetesClient
],
exports: [
KubeReplicasetComponent,
ListReplicasetComponent
],
declarations: [
KubeReplicasetComponent,
ListReplicasetComponent
]
})

export class KubeReplicasetModule {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<clr-datagrid (clrDgRefresh)="refresh($event)">
<clr-dg-column class="col-app-name" [clrDgField]="'name'">
<ng-container *clrDgHideableColumn="showState['name']">
{{'ADMIN.KUBERNETES.REPLICASET.LIST.NAME' | translate}}
</ng-container>
</clr-dg-column>
<clr-dg-column>
<ng-container *clrDgHideableColumn="showState['label']">
{{'ADMIN.KUBERNETES.REPLICASET.LIST.LABEL' | translate}}
</ng-container>
</clr-dg-column>
<clr-dg-column class="col-version">
<ng-container *clrDgHideableColumn="showState['containers']">
{{'ADMIN.KUBERNETES.REPLICASET.LIST.IMAGES' | translate}}
</ng-container>
</clr-dg-column>
<clr-dg-column>
<ng-container *clrDgHideableColumn="showState['status']">
{{'ADMIN.KUBERNETES.REPLICASET.LIST.STATUS' | translate}}
</ng-container>
</clr-dg-column>
<clr-dg-column [clrDgField]="'creationTimestamp'">
<ng-container *clrDgHideableColumn="showState['age']">
{{'ADMIN.KUBERNETES.REPLICASET.LIST.AGE' | translate}}
</ng-container>
</clr-dg-column>


<clr-dg-row *ngFor="let obj of resources" [clrDgItem]="obj">
<clr-dg-action-overflow>
<button class="action-item" (click)="onEditEvent(obj)">{{'ADMIN.KUBERNETES.ACTION.EDIT' | translate}}</button>
<button class="action-item" (click)="onDeleteEvent(obj)">{{'ADMIN.KUBERNETES.ACTION.DELETE' | translate}}</button>
</clr-dg-action-overflow>
<clr-dg-cell class="col-app-name"> {{ obj.metadata.name }} </clr-dg-cell>
<clr-dg-cell>
<div *ngFor="let label of obj.metadata.labels | keyvalue" class="version-text">
<a href="javascript:" (click)="versionDetail(label.key + ': ' + label.value)">{{label.key}}: {{label.value}}</a>
</div>
</clr-dg-cell>
<clr-dg-cell class="col-version">
<div *ngFor="let container of obj.spec.template.spec.containers" class="version-text">
<a href="javascript:" (click)="versionDetail(container.image)">{{container.image}}</a>
</div>
</clr-dg-cell>
<clr-dg-cell>
{{obj.status.readyReplicas ? obj.status.readyReplicas : 0}}/{{ obj.spec.replicas }}
<clr-icon style="color: #FF3434" shape="exclamation-triangle" *ngIf="!isReady(obj)"
class="is-solid"></clr-icon>
<clr-icon style="color: green" shape="success-standard" *ngIf="isReady(obj)"
class="is-solid"></clr-icon>
</clr-dg-cell>
<clr-dg-cell> {{ obj.metadata.creationTimestamp | relativeTime}} </clr-dg-cell>
</clr-dg-row>
<clr-dg-footer>
<wayne-paginate
[(currentPage)]="currentPage"
[total]="page.totalCount"
[pageSizes]="[10, 20, 50]"
(sizeChange)="pageSizeChange($event)">
</wayne-paginate>
</clr-dg-footer>
</clr-datagrid>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Component, Input } from '@angular/core';
import { KubernetesNamespacedListResource } from '../../../../shared/base/kubernetes-namespaced/kubernetes-namespaced-list-resource';
import { TplDetailService } from '../../../../shared/tpl-detail/tpl-detail.service';

@Component({
selector: 'wayne-list-replicaset',
templateUrl: './list-replicaset.component.html'
})

export class ListReplicasetComponent extends KubernetesNamespacedListResource {
@Input() resources: any[];
@Input() showState: object;

constructor(public tplDetailService: TplDetailService) {
super(tplDetailService);
}

isReady(obj: any): boolean {
const readyNumber = obj.status.readyReplicas ? obj.status.readyReplicas : 0;
const desiredNumber = obj.spec.replicas;
return readyNumber === desiredNumber;
}

}
7 changes: 7 additions & 0 deletions src/frontend/src/app/admin/sidenav/sidenav.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@
<clr-icon clrVerticalNavIcon shape="event"></clr-icon>
Deployment
</a>
<a clrVerticalNavLink
routerLink="kubernetes/replicaset"
[routerLinkActiveOptions]="{exact:true}"
routerLinkActive="active">
<clr-icon clrVerticalNavIcon shape="event"></clr-icon>
ReplicaSet
</a>
<a clrVerticalNavLink
routerLink="kubernetes/statefulset"
[routerLinkActiveOptions]="{exact:true}"
Expand Down
10 changes: 10 additions & 0 deletions src/frontend/src/assets/i18n/zh-Hans.json
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,16 @@
"IMAGES": "镜像",
"STATUS": "状态"
}
},
"REPLICASET": {
"CREATE": "创建 ReplicaSet",
"LIST": {
"NAME": "名称",
"LABEL": "标签",
"AGE": "启动时间",
"IMAGES": "镜像",
"STATUS": "状态"
}
}
}
}
Expand Down