Skip to content

Commit 4c733a1

Browse files
digitalfishpondmaciaszczykm
authored andcommitted
Add related Services to Replica Set Details page (#1088)
1 parent 0c7e141 commit 4c733a1

File tree

11 files changed

+136
-21
lines changed

11 files changed

+136
-21
lines changed

i18n/messages-en.xtb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,4 +543,5 @@
543543
<translation id="7091154364335994224" key="MSG_DAEMON_SET_LIST_NAMESPACE_LABEL" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Label 'Namespace' which appears as a column label in the table of daemon sets (daemon set list view).">Namespace</translation>
544544
<translation id="4677646778972512564" key="MSG_RC_LIST_NAMESPACE_LABEL" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Label 'Namespace' which appears as a column label in the table of replication controllers (RC list view).">Namespace</translation>
545545
<translation id="6106340570580081121" key="MSG_DAEMON_SET_DETAIL_SERVICES_TITLE" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Title 'Services' for the services information section on the daemon set detail page.">Services</translation>
546+
<translation id="4440799155040620024" key="MSG_REPLICA_SET_DETAIL_SERVICES_TITLE" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Title 'Services' for the services information section on the replica set detail page.">Services</translation>
546547
</translationbundle>

i18n/messages-ja.xtb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,4 +732,5 @@
732732
<translation id="910153156225182799" key="MSG_CONFIG_MAP_LIST_NAMESPACE_LABEL" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Config map list header: namespace.">Namespace</translation>
733733
<translation id="6106340570580081121" key="MSG_DAEMON_SET_DETAIL_SERVICES_TITLE" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Title 'Services' for the services information section on the daemon set detail page.">Services</translation>
734734
<translation id="6106340570580081121" key="MSG_DAEMON_SET_DETAIL_SERVICES_TITLE" source="/home/floreks/Projects/dashboard/.tmp/serve/app-dev.js" desc="Title 'Services' for the services information section on the daemon set detail page.">Services</translation>
735+
<translation id="4440799155040620024" key="MSG_REPLICA_SET_DETAIL_SERVICES_TITLE" source="/home/denis/Projects/dashboard/.tmp/serve/app-dev.js" desc="Title 'Services' for the services information section on the replica set detail page.">Services</translation>
735736
</translationbundle>

src/app/backend/handler/apihandler.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,23 @@ func (apiHandler *APIHandler) handleGetReplicaSetPods(
652652
response.WriteHeaderAndEntity(http.StatusCreated, result)
653653
}
654654

655+
// Handles get Replica Set services API call.
656+
func (apiHandler *APIHandler) handleGetReplicaSetServices(
657+
request *restful.Request, response *restful.Response) {
658+
659+
namespace := request.PathParameter("namespace")
660+
replicaSet := request.PathParameter("replicaSet")
661+
pagination := parsePaginationPathParameter(request)
662+
result, err := replicaset.GetReplicaSetServices(apiHandler.client, pagination, namespace,
663+
replicaSet)
664+
if err != nil {
665+
handleInternalError(response, err)
666+
return
667+
}
668+
669+
response.WriteHeaderAndEntity(http.StatusCreated, result)
670+
}
671+
655672
// Handles get Deployment list API call.
656673
func (apiHandler *APIHandler) handleGetDeployments(
657674
request *restful.Request, response *restful.Response) {

src/app/backend/resource/replicaset/replicasetcommon.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/kubernetes/dashboard/src/app/backend/resource/common"
1919
"github.com/kubernetes/dashboard/src/app/backend/resource/event"
2020
"github.com/kubernetes/dashboard/src/app/backend/resource/pod"
21+
"github.com/kubernetes/dashboard/src/app/backend/resource/service"
2122

2223
"k8s.io/kubernetes/pkg/api"
2324
"k8s.io/kubernetes/pkg/apis/extensions"
@@ -60,16 +61,17 @@ func ToReplicaSet(replicaSet *extensions.ReplicaSet, podInfo *common.PodInfo) Re
6061

6162
// ToReplicaSetDetail converts replica set api object to replica set detail model object.
6263
func ToReplicaSetDetail(replicaSet *extensions.ReplicaSet, eventList common.EventList,
63-
podList pod.PodList, podInfo common.PodInfo) ReplicaSetDetail {
64+
podList pod.PodList, podInfo common.PodInfo, serviceList service.ServiceList) ReplicaSetDetail {
6465

6566
return ReplicaSetDetail{
6667
ObjectMeta: common.NewObjectMeta(replicaSet.ObjectMeta),
6768
TypeMeta: common.NewTypeMeta(common.ResourceKindReplicaSet),
6869
ContainerImages: common.GetContainerImages(&replicaSet.Spec.Template.Spec),
6970
PodInfo: podInfo,
7071
// TODO(floreks): add pagination support
71-
PodList: podList,
72-
EventList: eventList,
72+
PodList: podList,
73+
ServiceList: serviceList,
74+
EventList: eventList,
7375
}
7476
}
7577

src/app/backend/resource/replicaset/replicasetdetail.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/kubernetes/dashboard/src/app/backend/client"
2323
"github.com/kubernetes/dashboard/src/app/backend/resource/common"
2424
"github.com/kubernetes/dashboard/src/app/backend/resource/pod"
25+
resourceService "github.com/kubernetes/dashboard/src/app/backend/resource/service"
2526
)
2627

2728
// ReplicaSetDetail is a presentation layer view of Kubernetes Replica Set resource. This means
@@ -37,6 +38,9 @@ type ReplicaSetDetail struct {
3738
// Detailed information about Pods belonging to this Replica Set.
3839
PodList pod.PodList `json:"podList"`
3940

41+
// Detailed information about service related to Replica Set.
42+
ServiceList resourceService.ServiceList `json:"serviceList"`
43+
4044
// Container images of the Replica Set.
4145
ContainerImages []string `json:"containerImages"`
4246

@@ -70,6 +74,11 @@ func GetReplicaSetDetail(client k8sClient.Interface, heapsterClient client.Heaps
7074
return nil, err
7175
}
7276

73-
replicaSet := ToReplicaSetDetail(replicaSetData, *eventList, *podList, *podInfo)
77+
serviceList, err := GetReplicaSetServices(client, pQuery, namespace, name)
78+
if err != nil {
79+
return nil, err
80+
}
81+
82+
replicaSet := ToReplicaSetDetail(replicaSetData, *eventList, *podList, *podInfo, *serviceList)
7483
return &replicaSet, nil
7584
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright 2015 Google Inc. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package replicaset
16+
17+
import (
18+
client "k8s.io/kubernetes/pkg/client/unversioned"
19+
20+
"github.com/kubernetes/dashboard/src/app/backend/resource/common"
21+
"github.com/kubernetes/dashboard/src/app/backend/resource/service"
22+
)
23+
24+
// GetReplicaSetServices returns list of services that are related to replica set targeted by given
25+
// name.
26+
func GetReplicaSetServices(client client.Interface, pQuery *common.PaginationQuery,
27+
namespace, name string) (*service.ServiceList, error) {
28+
29+
replicaSet, err := client.Extensions().ReplicaSets(namespace).Get(name)
30+
if err != nil {
31+
return nil, err
32+
}
33+
34+
channels := &common.ResourceChannels{
35+
ServiceList: common.GetServiceListChannel(client, common.NewSameNamespaceQuery(namespace),
36+
1),
37+
}
38+
39+
services := <-channels.ServiceList.List
40+
if err := <-channels.ServiceList.Error; err != nil {
41+
return nil, err
42+
}
43+
44+
matchingServices := common.FilterNamespacedServicesBySelector(services.Items, namespace,
45+
replicaSet.Spec.Selector.MatchLabels)
46+
return service.CreateServiceList(matchingServices, pQuery), nil
47+
}

src/app/frontend/replicasetdetail/replicasetdetail.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
<md-tab label="{{::ctrl.i18n.MSG_REPLICA_SET_DETAIL_OVERVIEW_LABEL}}">
2121
<kd-replica-set-info replica-set="::ctrl.replicaSetDetail"></kd-replica-set-info>
2222

23+
<kd-content-card ng-if="::ctrl.replicaSetDetail.serviceList.services.length">
24+
<kd-title>{{::ctrl.i18n.MSG_REPLICA_SET_DETAIL_SERVICES_TITLE}}</kd-title>
25+
<kd-content>
26+
<kd-service-card-list service-list="::ctrl.replicaSetDetail.serviceList"
27+
service-list-resource="::ctrl.replicaSetServicesResource">
28+
</kd-service-card-list>
29+
</kd-content>
30+
</kd-content-card>
2331
<kd-content-card ng-if="::ctrl.replicaSetDetail.podList.pods.length">
2432
<kd-title>{{::ctrl.i18n.MSG_REPLICA_SET_DETAIL_PODS_TITLE}}</kd-title>
2533
<kd-content>

src/app/frontend/replicasetdetail/replicasetdetail_controller.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,20 @@
1818
export class ReplicaSetDetailController {
1919
/**
2020
* @param {!backendApi.ReplicaSetDetail} replicaSetDetail
21+
* @param {!angular.Resource} kdReplicaSetPodsResource
22+
* @param {!angular.Resource} kdReplicaSetServicesResource
2123
* @ngInject
2224
*/
23-
constructor(replicaSetDetail, kdReplicaSetPodsResource) {
25+
constructor(replicaSetDetail, kdReplicaSetPodsResource, kdReplicaSetServicesResource) {
2426
/** @export {!backendApi.ReplicaSetDetail} */
2527
this.replicaSetDetail = replicaSetDetail;
2628

2729
/** @export {!angular.Resource} */
2830
this.replicaSetPodsResource = kdReplicaSetPodsResource;
2931

32+
/** @export {!angular.Resource} */
33+
this.replicaSetServicesResource = kdReplicaSetServicesResource;
34+
3035
/** @export */
3136
this.i18n = i18n;
3237
}
@@ -36,6 +41,9 @@ const i18n = {
3641
/** @export {string} @desc Title 'Pods', which appears at the top of the pods list on the
3742
replica set details view. */
3843
MSG_REPLICA_SET_DETAIL_PODS_TITLE: goog.getMsg('Pods'),
44+
/** @export {string} @desc Title 'Services' for the services information section on the replica set
45+
* detail page. */
46+
MSG_REPLICA_SET_DETAIL_SERVICES_TITLE: goog.getMsg('Services'),
3947
/** @export {string} @desc Label 'Overview' for the left navigation tab on the replica
4048
set details page. */
4149
MSG_REPLICA_SET_DETAIL_OVERVIEW_LABEL: goog.getMsg('Overview'),

src/app/frontend/replicasetdetail/replicasetdetail_module.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export default angular
3939
.config(stateConfig)
4040
.component('kdReplicaSetInfo', replicaSetInfoComponent)
4141
.factory('kdReplicaSetDetailResource', replicaSetDetailResource)
42-
.factory('kdReplicaSetPodsResource', replicaSetPodsResource);
42+
.factory('kdReplicaSetPodsResource', replicaSetPodsResource)
43+
.factory('kdReplicaSetServicesResource', replicaSetServicesResource);
4344

4445
/**
4546
* @param {!angular.$resource} $resource
@@ -58,3 +59,12 @@ function replicaSetDetailResource($resource) {
5859
function replicaSetPodsResource($resource) {
5960
return $resource('api/v1/replicaset/:namespace/:name/pod');
6061
}
62+
63+
/**
64+
* @param {!angular.$resource} $resource
65+
* @return {!angular.Resource}
66+
* @ngInject
67+
*/
68+
function replicaSetServicesResource($resource) {
69+
return $resource('api/v1/replicaset/:namespace/:name/service');
70+
}

src/test/backend/resource/replicaset/replicasetcommon_test.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/kubernetes/dashboard/src/app/backend/resource/common"
2222
"github.com/kubernetes/dashboard/src/app/backend/resource/pod"
23+
"github.com/kubernetes/dashboard/src/app/backend/resource/service"
2324

2425
"k8s.io/kubernetes/pkg/api"
2526
"k8s.io/kubernetes/pkg/api/unversioned"
@@ -96,23 +97,26 @@ func TestToReplicaSet(t *testing.T) {
9697

9798
func TestToReplicaSetDetail(t *testing.T) {
9899
cases := []struct {
99-
replicaSet *extensions.ReplicaSet
100-
eventList common.EventList
101-
podList pod.PodList
102-
podInfo common.PodInfo
103-
expected ReplicaSetDetail
100+
replicaSet *extensions.ReplicaSet
101+
eventList common.EventList
102+
podList pod.PodList
103+
podInfo common.PodInfo
104+
serviceList service.ServiceList
105+
expected ReplicaSetDetail
104106
}{
105107
{
106108
&extensions.ReplicaSet{},
107109
common.EventList{},
108110
pod.PodList{},
109111
common.PodInfo{},
112+
service.ServiceList{},
110113
ReplicaSetDetail{TypeMeta: common.TypeMeta{Kind: common.ResourceKindReplicaSet}},
111114
}, {
112115
&extensions.ReplicaSet{ObjectMeta: api.ObjectMeta{Name: "replica-set"}},
113116
common.EventList{Events: []common.Event{{Message: "event-msg"}}},
114117
pod.PodList{Pods: []pod.Pod{{ObjectMeta: common.ObjectMeta{Name: "pod-1"}}}},
115118
common.PodInfo{},
119+
service.ServiceList{Services: []service.Service{{ObjectMeta: common.ObjectMeta{Name: "service-1"}}}},
116120
ReplicaSetDetail{
117121
ObjectMeta: common.ObjectMeta{Name: "replica-set"},
118122
TypeMeta: common.TypeMeta{Kind: common.ResourceKindReplicaSet},
@@ -122,16 +126,21 @@ func TestToReplicaSetDetail(t *testing.T) {
122126
ObjectMeta: common.ObjectMeta{Name: "pod-1"},
123127
}},
124128
},
129+
ServiceList: service.ServiceList{
130+
Services: []service.Service{{
131+
ObjectMeta: common.ObjectMeta{Name: "service-1"},
132+
}},
133+
},
125134
},
126135
},
127136
}
128137

129138
for _, c := range cases {
130-
actual := ToReplicaSetDetail(c.replicaSet, c.eventList, c.podList, c.podInfo)
139+
actual := ToReplicaSetDetail(c.replicaSet, c.eventList, c.podList, c.podInfo, c.serviceList)
131140

132141
if !reflect.DeepEqual(actual, c.expected) {
133142
t.Errorf("ToReplicaSetDetail(%#v, %#v, %#v, %#v) == \ngot %#v, \nexpected %#v",
134-
c.replicaSet, c.eventList, c.podList, c.podInfo, actual, c.expected)
143+
c.replicaSet, c.eventList, c.podList, c.podInfo, c.serviceList, actual, c.expected)
135144
}
136145
}
137146
}

0 commit comments

Comments
 (0)