-
Notifications
You must be signed in to change notification settings - Fork 1
/
port_forward_describer.go
87 lines (70 loc) · 2.3 KB
/
port_forward_describer.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
/*
Copyright (c) 2019 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package clusteroverview
import (
"context"
"github.com/vmware/octant/internal/describer"
"github.com/vmware/octant/internal/portforward"
"github.com/vmware/octant/pkg/view/component"
)
// PortForwardListDescriber describes a list of port-forwards
type PortForwardListDescriber struct {
}
func NewPortForwardListDescriber() *PortForwardListDescriber {
return &PortForwardListDescriber{}
}
var _ describer.Describer = (*PortForwardListDescriber)(nil)
// Describe describes a list of port forwards as content
func (d *PortForwardListDescriber) Describe(ctx context.Context, namespace string, options describer.Options) (component.ContentResponse, error) {
portForwarder := options.PortForwarder()
list := component.NewList("Port Forwards", nil)
tblCols := component.NewTableCols("Name", "Namespace", "Ports", "Age")
tbl := component.NewTable("Port Forwards", "There are no port forwards!", tblCols)
list.Add(tbl)
for _, pf := range portForwarder.List(ctx) {
t := &pf.Target
apiVersion, kind := t.GVK.ToAPIVersionAndKind()
nameLink, err := options.Link.ForGVK(t.Namespace, apiVersion, kind, t.Name, t.Name)
if err != nil {
return component.EmptyContentResponse, err
}
pfRow := component.TableRow{
"Name": nameLink,
"Namespace": component.NewText(t.Namespace),
"Ports": component.NewPorts(describePortForwardPorts(pf)),
"Age": component.NewTimestamp(pf.CreatedAt),
}
tbl.Add(pfRow)
}
return component.ContentResponse{
Components: []component.Component{list},
}, nil
}
func (d *PortForwardListDescriber) PathFilters() []describer.PathFilter {
filter := describer.NewPathFilter("/port-forward", d)
return []describer.PathFilter{*filter}
}
func (d *PortForwardListDescriber) Reset(ctx context.Context) error {
return nil
}
func describePortForwardPorts(pf portforward.State) []component.Port {
var list []component.Port
apiVersion, kind := pf.Target.GVK.ToAPIVersionAndKind()
pfs := component.PortForwardState{}
for _, p := range pf.Ports {
pfs.ID = pf.ID
pfs.Port = int(p.Local)
pfs.IsForwarded = true
port := component.NewPort(
pf.Target.Namespace,
apiVersion,
kind,
pf.Target.Name,
int(p.Remote),
"TCP", pfs)
list = append(list, *port)
}
return list
}