diff --git a/src/app/frontend/common/components/resourcelist/serviceaccount/component.ts b/src/app/frontend/common/components/resourcelist/serviceaccount/component.ts
new file mode 100644
index 00000000000..20d00a13a48
--- /dev/null
+++ b/src/app/frontend/common/components/resourcelist/serviceaccount/component.ts
@@ -0,0 +1,66 @@
+// Copyright 2017 The Kubernetes Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import {HttpParams} from '@angular/common/http';
+import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import {ServiceAccount, ServiceAccountList} from 'typings/backendapi';
+
+import {ResourceListBase} from '../../../resources/list';
+import {NotificationsService} from '../../../services/global/notifications';
+import {EndpointManager, Resource} from '../../../services/resource/endpoint';
+import {NamespacedResourceService} from '../../../services/resource/resource';
+import {MenuComponent} from '../../list/column/menu/component';
+import {ListGroupIdentifier, ListIdentifier} from '../groupids';
+
+@Component({
+ selector: 'kd-service-account-list',
+ templateUrl: './template.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class ServiceAccountListComponent extends ResourceListBase
{
+ @Input() endpoint = EndpointManager.resource(Resource.serviceAccount, true).list();
+
+ constructor(
+ private readonly serviceAccount_: NamespacedResourceService,
+ notifications: NotificationsService,
+ cdr: ChangeDetectorRef,
+ ) {
+ super('serviceaccount', notifications, cdr);
+ this.id = ListIdentifier.serviceAccount;
+ this.groupId = ListGroupIdentifier.config;
+
+ // Register action columns.
+ this.registerActionColumn('menu', MenuComponent);
+
+ // Register dynamic columns.
+ this.registerDynamicColumn('namespace', 'name', this.shouldShowNamespaceColumn_.bind(this));
+ }
+
+ getResourceObservable(params?: HttpParams): Observable {
+ return this.serviceAccount_.get(this.endpoint, undefined, undefined, params);
+ }
+
+ map(serviceAccountList: ServiceAccountList): ServiceAccount[] {
+ return serviceAccountList.items;
+ }
+
+ getDisplayColumns(): string[] {
+ return ['name', 'labels', 'created'];
+ }
+
+ private shouldShowNamespaceColumn_(): boolean {
+ return this.namespaceService_.areMultipleNamespacesSelected();
+ }
+}
diff --git a/src/app/frontend/common/components/resourcelist/serviceaccount/template.html b/src/app/frontend/common/components/resourcelist/serviceaccount/template.html
new file mode 100644
index 00000000000..f5640ca8e82
--- /dev/null
+++ b/src/app/frontend/common/components/resourcelist/serviceaccount/template.html
@@ -0,0 +1,100 @@
+
+
+
+ Service Accounts
+ Items: {{totalItems}}
+
+
+
+
+
+
+
+
+
+ Name
+
+
+ {{serviceAccount.objectMeta.name}}
+
+
+
+
+
+ Namespace
+ {{serviceAccount.objectMeta.namespace}}
+
+
+
+ Labels
+
+
+
+
+
+
+ Created
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/frontend/common/services/resource/endpoint.ts b/src/app/frontend/common/services/resource/endpoint.ts
index 8750fb287e0..29ac37ab8be 100644
--- a/src/app/frontend/common/services/resource/endpoint.ts
+++ b/src/app/frontend/common/services/resource/endpoint.ts
@@ -37,8 +37,10 @@ export enum Resource {
configMap = 'configmap',
persistentVolumeClaim = 'persistentvolumeclaim',
secret = 'secret',
+ imagePullSecret = 'imagepullsecret',
ingress = 'ingress',
service = 'service',
+ serviceAccount = 'serviceaccount',
event = 'event',
container = 'container',
plugin = 'plugin',
diff --git a/src/app/frontend/overview/template.html b/src/app/frontend/overview/template.html
index 94b0af4f37d..cb3e3698aa3 100644
--- a/src/app/frontend/overview/template.html
+++ b/src/app/frontend/overview/template.html
@@ -62,6 +62,8 @@
[hideable]="true">
+
diff --git a/src/app/frontend/resource/config/serviceaccount/detail/component.ts b/src/app/frontend/resource/config/serviceaccount/detail/component.ts
new file mode 100644
index 00000000000..5903a8178cd
--- /dev/null
+++ b/src/app/frontend/resource/config/serviceaccount/detail/component.ts
@@ -0,0 +1,67 @@
+// Copyright 2017 The Kubernetes Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import 'rxjs/add/operator/startWith';
+
+import {Component, OnDestroy, OnInit} from '@angular/core';
+import {ActivatedRoute} from '@angular/router';
+import {ServiceAccountDetail} from '@api/backendapi';
+import {Subscription} from 'rxjs/Subscription';
+
+import {ActionbarService, ResourceMeta} from '../../../../common/services/global/actionbar';
+import {NotificationsService} from '../../../../common/services/global/notifications';
+import {EndpointManager, Resource} from '../../../../common/services/resource/endpoint';
+import {NamespacedResourceService} from '../../../../common/services/resource/resource';
+
+@Component({
+ selector: 'kd-service-account-detail',
+ templateUrl: './template.html',
+})
+export class ServiceAccountDetailComponent implements OnInit, OnDestroy {
+ private serviceAccountSubscription_: Subscription;
+ private readonly endpoint_ = EndpointManager.resource(Resource.serviceAccount, true);
+ secretListEndpoint: string;
+ imagePullSecretListEndpoint: string;
+ serviceAccount: ServiceAccountDetail;
+ isInitialized = false;
+
+ constructor(
+ private readonly serviceAccount_: NamespacedResourceService