Skip to content

Commit 6cc2410

Browse files
brykmaciaszczykm
authored andcommitted
Remove endpoints from RCs and add them to services (#864)
Fixes #854, Fixes #836 This PR has also a nice benefit of speeding things up, as I removed calls to Nodes and Services from most pages.
1 parent 7352d34 commit 6cc2410

File tree

22 files changed

+98
-618
lines changed

22 files changed

+98
-618
lines changed

src/app/backend/resource/common/endpoint.go

Lines changed: 9 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,20 @@ type Endpoint struct {
2929
Ports []ServicePort `json:"ports"`
3030
}
3131

32-
// GetExternalEndpoints returns array of external endpoints for resources targeted by given
33-
// selector.
34-
func GetExternalEndpoints(resourceSelector map[string]string, allPods []api.Pod,
35-
service api.Service, nodes []api.Node) []Endpoint {
36-
32+
// GetExternalEndpoints returns endpoints that are externally reachable for a service.
33+
func GetExternalEndpoints(service *api.Service) []Endpoint {
3734
var externalEndpoints []Endpoint
38-
resourcePods := FilterPodsBySelector(allPods, resourceSelector)
39-
40-
if service.Spec.Type == api.ServiceTypeNodePort {
41-
externalEndpoints = getNodePortEndpoints(resourcePods, service, nodes)
42-
} else if service.Spec.Type == api.ServiceTypeLoadBalancer {
35+
if service.Spec.Type == api.ServiceTypeLoadBalancer {
4336
for _, ingress := range service.Status.LoadBalancer.Ingress {
44-
externalEndpoints = append(externalEndpoints, getExternalEndpoint(
45-
ingress, service.Spec.Ports))
46-
}
47-
48-
if len(externalEndpoints) == 0 {
49-
externalEndpoints = getNodePortEndpoints(resourcePods,
50-
service, nodes)
37+
externalEndpoints = append(externalEndpoints, getExternalEndpoint(ingress, service.Spec.Ports))
5138
}
5239
}
5340

54-
if len(externalEndpoints) == 0 && (service.Spec.Type == api.ServiceTypeNodePort ||
55-
service.Spec.Type == api.ServiceTypeLoadBalancer) {
56-
externalEndpoints = getLocalhostEndpoints(service)
41+
for _, ip := range service.Spec.ExternalIPs {
42+
externalEndpoints = append(externalEndpoints, Endpoint{
43+
Host: ip,
44+
Ports: GetServicePorts(service.Spec.Ports),
45+
})
5746
}
5847

5948
return externalEndpoints
@@ -77,56 +66,6 @@ func GetInternalEndpoint(serviceName, namespace string, ports []api.ServicePort)
7766
}
7867
}
7968

80-
// Returns array of external endpoints for specified pods.
81-
func getNodePortEndpoints(pods []api.Pod, service api.Service, nodes []api.Node) []Endpoint {
82-
var externalEndpoints []Endpoint
83-
var addresses []api.NodeAddress
84-
85-
for _, pod := range pods {
86-
node := GetNodeByName(nodes, pod.Spec.NodeName)
87-
if node == nil {
88-
continue
89-
}
90-
91-
addresses = append(addresses, node.Status.Addresses...)
92-
}
93-
94-
addresses = getUniqueExternalAddresses(addresses)
95-
96-
for _, address := range addresses {
97-
for _, port := range service.Spec.Ports {
98-
externalEndpoints = append(externalEndpoints, Endpoint{
99-
Host: address.Address,
100-
Ports: []ServicePort{
101-
{
102-
Protocol: port.Protocol,
103-
Port: port.NodePort,
104-
},
105-
},
106-
})
107-
}
108-
}
109-
110-
return externalEndpoints
111-
}
112-
113-
// Returns localhost endpoints for specified node port or load balancer service.
114-
func getLocalhostEndpoints(service api.Service) []Endpoint {
115-
var externalEndpoints []Endpoint
116-
for _, port := range service.Spec.Ports {
117-
externalEndpoints = append(externalEndpoints, Endpoint{
118-
Host: "localhost",
119-
Ports: []ServicePort{
120-
{
121-
Protocol: port.Protocol,
122-
Port: port.NodePort,
123-
},
124-
},
125-
})
126-
}
127-
return externalEndpoints
128-
}
129-
13069
// Returns external endpoint name for the given service properties.
13170
func getExternalEndpoint(ingress api.LoadBalancerIngress, ports []api.ServicePort) Endpoint {
13271
var host string
@@ -141,21 +80,6 @@ func getExternalEndpoint(ingress api.LoadBalancerIngress, ports []api.ServicePor
14180
}
14281
}
14382

144-
// Returns only unique external ip addresses.
145-
func getUniqueExternalAddresses(addresses []api.NodeAddress) []api.NodeAddress {
146-
visited := make(map[string]bool, 0)
147-
result := make([]api.NodeAddress, 0)
148-
149-
for _, elem := range addresses {
150-
if !visited[elem.Address] && elem.Type == api.NodeExternalIP {
151-
visited[elem.Address] = true
152-
result = append(result, elem)
153-
}
154-
}
155-
156-
return result
157-
}
158-
15983
// GetNodeByName returns the node with the given name from the list
16084
func GetNodeByName(nodes []api.Node, nodeName string) *api.Node {
16185
for _, node := range nodes {

src/app/backend/resource/daemonset/daemonsetdetail.go

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
resourceService "github.com/kubernetes/dashboard/resource/service"
2424
"k8s.io/kubernetes/pkg/api"
2525
unversioned "k8s.io/kubernetes/pkg/api/unversioned"
26-
"k8s.io/kubernetes/pkg/apis/extensions"
2726
k8sClient "k8s.io/kubernetes/pkg/client/unversioned"
2827
"k8s.io/kubernetes/pkg/fields"
2928
"k8s.io/kubernetes/pkg/labels"
@@ -70,11 +69,6 @@ func GetDaemonSetDetail(client k8sClient.Interface, heapsterClient client.Heapst
7069
FieldSelector: fields.Everything(),
7170
})
7271

73-
nodes, err := client.Nodes().List(api.ListOptions{
74-
LabelSelector: labels.Everything(),
75-
FieldSelector: fields.Everything(),
76-
})
77-
7872
if err != nil {
7973
return nil, err
8074
}
@@ -91,7 +85,7 @@ func GetDaemonSetDetail(client k8sClient.Interface, heapsterClient client.Heapst
9185

9286
for _, service := range matchingServices {
9387
daemonSetDetail.ServiceList.Services = append(daemonSetDetail.ServiceList.Services,
94-
getService(service, *daemonSet, pods.Items, nodes.Items))
88+
resourceService.ToService(&service))
9589
}
9690

9791
for _, container := range daemonSet.Spec.Template.Spec.Containers {
@@ -138,7 +132,7 @@ func DeleteDaemonSet(client k8sClient.Interface, namespace, name string,
138132
return nil
139133
}
140134

141-
// Deletes services related to daemon set with given name in given namespace.
135+
// DeleteDaemonSetServices deletes services related to daemon set with given name in given namespace.
142136
func DeleteDaemonSetServices(client k8sClient.Interface, namespace, name string) error {
143137
log.Printf("Deleting services related to %s daemon set from %s namespace", name,
144138
namespace)
@@ -169,14 +163,3 @@ func DeleteDaemonSetServices(client k8sClient.Interface, namespace, name string)
169163

170164
return nil
171165
}
172-
173-
// Returns detailed information about service from given service
174-
func getService(service api.Service, daemonSet extensions.DaemonSet,
175-
pods []api.Pod, nodes []api.Node) resourceService.Service {
176-
177-
result := resourceService.ToService(&service)
178-
// TODO: This may be wrong as we dont use all attributes from selector
179-
result.ExternalEndpoints = common.GetExternalEndpoints(daemonSet.Spec.Selector.MatchLabels, pods, service, nodes)
180-
181-
return result
182-
}

src/app/backend/resource/daemonset/daemonsetlist.go

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@ type DaemonSet struct {
4141

4242
// Container images of the Daemon Set.
4343
ContainerImages []string `json:"containerImages"`
44-
45-
// Internal endpoints of all Kubernetes services have the same label selector as this Daemon Set.
46-
InternalEndpoints []common.Endpoint `json:"internalEndpoints"`
47-
48-
// External endpoints of all Kubernetes services have the same label selector as this Daemon Set.
49-
ExternalEndpoints []common.Endpoint `json:"externalEndpoints"`
5044
}
5145

5246
// GetDaemonSetList returns a list of all Daemon Set in the cluster.
@@ -57,7 +51,6 @@ func GetDaemonSetList(client *client.Client, nsQuery *common.NamespaceQuery) (*D
5751
ServiceList: common.GetServiceListChannel(client, nsQuery, 1),
5852
PodList: common.GetPodListChannel(client, nsQuery, 1),
5953
EventList: common.GetEventListChannel(client, nsQuery, 1),
60-
NodeList: common.GetNodeListChannel(client, 1),
6154
}
6255

6356
return GetDaemonSetListFromChannels(channels)
@@ -73,11 +66,6 @@ func GetDaemonSetListFromChannels(channels *common.ResourceChannels) (
7366
return nil, err
7467
}
7568

76-
services := <-channels.ServiceList.List
77-
if err := <-channels.ServiceList.Error; err != nil {
78-
return nil, err
79-
}
80-
8169
pods := <-channels.PodList.List
8270
if err := <-channels.PodList.Error; err != nil {
8371
return nil, err
@@ -88,38 +76,21 @@ func GetDaemonSetListFromChannels(channels *common.ResourceChannels) (
8876
return nil, err
8977
}
9078

91-
nodes := <-channels.NodeList.List
92-
if err := <-channels.NodeList.Error; err != nil {
93-
return nil, err
94-
}
95-
96-
result := getDaemonSetList(daemonSets.Items, services.Items,
97-
pods.Items, events.Items, nodes.Items)
79+
result := getDaemonSetList(daemonSets.Items, pods.Items, events.Items)
9880

9981
return result, nil
10082
}
10183

10284
// Returns a list of all Daemon Set model objects in the cluster, based on all Kubernetes
10385
// Daemon Set and Service API objects.
10486
// The function processes all Daemon Set API objects and finds matching Services for them.
105-
func getDaemonSetList(daemonSets []extensions.DaemonSet,
106-
services []api.Service, pods []api.Pod, events []api.Event,
107-
nodes []api.Node) *DaemonSetList {
87+
func getDaemonSetList(daemonSets []extensions.DaemonSet, pods []api.Pod,
88+
events []api.Event) *DaemonSetList {
10889

10990
daemonSetList := &DaemonSetList{DaemonSets: make([]DaemonSet, 0)}
11091

11192
for _, daemonSet := range daemonSets {
11293

113-
matchingServices := getMatchingServicesforDS(services, &daemonSet)
114-
var internalEndpoints []common.Endpoint
115-
var externalEndpoints []common.Endpoint
116-
for _, service := range matchingServices {
117-
internalEndpoints = append(internalEndpoints,
118-
common.GetInternalEndpoint(service.Name, service.Namespace, service.Spec.Ports))
119-
// TODO: This may be wrong as we dont use all attributes from selector
120-
externalEndpoints = common.GetExternalEndpoints(daemonSet.Spec.Selector.MatchLabels, pods, service, nodes)
121-
}
122-
12394
matchingPods := make([]api.Pod, 0)
12495
for _, pod := range pods {
12596
if pod.ObjectMeta.Namespace == daemonSet.ObjectMeta.Namespace &&
@@ -134,12 +105,10 @@ func getDaemonSetList(daemonSets []extensions.DaemonSet,
134105

135106
daemonSetList.DaemonSets = append(daemonSetList.DaemonSets,
136107
DaemonSet{
137-
ObjectMeta: common.NewObjectMeta(daemonSet.ObjectMeta),
138-
TypeMeta: common.NewTypeMeta(common.ResourceKindDaemonSet),
139-
Pods: podInfo,
140-
ContainerImages: common.GetContainerImages(&daemonSet.Spec.Template.Spec),
141-
InternalEndpoints: internalEndpoints,
142-
ExternalEndpoints: externalEndpoints,
108+
ObjectMeta: common.NewObjectMeta(daemonSet.ObjectMeta),
109+
TypeMeta: common.NewTypeMeta(common.ResourceKindDaemonSet),
110+
Pods: podInfo,
111+
ContainerImages: common.GetContainerImages(&daemonSet.Spec.Template.Spec),
143112
})
144113
}
145114

src/app/backend/resource/deployment/deploymentdetail.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ func GetDeploymentDetail(client client.Interface, namespace string,
8585
common.NewSameNamespaceQuery(namespace), options, 1),
8686
PodList: common.GetPodListChannelWithOptions(client,
8787
common.NewSameNamespaceQuery(namespace), options, 1),
88+
EventList: common.GetEventListChannelWithOptions(client,
89+
common.NewSameNamespaceQuery(namespace), options, 1),
8890
}
8991

9092
rsList := <-channels.ReplicaSetList.List
@@ -97,6 +99,11 @@ func GetDeploymentDetail(client client.Interface, namespace string,
9799
return nil, err
98100
}
99101

102+
eventList := <-channels.EventList.List
103+
if err := <-channels.EventList.Error; err != nil {
104+
return nil, err
105+
}
106+
100107
oldReplicaSets, _, err := deploymentutil.FindOldReplicaSets(deployment, rsList.Items, podList)
101108
if err != nil {
102109
return nil, err
@@ -107,18 +114,18 @@ func GetDeploymentDetail(client client.Interface, namespace string,
107114
return nil, err
108115
}
109116

110-
events, err := GetDeploymentEvents(client, namespace, name)
117+
events, err := GetDeploymentEvents(eventList.Items, namespace, name)
111118
if err != nil {
112119
return nil, err
113120
}
114121

115122
return getDeploymentDetail(deployment, oldReplicaSets, newReplicaSet,
116-
podList.Items, events), nil
123+
podList.Items, events, eventList.Items), nil
117124
}
118125

119126
func getDeploymentDetail(deployment *extensions.Deployment,
120127
oldRs []*extensions.ReplicaSet, newRs *extensions.ReplicaSet,
121-
pods []api.Pod, events *common.EventList) *DeploymentDetail {
128+
pods []api.Pod, events *common.EventList, rawEvents []api.Event) *DeploymentDetail {
122129
var newReplicaSet replicaset.ReplicaSet
123130

124131
if newRs != nil {
@@ -130,8 +137,7 @@ func getDeploymentDetail(deployment *extensions.Deployment,
130137
for i, replicaSet := range oldRs {
131138
oldReplicaSets[i] = *replicaSet
132139
}
133-
oldReplicaSetList := replicaset.ToReplicaSetList(oldReplicaSets,
134-
[]api.Service{}, pods, []api.Event{}, []api.Node{})
140+
oldReplicaSetList := replicaset.ToReplicaSetList(oldReplicaSets, pods, rawEvents)
135141

136142
return &DeploymentDetail{
137143
ObjectMeta: common.NewObjectMeta(deployment.ObjectMeta),

src/app/backend/resource/deployment/deploymentevents.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@ package deployment
33
import (
44
"log"
55

6+
"k8s.io/kubernetes/pkg/api"
7+
68
"github.com/kubernetes/dashboard/resource/common"
79
"github.com/kubernetes/dashboard/resource/event"
8-
client "k8s.io/kubernetes/pkg/client/unversioned"
910
)
1011

11-
func GetDeploymentEvents(client client.Interface, namespace string, deploymentName string) (*common.EventList, error) {
12+
// GetDeploymentEvents returns model events for a deployment with the given name in the given
13+
// namespace
14+
func GetDeploymentEvents(dpEvents []api.Event, namespace string,
15+
deploymentName string) (*common.EventList, error) {
1216

1317
log.Printf("Getting events related to %s deployment in %s namespace", deploymentName,
1418
namespace)
1519

16-
// Get events for deployment.
17-
dpEvents, err := event.GetEvents(client, namespace, deploymentName)
18-
if err != nil {
19-
return nil, err
20-
}
21-
2220
if !event.IsTypeFilled(dpEvents) {
2321
dpEvents = event.FillEventsType(dpEvents)
2422
}

src/app/backend/resource/deployment/deploymentlist.go

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,8 @@ func GetDeploymentList(client client.Interface, nsQuery *common.NamespaceQuery)
5252

5353
channels := &common.ResourceChannels{
5454
DeploymentList: common.GetDeploymentListChannel(client.Extensions(), nsQuery, 1),
55-
ServiceList: common.GetServiceListChannel(client, nsQuery, 1),
5655
PodList: common.GetPodListChannel(client, nsQuery, 1),
5756
EventList: common.GetEventListChannel(client, nsQuery, 1),
58-
NodeList: common.GetNodeListChannel(client, 1),
5957
}
6058

6159
return GetDeploymentListFromChannels(channels)
@@ -80,11 +78,6 @@ func GetDeploymentListFromChannels(channels *common.ResourceChannels) (
8078
return nil, err
8179
}
8280

83-
services := <-channels.ServiceList.List
84-
if err := <-channels.ServiceList.Error; err != nil {
85-
return nil, err
86-
}
87-
8881
pods := <-channels.PodList.List
8982
if err := <-channels.PodList.Error; err != nil {
9083
return nil, err
@@ -95,18 +88,11 @@ func GetDeploymentListFromChannels(channels *common.ResourceChannels) (
9588
return nil, err
9689
}
9790

98-
nodes := <-channels.NodeList.List
99-
if err := <-channels.NodeList.Error; err != nil {
100-
return nil, err
101-
}
102-
103-
return getDeploymentList(deployments.Items, services.Items, pods.Items, events.Items,
104-
nodes.Items), nil
91+
return getDeploymentList(deployments.Items, pods.Items, events.Items), nil
10592
}
10693

107-
func getDeploymentList(deployments []extensions.Deployment,
108-
services []api.Service, pods []api.Pod, events []api.Event,
109-
nodes []api.Node) *DeploymentList {
94+
func getDeploymentList(deployments []extensions.Deployment, pods []api.Pod,
95+
events []api.Event) *DeploymentList {
11096

11197
deploymentList := &DeploymentList{
11298
Deployments: make([]Deployment, 0),

0 commit comments

Comments
 (0)