...
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 portsForObject(object runtime.Object) ([]string, error) {
32 switch t := object.(type) {
33 case *corev1.ReplicationController:
34 return getPorts(t.Spec.Template.Spec), nil
35
36 case *corev1.Pod:
37 return getPorts(t.Spec), nil
38
39 case *corev1.Service:
40 return getServicePorts(t.Spec), nil
41
42 case *extensionsv1beta1.Deployment:
43 return getPorts(t.Spec.Template.Spec), nil
44 case *appsv1.Deployment:
45 return getPorts(t.Spec.Template.Spec), nil
46 case *appsv1beta2.Deployment:
47 return getPorts(t.Spec.Template.Spec), nil
48 case *appsv1beta1.Deployment:
49 return getPorts(t.Spec.Template.Spec), nil
50
51 case *extensionsv1beta1.ReplicaSet:
52 return getPorts(t.Spec.Template.Spec), nil
53 case *appsv1.ReplicaSet:
54 return getPorts(t.Spec.Template.Spec), nil
55 case *appsv1beta2.ReplicaSet:
56 return getPorts(t.Spec.Template.Spec), nil
57 default:
58 return nil, fmt.Errorf("cannot extract ports from %T", object)
59 }
60 }
61
62 func getPorts(spec corev1.PodSpec) []string {
63 var result []string
64 exists := map[string]struct{}{}
65 for _, container := range spec.Containers {
66 for _, port := range container.Ports {
67
68 key := strconv.Itoa(int(port.ContainerPort))
69 if _, ok := exists[key]; !ok {
70 exists[key] = struct{}{}
71 result = append(result, key)
72 }
73 }
74 }
75 return result
76 }
77
78 func getServicePorts(spec corev1.ServiceSpec) []string {
79 var result []string
80 exists := map[string]struct{}{}
81 for _, servicePort := range spec.Ports {
82
83 key := strconv.Itoa(int(servicePort.Port))
84 if _, ok := exists[key]; !ok {
85 exists[key] = struct{}{}
86 result = append(result, key)
87 }
88 }
89 return result
90 }
91
View as plain text