...
1
16
17 package polymorphichelpers
18
19 import (
20 "fmt"
21 "strconv"
22
23 appsv1 "k8s.io/api/apps/v1"
24 appsv1beta1 "k8s.io/api/apps/v1beta1"
25 appsv1beta2 "k8s.io/api/apps/v1beta2"
26 corev1 "k8s.io/api/core/v1"
27 extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
28 "k8s.io/apimachinery/pkg/runtime"
29 )
30
31 func multiProtocolsForObject(object runtime.Object) (map[string][]string, error) {
32
33 switch t := object.(type) {
34 case *corev1.ReplicationController:
35 return getMultiProtocols(t.Spec.Template.Spec), nil
36
37 case *corev1.Pod:
38 return getMultiProtocols(t.Spec), nil
39
40 case *corev1.Service:
41 return getServiceMultiProtocols(t.Spec), nil
42
43 case *extensionsv1beta1.Deployment:
44 return getMultiProtocols(t.Spec.Template.Spec), nil
45 case *appsv1.Deployment:
46 return getMultiProtocols(t.Spec.Template.Spec), nil
47 case *appsv1beta2.Deployment:
48 return getMultiProtocols(t.Spec.Template.Spec), nil
49 case *appsv1beta1.Deployment:
50 return getMultiProtocols(t.Spec.Template.Spec), nil
51
52 case *extensionsv1beta1.ReplicaSet:
53 return getMultiProtocols(t.Spec.Template.Spec), nil
54 case *appsv1.ReplicaSet:
55 return getMultiProtocols(t.Spec.Template.Spec), nil
56 case *appsv1beta2.ReplicaSet:
57 return getMultiProtocols(t.Spec.Template.Spec), nil
58
59 default:
60 return nil, fmt.Errorf("cannot extract protocols from %T", object)
61 }
62 }
63
64 func getMultiProtocols(spec corev1.PodSpec) map[string][]string {
65 result := make(map[string][]string)
66 var protocol corev1.Protocol
67 for _, container := range spec.Containers {
68 for _, port := range container.Ports {
69
70 protocol = corev1.ProtocolTCP
71 if len(port.Protocol) > 0 {
72 protocol = port.Protocol
73 }
74 p := strconv.Itoa(int(port.ContainerPort))
75 result[p] = append(result[p], string(protocol))
76 }
77 }
78 return result
79 }
80
81
82 func getServiceMultiProtocols(spec corev1.ServiceSpec) map[string][]string {
83 result := make(map[string][]string)
84 var protocol corev1.Protocol
85 for _, servicePort := range spec.Ports {
86
87 protocol = corev1.ProtocolTCP
88 if len(servicePort.Protocol) > 0 {
89 protocol = servicePort.Protocol
90 }
91 p := strconv.Itoa(int(servicePort.Port))
92 result[p] = append(result[p], string(protocol))
93 }
94 return result
95 }
96
View as plain text