k9s/internal/watch/forwarders.go

106 lines
2.2 KiB
Go

package watch
import (
"strings"
"github.com/derailed/k9s/internal/client"
"github.com/rs/zerolog/log"
"k8s.io/client-go/tools/portforward"
)
// Forwarder represents a port forwarder.
type Forwarder interface {
// Start starts a port-forward.
Start(path, co string, tt []client.PortTunnel) (*portforward.PortForwarder, error)
// Stop terminates a port forward.
Stop()
// Path returns a resource FQN.
Path() string
// Container returns a container name.
Container() string
// Ports returns container exposed ports.
Ports() []string
// FQN returns the full port-forward name.
FQN() string
// Active returns forwarder current state.
Active() bool
// SetActive sets port-forward state.
SetActive(bool)
// Age returns forwarder age.
Age() string
// HasPortMapping returns true if port mapping exists.
HasPortMapping(string) bool
}
// Forwarders tracks active port forwards.
type Forwarders map[string]Forwarder
// NewForwarders returns new forwarders.
func NewForwarders() Forwarders {
return make(map[string]Forwarder)
}
// IsForwarded checks if pod has a forward
func (ff Forwarders) IsPodForwarded(path string) bool {
for k := range ff {
fqn := strings.Split(k, ":")
if fqn[0] == path {
return true
}
}
return false
}
// IsForwarded checks if pod has a forward
func (ff Forwarders) IsContainerForwarded(path, co string) bool {
_, ok := ff[path+":"+co]
return ok
}
// DeleteAll stops and delete all port-forwards.
func (ff Forwarders) DeleteAll() {
for k, f := range ff {
log.Debug().Msgf("Deleting forwarder %s", f.Path())
f.Stop()
delete(ff, k)
}
}
// Kill stops and delete a port-forwards associated with pod.
func (ff Forwarders) Kill(path string) int {
hasContainer := strings.Contains(path, ":")
var stats int
for k, f := range ff {
victim := k
if !hasContainer {
victim = strings.Split(k, ":")[0]
}
if victim == path {
stats++
log.Debug().Msgf("Stop + Delete port-forward %s", k)
f.Stop()
delete(ff, k)
}
}
return stats
}
// Dump for debug!
func (ff Forwarders) Dump() {
log.Debug().Msgf("----------- PORT-FORWARDS --------------")
for k, f := range ff {
log.Debug().Msgf(" %s -- %#v", k, f)
}
}