Merge pull request #47162 from FengyunPan/display-none

Automatic merge from submit-queue (batch tested with PRs 47162, 48444, 48445)

Fix output extra comma

/# kubectl get service
NAME                     CLUSTER-IP       EXTERNAL-IP               PORT(S)          AGE
nginx-service-test       10.200.6.109     _**,80.11.12.10**_              8000:31637/TCP   6s
**(output a extra comma)**
except: 
nginx-service-test       10.200.6.109     _**80.11.12.10**_              8000:31637/TCP   6s

/# cat lb.yaml 
apiVersion: v1 
kind: Service 
metadata: 
  name: nginx-service-lb3
spec: 
  ports: 
    - port: 8000
      targetPort: 80 
      protocol: TCP 
  type: LoadBalancer
  selector: 
    name: nginx
  externalIPs: 
    - 80.11.12.10
    - 1.2.3.6
/# kubectl create -f lb.yaml
This commit is contained in:
Kubernetes Submit Queue 2017-07-05 06:39:27 -07:00 committed by GitHub
commit e5419a56db
2 changed files with 129 additions and 7 deletions

View File

@ -666,8 +666,12 @@ func getServiceExternalIP(svc *api.Service, wide bool) string {
case api.ServiceTypeLoadBalancer: case api.ServiceTypeLoadBalancer:
lbIps := loadBalancerStatusStringer(svc.Status.LoadBalancer, wide) lbIps := loadBalancerStatusStringer(svc.Status.LoadBalancer, wide)
if len(svc.Spec.ExternalIPs) > 0 { if len(svc.Spec.ExternalIPs) > 0 {
result := append(strings.Split(lbIps, ","), svc.Spec.ExternalIPs...) results := []string{}
return strings.Join(result, ",") if len(lbIps) > 0 {
results = append(results, strings.Split(lbIps, ",")...)
}
results = append(results, svc.Spec.ExternalIPs...)
return strings.Join(results, ",")
} }
if len(lbIps) > 0 { if len(lbIps) > 0 {
return lbIps return lbIps
@ -696,7 +700,14 @@ func printService(svc *api.Service, w io.Writer, options printers.PrintOptions)
namespace := svc.Namespace namespace := svc.Namespace
svcType := svc.Spec.Type svcType := svc.Spec.Type
internalIP := svc.Spec.ClusterIP internalIP := svc.Spec.ClusterIP
if len(internalIP) == 0 {
internalIP = "<none>"
}
externalIP := getServiceExternalIP(svc, options.Wide) externalIP := getServiceExternalIP(svc, options.Wide)
svcPorts := makePortString(svc.Spec.Ports)
if len(svcPorts) == 0 {
svcPorts = "<none>"
}
if options.WithNamespace { if options.WithNamespace {
if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil { if _, err := fmt.Fprintf(w, "%s\t", namespace); err != nil {
@ -708,7 +719,7 @@ func printService(svc *api.Service, w io.Writer, options printers.PrintOptions)
string(svcType), string(svcType),
internalIP, internalIP,
externalIP, externalIP,
makePortString(svc.Spec.Ports), svcPorts,
translateTimestamp(svc.CreationTimestamp), translateTimestamp(svc.CreationTimestamp),
); err != nil { ); err != nil {
return err return err

View File

@ -2322,6 +2322,8 @@ func TestPrintPodShowLabels(t *testing.T) {
} }
func TestPrintService(t *testing.T) { func TestPrintService(t *testing.T) {
single_ExternalIP := []string{"80.11.12.10"}
mul_ExternalIP := []string{"80.11.12.10", "80.11.12.11"}
tests := []struct { tests := []struct {
service api.Service service api.Service
expect string expect string
@ -2333,8 +2335,10 @@ func TestPrintService(t *testing.T) {
Spec: api.ServiceSpec{ Spec: api.ServiceSpec{
Type: api.ServiceTypeClusterIP, Type: api.ServiceTypeClusterIP,
Ports: []api.ServicePort{ Ports: []api.ServicePort{
{Protocol: "tcp", {
Port: 2233}, Protocol: "tcp",
Port: 2233,
},
}, },
ClusterIP: "10.9.8.7", ClusterIP: "10.9.8.7",
}, },
@ -2342,13 +2346,14 @@ func TestPrintService(t *testing.T) {
"test1\tClusterIP\t10.9.8.7\t<none>\t2233/tcp\t<unknown>\n", "test1\tClusterIP\t10.9.8.7\t<none>\t2233/tcp\t<unknown>\n",
}, },
{ {
// Test name, cluster ip, port:nodePort with protocol // Test NodePort service
api.Service{ api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test2"}, ObjectMeta: metav1.ObjectMeta{Name: "test2"},
Spec: api.ServiceSpec{ Spec: api.ServiceSpec{
Type: api.ServiceTypeNodePort, Type: api.ServiceTypeNodePort,
Ports: []api.ServicePort{ Ports: []api.ServicePort{
{Protocol: "tcp", {
Protocol: "tcp",
Port: 8888, Port: 8888,
NodePort: 9999, NodePort: 9999,
}, },
@ -2358,6 +2363,112 @@ func TestPrintService(t *testing.T) {
}, },
"test2\tNodePort\t10.9.8.7\t<none>\t8888:9999/tcp\t<unknown>\n", "test2\tNodePort\t10.9.8.7\t<none>\t8888:9999/tcp\t<unknown>\n",
}, },
{
// Test LoadBalancer service
api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test3"},
Spec: api.ServiceSpec{
Type: api.ServiceTypeLoadBalancer,
Ports: []api.ServicePort{
{
Protocol: "tcp",
Port: 8888,
},
},
ClusterIP: "10.9.8.7",
},
},
"test3\tLoadBalancer\t10.9.8.7\t<pending>\t8888/tcp\t<unknown>\n",
},
{
// Test LoadBalancer service with single ExternalIP and no LoadBalancerStatus
api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test4"},
Spec: api.ServiceSpec{
Type: api.ServiceTypeLoadBalancer,
Ports: []api.ServicePort{
{
Protocol: "tcp",
Port: 8888,
},
},
ClusterIP: "10.9.8.7",
ExternalIPs: single_ExternalIP,
},
},
"test4\tLoadBalancer\t10.9.8.7\t80.11.12.10\t8888/tcp\t<unknown>\n",
},
{
// Test LoadBalancer service with single ExternalIP
api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test5"},
Spec: api.ServiceSpec{
Type: api.ServiceTypeLoadBalancer,
Ports: []api.ServicePort{
{
Protocol: "tcp",
Port: 8888,
},
},
ClusterIP: "10.9.8.7",
ExternalIPs: single_ExternalIP,
},
Status: api.ServiceStatus{
LoadBalancer: api.LoadBalancerStatus{
Ingress: []api.LoadBalancerIngress{
{
IP: "3.4.5.6",
Hostname: "test.cluster.com",
},
},
},
},
},
"test5\tLoadBalancer\t10.9.8.7\t3.4.5.6,80.11.12.10\t8888/tcp\t<unknown>\n",
},
{
// Test LoadBalancer service with mul ExternalIPs
api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test6"},
Spec: api.ServiceSpec{
Type: api.ServiceTypeLoadBalancer,
Ports: []api.ServicePort{
{
Protocol: "tcp",
Port: 8888,
},
},
ClusterIP: "10.9.8.7",
ExternalIPs: mul_ExternalIP,
},
Status: api.ServiceStatus{
LoadBalancer: api.LoadBalancerStatus{
Ingress: []api.LoadBalancerIngress{
{
IP: "2.3.4.5",
Hostname: "test.cluster.local",
},
{
IP: "3.4.5.6",
Hostname: "test.cluster.com",
},
},
},
},
},
"test6\tLoadBalancer\t10.9.8.7\t2.3.4.5,3.4.5.6,80.11.12.10,80.11.12.11\t8888/tcp\t<unknown>\n",
},
{
// Test ExternalName service
api.Service{
ObjectMeta: metav1.ObjectMeta{Name: "test7"},
Spec: api.ServiceSpec{
Type: api.ServiceTypeExternalName,
ExternalName: "my.database.example.com",
},
},
"test7\tExternalName\t<none>\tmy.database.example.com\t<none>\t<unknown>\n",
},
} }
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})