-
Notifications
You must be signed in to change notification settings - Fork 301
/
serviceport.go
114 lines (97 loc) · 3.33 KB
/
serviceport.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package utils
import (
"fmt"
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
"k8s.io/api/networking/v1beta1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/ingress-gce/pkg/annotations"
backendconfigv1 "k8s.io/ingress-gce/pkg/apis/backendconfig/v1"
"k8s.io/ingress-gce/pkg/utils/namer"
)
// ServicePortID contains the Service and Port fields.
type ServicePortID struct {
Service types.NamespacedName
Port intstr.IntOrString
}
func (id ServicePortID) String() string {
return fmt.Sprintf("%v/%v", id.Service.String(), id.Port.String())
}
// ServicePort maintains configuration for a single backend.
type ServicePort struct {
// Ingress backend-specified service name and port
ID ServicePortID
NodePort int64
// Numerical port of the Service, retrieved from the Service
Port int32
Protocol annotations.AppProtocol
TargetPort string
NEGEnabled bool
VMIPNEGEnabled bool
L7ILBEnabled bool
BackendConfig *backendconfigv1.BackendConfig
BackendNamer namer.BackendNamer
}
// GetAPIVersionFromServicePort returns the compute API version to be used
// for creating NEGs associated with the given ServicePort.
func GetAPIVersionFromServicePort(sp *ServicePort) meta.Version {
if sp.VMIPNEGEnabled {
// this uses VM_IP NEGS which requires alpha API
return meta.VersionAlpha
}
return meta.VersionGA
}
// GetDescription returns a Description for this ServicePort.
func (sp ServicePort) GetDescription() Description {
return Description{
ServiceName: sp.ID.Service.String(),
ServicePort: sp.ID.Port.String(),
}
}
// BackendName returns the name of the backend which would be used for this ServicePort.
func (sp ServicePort) BackendName() string {
if sp.NEGEnabled {
return sp.BackendNamer.NEG(sp.ID.Service.Namespace, sp.ID.Service.Name, sp.Port)
} else if sp.VMIPNEGEnabled {
return sp.BackendNamer.VMIPNEG(sp.ID.Service.Namespace, sp.ID.Service.Name)
}
return sp.BackendNamer.IGBackend(sp.NodePort)
}
// IGName returns the name of the instance group which would be used for this ServicePort.
func (sp ServicePort) IGName() string {
return sp.BackendNamer.InstanceGroup()
}
// BackendToServicePortID creates a ServicePortID from a given IngressBackend and namespace.
func BackendToServicePortID(be v1beta1.IngressBackend, namespace string) ServicePortID {
return ServicePortID{
Service: types.NamespacedName{
Name: be.ServiceName,
Namespace: namespace,
},
Port: be.ServicePort,
}
}
// NewServicePortWithID returns a ServicePort with only ID.
func NewServicePortWithID(svcName, svcNamespace string, port intstr.IntOrString) ServicePort {
return ServicePort{
ID: ServicePortID{
Service: types.NamespacedName{
Name: svcName,
Namespace: svcNamespace,
},
Port: port,
},
}
}