Skip to content

Commit

Permalink
fix: Use JSON output from helm commands (#14)
Browse files Browse the repository at this point in the history
* change package search to json output

* change helm request output from table to json
  • Loading branch information
pidanou authored Dec 21, 2024
1 parent 58122ab commit 351b925
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 113 deletions.
32 changes: 17 additions & 15 deletions releases/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package releases

import (
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"strings"
"time"

"github.com/charmbracelet/bubbles/help"
Expand Down Expand Up @@ -273,40 +273,42 @@ func (m InstallModel) searchLocalPackage() []string {
return []string{}
}
var stdout bytes.Buffer
cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value())
cmd := exec.Command("helm", "search", "repo", m.Inputs[installChartNameStep].Value(), "--output", "json")
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil {
return []string{}
}
results := strings.Split(stdout.String(), "\n")
results = results[1 : len(results)-1]

var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}
var suggestions []string
for _, row := range results {
chart := strings.Fields(row)
suggestions = append(suggestions, chart[0])
for _, p := range pkgs {
suggestions = append(suggestions, p.Name)
}

m.Inputs[installChartNameStep].SetSuggestions(suggestions)
return suggestions
}

func (m InstallModel) searchLocalPackageVersion() []string {
var stdout bytes.Buffer
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions")
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[installChartNameStep].Value()+"\v", "--versions", "--output", "json")
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil {
return []string{}
}
results := strings.Split(stdout.String(), "\n")
results = results[1 : len(results)-1]
var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}

var suggestions []string
for _, row := range results {
chart := strings.Fields(row)
suggestions = append(suggestions, chart[1])
for _, pkg := range pkgs {
suggestions = append(suggestions, pkg.Version)
}

m.Inputs[installChartNameStep].SetSuggestions(suggestions)
Expand Down
56 changes: 21 additions & 35 deletions releases/overview.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package releases

import (
"bytes"
"encoding/json"
"errors"
"fmt"
"os/exec"
"strings"

Expand Down Expand Up @@ -438,34 +440,26 @@ func (m Model) renderManifestView() string {

func (m Model) list() tea.Msg {
var stdout bytes.Buffer
var releases []table.Row
var releases = []table.Row{}

// Create the command
cmd := exec.Command("helm", "ls", "--all-namespaces")
cmd := exec.Command("helm", "ls", "--all-namespaces", "--output", "json")
cmd.Stdout = &stdout

// Run the command
err := cmd.Run()
if err != nil {
return types.ListReleasesMsg{Err: err}
}

lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
var rls []types.Release
err = json.Unmarshal(stdout.Bytes(), &rls)
if err != nil {
return types.ListReleasesMsg{Content: releases}
}

// remove header and empty last line
lines = lines[1 : len(lines)-1]

for _, line := range lines {
fields := strings.Fields(line)
updated := strings.Join(fields[3:7], " ") // Join the parts that belong to the updated field
remainingFields := append(fields[:3], updated) // Keep the first 3 columns and append the updated field

// Add the rest of the fields after the updated part
remainingFields = append(remainingFields, fields[7:]...)
releases = append(releases, remainingFields)
for _, rel := range rls {
row := []string{rel.Name, rel.Namespace, rel.Revision, rel.Updated, rel.Status, rel.Chart, rel.AppVersion}
releases = append(releases, row)
}
return types.ListReleasesMsg{Content: releases, Err: nil}
}
Expand All @@ -478,34 +472,26 @@ func (m *Model) history() tea.Msg {
}

// Create the command
cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1])
cmd := exec.Command("helm", "history", m.releaseTable.SelectedRow()[0], "--namespace", m.releaseTable.SelectedRow()[1], "--output", "json")
cmd.Stdout = &stdout

// Run the command
err := cmd.Run()
if err != nil {
return types.HistoryMsg{Err: err}
}

lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
return types.HistoryMsg{Err: errors.New("no history found")}
var history []types.History
var rows = []table.Row{}
err = json.Unmarshal(stdout.Bytes(), &history)
if err != nil {
return types.HistoryMsg{Content: rows}
}

// remove header and empty last line
lines = lines[1 : len(lines)-1]

var history []table.Row
for _, line := range lines {
fields := strings.Fields(line)
updated := strings.Join(fields[1:6], " ")
description := strings.Join(fields[9:], " ")
remainingFields := append(fields[:1], updated)
remainingFields = append(remainingFields, fields[6:9]...)
remainingFields = append(remainingFields, description)
history = append(history, remainingFields)
for _, line := range history {
row := []string{fmt.Sprint(line.Revision), line.Updated, line.Status, line.Chart, line.AppVersion, line.Description}
rows = append(rows, row)
}
return types.HistoryMsg{Content: history, Err: nil}
return types.HistoryMsg{Content: rows, Err: nil}
}

func (m *Model) delete() tea.Msg {
Expand Down Expand Up @@ -604,7 +590,7 @@ func (m Model) getValues() tea.Msg {
}
lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
return types.ValuesMsg{Err: errors.New("no history found")}
return types.ValuesMsg{Err: errors.New("no values found")}
}
lines = lines[1:]

Expand Down
33 changes: 17 additions & 16 deletions releases/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package releases

import (
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"strings"
"time"

"github.com/charmbracelet/bubbles/help"
Expand Down Expand Up @@ -277,43 +277,44 @@ func (m UpgradeModel) searchLocalPackage() []string {
return []string{}
}
var stdout bytes.Buffer
cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value())
cmd := exec.Command("helm", "search", "repo", m.Inputs[upgradeReleaseChartStep].Value(), "--output", "json")
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil {
return []string{}
}
results := strings.Split(stdout.String(), "\n")
results = results[1 : len(results)-1]

var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}
var suggestions []string
for _, row := range results {
chart := strings.Fields(row)
suggestions = append(suggestions, chart[0])
for _, p := range pkgs {
suggestions = append(suggestions, p.Name)
}

m.Inputs[upgradeReleaseChartStep].SetSuggestions(suggestions)
return suggestions
}

func (m UpgradeModel) searchLocalPackageVersion() []string {
var stdout bytes.Buffer
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions")
cmd := exec.Command("helm", "search", "repo", "--regexp", "\v"+m.Inputs[upgradeReleaseChartStep].Value()+"\v", "--versions", "--output", "json")
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil {
return []string{}
}
results := strings.Split(stdout.String(), "\n")
results = results[1 : len(results)-1]
var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}

var suggestions []string
for _, row := range results {
chart := strings.Fields(row)
suggestions = append(suggestions, chart[1])
for _, pkg := range pkgs {
suggestions = append(suggestions, pkg.Version)
}

m.Inputs[installChartNameStep].SetSuggestions(suggestions)
return suggestions
}

Expand Down
77 changes: 30 additions & 47 deletions repositories/overview.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package repositories

import (
"bytes"
"encoding/json"
"errors"
"fmt"
"os/exec"
"strings"

"github.com/charmbracelet/bubbles/help"
"github.com/charmbracelet/bubbles/table"
Expand Down Expand Up @@ -310,7 +310,7 @@ func (m Model) renderDefaultValueView() string {

func (m Model) list() tea.Msg {
var stdout bytes.Buffer
releases := []table.Row{}
repositories := []table.Row{}

// Create the command
cmd := exec.Command("helm", "repo", "update")
Expand All @@ -319,7 +319,7 @@ func (m Model) list() tea.Msg {
if err != nil {
return types.ListRepoMsg{Err: err}
}
cmd = exec.Command("helm", "repo", "ls")
cmd = exec.Command("helm", "repo", "ls", "--output", "json")
cmd.Stdout = &stdout

// Run the command
Expand All @@ -328,18 +328,17 @@ func (m Model) list() tea.Msg {
return types.ListRepoMsg{Err: err}
}

lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
return types.ListRepoMsg{Content: releases}
var repos []types.Repository
err = json.Unmarshal(stdout.Bytes(), &repos)
if err != nil {
return []string{}
}

lines = lines[1 : len(lines)-1]

for _, line := range lines {
fields := strings.Fields(line)
releases = append(releases, fields)
for _, repo := range repos {
row := []string{repo.Name, repo.URL}
repositories = append(repositories, row)
}
return types.ListRepoMsg{Content: releases, Err: nil}
return types.ListRepoMsg{Content: repositories, Err: nil}
}

func (m Model) update() tea.Msg {
Expand Down Expand Up @@ -388,68 +387,53 @@ func (m Model) searchPackages() tea.Msg {
}

// Create the command
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0]))
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s/", m.tables[listView].SelectedRow()[0]), "--output", "json")
cmd.Stdout = &stdout

// Run the command
err := cmd.Run()
if err != nil {
return types.PackagesMsg{Content: releases, Err: err}
}

lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
return types.PackagesMsg{Content: releases}
var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}

lines = lines[1 : len(lines)-1]

for _, line := range lines {
fields := strings.Fields(line)
if len(fields) == 0 {
continue
}
nameField := fields[0]
releases = append(releases, table.Row{nameField})
for _, pkg := range pkgs {
releases = append(releases, table.Row{pkg.Name})
}
return types.PackagesMsg{Content: releases, Err: nil}
}

func (m Model) searchPackageVersions() tea.Msg {
var stdout bytes.Buffer
releases := []table.Row{}
versions := []table.Row{}
if m.tables[packagesView].SelectedRow() == nil {
return types.PackageVersionsMsg{Content: releases, Err: errors.New("no package selected")}
return types.PackageVersionsMsg{Content: versions, Err: errors.New("no package selected")}
}

// Create the command
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions")
cmd := exec.Command("helm", "search", "repo", fmt.Sprintf("%s", m.tables[packagesView].SelectedRow()[0]), "--versions", "--output", "json")
cmd.Stdout = &stdout

// Run the command
err := cmd.Run()
if err != nil {
return types.PackageVersionsMsg{Content: releases, Err: err}
return types.PackageVersionsMsg{Content: versions, Err: err}
}

lines := strings.Split(stdout.String(), "\n")
if len(lines) <= 1 {
return types.PackageVersionsMsg{Content: releases}
var pkgs []types.Pkg
err = json.Unmarshal(stdout.Bytes(), &pkgs)
if err != nil {
return []string{}
}

lines = lines[1 : len(lines)-1]

for _, line := range lines {
allFields := strings.Fields(line)
if len(allFields) == 0 {
continue
}
joinedDescription := strings.Join(allFields[3:], " ")
fields := allFields[1:3]
fields = append(fields, joinedDescription)
releases = append(releases, fields)
for _, pkg := range pkgs {
versions = append(versions, table.Row{pkg.Version, pkg.AppVersion, pkg.Description})
}
return types.PackageVersionsMsg{Content: releases, Err: nil}

return types.PackageVersionsMsg{Content: versions, Err: nil}
}

func (m Model) getDefaultValue() tea.Msg {
Expand All @@ -460,6 +444,5 @@ func (m Model) getDefaultValue() tea.Msg {
if err != nil {
return types.DefaultValueMsg{Content: "Unable to get default values"}
}
helpers.Println(stdout.String())
return types.DefaultValueMsg{Content: stdout.String()}
}
Loading

0 comments on commit 351b925

Please sign in to comment.