| /* |
| Copyright 2017 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 util |
| |
| import ( |
| "fmt" |
| "net" |
| "strconv" |
| |
| "k8s.io/klog" |
| ) |
| |
| // LocalPort describes a port on specific IP address and protocol |
| type LocalPort struct { |
| // Description is the identity message of a given local port. |
| Description string |
| // IP is the IP address part of a given local port. |
| // If this string is empty, the port binds to all local IP addresses. |
| IP string |
| // Port is the port part of a given local port. |
| Port int |
| // Protocol is the protocol part of a given local port. |
| // The value is assumed to be lower-case. For example, "udp" not "UDP", "tcp" not "TCP". |
| Protocol string |
| } |
| |
| func (lp *LocalPort) String() string { |
| ipPort := net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port)) |
| return fmt.Sprintf("%q (%s/%s)", lp.Description, ipPort, lp.Protocol) |
| } |
| |
| // Closeable is an interface around closing an port. |
| type Closeable interface { |
| Close() error |
| } |
| |
| // PortOpener is an interface around port opening/closing. |
| // Abstracted out for testing. |
| type PortOpener interface { |
| OpenLocalPort(lp *LocalPort) (Closeable, error) |
| } |
| |
| // RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only |
| // closes the ports opened in this sync. |
| func RevertPorts(replacementPortsMap, originalPortsMap map[LocalPort]Closeable) { |
| for k, v := range replacementPortsMap { |
| // Only close newly opened local ports - leave ones that were open before this update |
| if originalPortsMap[k] == nil { |
| klog.V(2).Infof("Closing local port %s", k.String()) |
| v.Close() |
| } |
| } |
| } |