refact jobs
parent
6b2adca0c0
commit
125e70ebb6
|
|
@ -136,9 +136,9 @@ func makeSAR(ns, name, resURL string) *authorizationv1.SelfSubjectAccessReview {
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanIAccess checks if user has access to a certain resource.
|
// CanIAccess checks if user has access to a certain resource.
|
||||||
func (a *APIClient) canIAccess(ns, name, resURL string, verbs []string) (bool, error) {
|
func canIAccess(conn Connection, ns, name, resURL string, verbs []string) (bool, error) {
|
||||||
sar := makeSAR(ns, name, resURL)
|
sar := makeSAR(ns, name, resURL)
|
||||||
dial := a.DialOrDie().AuthorizationV1().SelfSubjectAccessReviews()
|
dial := conn.DialOrDie().AuthorizationV1().SelfSubjectAccessReviews()
|
||||||
for _, v := range verbs {
|
for _, v := range verbs {
|
||||||
sar.Spec.ResourceAttributes.Verb = v
|
sar.Spec.ResourceAttributes.Verb = v
|
||||||
resp, err := dial.Create(sar)
|
resp, err := dial.Create(sar)
|
||||||
|
|
@ -194,7 +194,6 @@ func (a *APIClient) NodePods(node string) (*v1.PodList, error) {
|
||||||
func (a *APIClient) IsNamespaced(res string) bool {
|
func (a *APIClient) IsNamespaced(res string) bool {
|
||||||
list, _ := a.DialOrDie().Discovery().ServerPreferredResources()
|
list, _ := a.DialOrDie().Discovery().ServerPreferredResources()
|
||||||
for _, l := range list {
|
for _, l := range list {
|
||||||
log.Debug().Msgf("GV %s", l.GroupVersion)
|
|
||||||
for _, r := range l.APIResources {
|
for _, r := range l.APIResources {
|
||||||
if r.Name == res {
|
if r.Name == res {
|
||||||
return r.Namespaced
|
return r.Namespaced
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ func (r *Container) Fields(ns string) Row {
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Helpers...
|
// Helpers...
|
||||||
|
|
||||||
func gatherMetrics(co v1.Container, mx *mv1beta1.PodMetrics) (scpu string, smem string, pcpu string, pmem string) {
|
func gatherMetrics(co v1.Container, mx *mv1beta1.PodMetrics) (scpu, smem, pcpu, pmem string) {
|
||||||
scpu, smem, pcpu, pmem = NAValue, NAValue, NAValue, NAValue
|
scpu, smem, pcpu, pmem = NAValue, NAValue, NAValue, NAValue
|
||||||
if mx == nil {
|
if mx == nil {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -129,20 +129,14 @@ func (r *Job) Fields(ns string) Row {
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Helpers...
|
// Helpers...
|
||||||
|
|
||||||
|
const maxShow = 2
|
||||||
|
|
||||||
func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
||||||
cc := make([]string, 0, len(p.InitContainers)+len(p.Containers))
|
cc, ii := parseContainers(p.InitContainers)
|
||||||
ii := make([]string, 0, len(cc))
|
cn, ci := parseContainers(p.Containers)
|
||||||
|
|
||||||
for _, c := range p.InitContainers {
|
cc, ii = append(cc, cn...), append(ii, ci...)
|
||||||
cc = append(cc, c.Name)
|
|
||||||
ii = append(ii, c.Image)
|
|
||||||
}
|
|
||||||
for _, c := range p.Containers {
|
|
||||||
cc = append(cc, c.Name)
|
|
||||||
ii = append(ii, c.Image)
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxShow = 2
|
|
||||||
// Limit to 2 of each...
|
// Limit to 2 of each...
|
||||||
if len(cc) > maxShow {
|
if len(cc) > maxShow {
|
||||||
cc = append(cc[:2], "(+"+strconv.Itoa(len(cc)-maxShow)+")...")
|
cc = append(cc[:2], "(+"+strconv.Itoa(len(cc)-maxShow)+")...")
|
||||||
|
|
@ -154,6 +148,15 @@ func (*Job) toContainers(p v1.PodSpec) (string, string) {
|
||||||
return strings.Join(cc, ","), strings.Join(ii, ",")
|
return strings.Join(cc, ","), strings.Join(ii, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseContainers(cos []v1.Container) (nn, ii []string) {
|
||||||
|
for _, co := range cos {
|
||||||
|
nn = append(nn, co.Name)
|
||||||
|
ii = append(ii, co.Image)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nn, ii
|
||||||
|
}
|
||||||
|
|
||||||
func (*Job) toCompletion(spec batchv1.JobSpec, status batchv1.JobStatus) (s string) {
|
func (*Job) toCompletion(spec batchv1.JobSpec, status batchv1.JobStatus) (s string) {
|
||||||
if spec.Completions != nil {
|
if spec.Completions != nil {
|
||||||
return strconv.Itoa(int(status.Succeeded)) + "/" + strconv.Itoa(int(*spec.Completions))
|
return strconv.Itoa(int(status.Succeeded)) + "/" + strconv.Itoa(int(*spec.Completions))
|
||||||
|
|
|
||||||
|
|
@ -276,15 +276,7 @@ func (r *Pod) Fields(ns string) Row {
|
||||||
|
|
||||||
ss := i.Status.ContainerStatuses
|
ss := i.Status.ContainerStatuses
|
||||||
cr, _, rc := r.statuses(ss)
|
cr, _, rc := r.statuses(ss)
|
||||||
|
ccpu, cmem, pcpu, pmem := r.gatherPodMetrics(i)
|
||||||
ccpu, cmem, pcpu, pmem := NAValue, NAValue, NAValue, NAValue
|
|
||||||
if r.metrics != nil {
|
|
||||||
c, m := r.currentRes(r.metrics)
|
|
||||||
ccpu, cmem = ToMillicore(c.MilliValue()), ToMi(k8s.ToMB(m.Value()))
|
|
||||||
rc, rm := r.requestedRes(i)
|
|
||||||
pcpu = AsPerc(toPerc(float64(c.MilliValue()), float64(rc.MilliValue())))
|
|
||||||
pmem = AsPerc(toPerc(k8s.ToMB(m.Value()), k8s.ToMB(rm.Value())))
|
|
||||||
}
|
|
||||||
|
|
||||||
return append(ff,
|
return append(ff,
|
||||||
i.ObjectMeta.Name,
|
i.ObjectMeta.Name,
|
||||||
|
|
@ -305,6 +297,21 @@ func (r *Pod) Fields(ns string) Row {
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Helpers...
|
// Helpers...
|
||||||
|
|
||||||
|
func (r *Pod) gatherPodMetrics(po *v1.Pod) (ccpu, cmem, pcpu, pmem string) {
|
||||||
|
ccpu, cmem, pcpu, pmem = NAValue, NAValue, NAValue, NAValue
|
||||||
|
if r.metrics == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c, m := r.currentRes(r.metrics)
|
||||||
|
ccpu, cmem = ToMillicore(c.MilliValue()), ToMi(k8s.ToMB(m.Value()))
|
||||||
|
rc, rm := r.requestedRes(po)
|
||||||
|
pcpu = AsPerc(toPerc(float64(c.MilliValue()), float64(rc.MilliValue())))
|
||||||
|
pmem = AsPerc(toPerc(k8s.ToMB(m.Value()), k8s.ToMB(rm.Value())))
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func containerResources(co v1.Container) (cpu, mem *resource.Quantity) {
|
func containerResources(co v1.Container) (cpu, mem *resource.Quantity) {
|
||||||
req, limit := co.Resources.Requests, co.Resources.Limits
|
req, limit := co.Resources.Requests, co.Resources.Limits
|
||||||
switch {
|
switch {
|
||||||
|
|
|
||||||
|
|
@ -148,14 +148,10 @@ func (v *svcView) reloadBenchCfg() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *svcView) benchCmd(evt *tcell.EventKey) *tcell.EventKey {
|
func (v *svcView) benchCmd(evt *tcell.EventKey) *tcell.EventKey {
|
||||||
if !v.rowSelected() {
|
if !v.rowSelected() || v.bench != nil {
|
||||||
return evt
|
return evt
|
||||||
}
|
}
|
||||||
|
|
||||||
if v.bench != nil {
|
|
||||||
v.app.flash().err(errors.New("Only one benchmark allowed at a time"))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if err := v.reloadBenchCfg(); err != nil {
|
if err := v.reloadBenchCfg(); err != nil {
|
||||||
v.app.flash().err(err)
|
v.app.flash().err(err)
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -197,28 +193,32 @@ func (v *svcView) runBenchmark(port string, cfg config.BenchConfig) error {
|
||||||
|
|
||||||
v.app.status(flashWarn, "Benchmark in progress...")
|
v.app.status(flashWarn, "Benchmark in progress...")
|
||||||
log.Debug().Msg("Bench starting...")
|
log.Debug().Msg("Bench starting...")
|
||||||
go v.bench.run(v.app.config.K9s.CurrentCluster, func() {
|
go v.bench.run(v.app.config.K9s.CurrentCluster, v.benchDone)
|
||||||
log.Debug().Msg("Bench Completed!")
|
|
||||||
v.app.QueueUpdate(func() {
|
|
||||||
if v.bench.canceled {
|
|
||||||
v.app.status(flashInfo, "Benchmark canceled")
|
|
||||||
} else {
|
|
||||||
v.app.status(flashInfo, "Benchmark Completed!")
|
|
||||||
v.bench.cancel()
|
|
||||||
}
|
|
||||||
v.bench = nil
|
|
||||||
go func() {
|
|
||||||
<-time.After(2 * time.Second)
|
|
||||||
v.app.QueueUpdate(func() {
|
|
||||||
v.app.statusReset()
|
|
||||||
})
|
|
||||||
}()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *svcView) benchDone() {
|
||||||
|
log.Debug().Msg("Bench Completed!")
|
||||||
|
v.app.QueueUpdate(func() {
|
||||||
|
if v.bench.canceled {
|
||||||
|
v.app.status(flashInfo, "Benchmark canceled")
|
||||||
|
} else {
|
||||||
|
v.app.status(flashInfo, "Benchmark Completed!")
|
||||||
|
v.bench.cancel()
|
||||||
|
}
|
||||||
|
v.bench = nil
|
||||||
|
go benchTimedOut(v.app)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchTimedOut(app *appView) {
|
||||||
|
<-time.After(2 * time.Second)
|
||||||
|
app.QueueUpdate(func() {
|
||||||
|
app.statusReset()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (v *svcView) showSvcPods(ns string, sel map[string]string, b actionHandler) {
|
func (v *svcView) showSvcPods(ns string, sel map[string]string, b actionHandler) {
|
||||||
var s []string
|
var s []string
|
||||||
for k, v := range sel {
|
for k, v := range sel {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue