Skip to content
This repository has been archived by the owner on Feb 14, 2022. It is now read-only.

Commit

Permalink
describe project
Browse files Browse the repository at this point in the history
  • Loading branch information
Cedric Kienzler committed Mar 9, 2021
1 parent c9c631e commit c6c11da
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 12 deletions.
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"program": "${workspaceFolder}/main.go",
"args": [
//"add", "project", "kkpctltest", "--labels", "stage=dev",
"get", "project", "--all",
"describe", "project", "vhkbdlstlt",
"-o", "text"
]
}
Expand Down
15 changes: 15 additions & 0 deletions cmd/describe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package cmd

import (
"github.com/spf13/cobra"
)

// getCmd represents the get command
var describeCmd = &cobra.Command{
Use: "describe",
Short: "Describe lets you describe a KKP object in more detail.",
}

func init() {
rootCmd.AddCommand(describeCmd)
}
40 changes: 40 additions & 0 deletions cmd/describe_projects.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cmd

import (
"fmt"

"github.com/cedi/kkpctl/pkg/client"
"github.com/cedi/kkpctl/pkg/describe"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)

// projectsCmd represents the projects command
var describeProjectsCmd = &cobra.Command{
Use: "project [projectid]",
Short: "Describe a project.",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
kkp, err := client.NewClient(baseURL, apiToken)
if err != nil {
return errors.New("Could not initialize Kubermatic API client")
}

project, err := kkp.GetProject(args[0])
if err != nil {
return errors.Wrap(err, "Error fetching project")
}

parsed, err := describe.Object(project)
if err != nil {
return errors.Wrap(err, "Error describing project")
}
fmt.Println(parsed)

return nil
},
}

func init() {
describeCmd.AddCommand(describeProjectsCmd)
}
20 changes: 9 additions & 11 deletions cmd/get_projects.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,16 @@ var getProjectsCmd = &cobra.Command{
}
fmt.Println(parsed)
} else {
for _, arg := range args {
project, err := kkp.GetProject(arg)
if err != nil {
return errors.Wrap(err, "Error fetching project")
}

parsed, err := output.ParseOutput(project, outputType)
if err != nil {
return errors.Wrap(err, "Error parsing project")
}
fmt.Println(parsed)
project, err := kkp.GetProject(args[0])
if err != nil {
return errors.Wrap(err, "Error fetching project")
}

parsed, err := output.ParseOutput(project, outputType)
if err != nil {
return errors.Wrap(err, "Error parsing project")
}
fmt.Println(parsed)
}

return nil
Expand Down
19 changes: 19 additions & 0 deletions pkg/describe/describe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package describe

import (
"errors"
"fmt"

"github.com/kubermatic/go-kubermatic/models"
)

// Object takes any KKP Object as an input and then describes it
func Object(object interface{}) (string, error) {
// this is ugly and long, but it makes things kinda nicer to handle outside of the package
project, ok := object.(models.Project)
if ok {
return describeProject(project)
}

return fmt.Sprintf("%v\n", object), errors.New("Unable to parse proper type of object")
}
77 changes: 77 additions & 0 deletions pkg/describe/describe_project.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package describe

import (
"bytes"
"fmt"
"io"
"io/ioutil"
"strings"

"github.com/kubermatic/go-kubermatic/models"
"github.com/lensesio/tableprinter"
)

// projectRender is a intermediate struct to make use of lensesio/tableprinter, which relies on the header anotation
type projectMetaStruct struct {
ID string `header:"ProjectID"`
Name string `header:"Name"`
Status string `header:"Status"`
CreationTimestamp string `header:"Created"`
}

type ownerStruct struct {
ID string `header:"UserID"`
Name string `header:"Name"`
Email string `header:"Email"`
CreationTimestamp string `header:"Created"`
}

// describeProject takes any KKP Project and describes it
func describeProject(project models.Project) (string, error) {
projectMeta := projectMetaStruct{
ID: project.ID,
Name: project.Name,
CreationTimestamp: project.CreationTimestamp.String(),
Status: project.Status,
}

var projectRenderBuf io.ReadWriter
projectRenderBuf = new(bytes.Buffer)
tableprinter.Print(projectRenderBuf, projectMeta)
projectRenderBytes, err := ioutil.ReadAll(projectRenderBuf)
if err != nil {
return "", err
}

ownerMeta := make([]ownerStruct, len(project.Owners))
for idx, owner := range project.Owners {
ownerMeta[idx] = ownerStruct{
ID: owner.ID,
Name: owner.Name,
Email: owner.Email,
CreationTimestamp: owner.CreationTimestamp.String(),
}
}

var ownerRenderBuf io.ReadWriter
ownerRenderBuf = new(bytes.Buffer)
tableprinter.Print(ownerRenderBuf, ownerMeta)
ownerRenderBytes, err := ioutil.ReadAll(ownerRenderBuf)

labels := make([]string, 0)
for key, value := range project.Labels {
labels = append(labels, fmt.Sprintf("%s=%s", key, value))
}
if len(labels) == 0 {
labels = append(labels, "[None]")
}

result := fmt.Sprintf("Project:\n%s\n\nOwners:\n%s\n\nLabels:\n%s\n\nClusters in this Project: %d",
string(projectRenderBytes),
string(ownerRenderBytes),
strings.Join(labels, "; "),
project.ClustersNumber,
)

return result, err
}
File renamed without changes.

0 comments on commit c6c11da

Please sign in to comment.