Skip to content

Commit

Permalink
added mattermost export support
Browse files Browse the repository at this point in the history
  • Loading branch information
sbueringer committed Sep 22, 2018
1 parent 46a0a71 commit 5b030f4
Show file tree
Hide file tree
Showing 30 changed files with 3,273 additions and 38 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ require (
github.com/imdario/mergo v0.3.5 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/json-iterator/go v1.1.5 // indirect
github.com/mattn/go-runewidth v0.0.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect
github.com/olekukonko/tablewriter v0.0.0-20180912035003-be2c049b30cc
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,14 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/olekukonko/tablewriter v0.0.0-20180912035003-be2c049b30cc h1:rQ1O4ZLYR2xXHXgBCCfIIGnuZ0lidMQw2S5n1oOv+Wg=
github.com/olekukonko/tablewriter v0.0.0-20180912035003-be2c049b30cc/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down
2 changes: 2 additions & 0 deletions pkg/cmd/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ go_library(
importpath = "github.com/sbueringer/kubectl-openstack-plugin/pkg/cmd",
visibility = ["//visibility:public"],
deps = [
"//pkg/output/mattermost:go_default_library",
"//vendor/github.com/gophercloud/gophercloud:go_default_library",
"//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library",
"//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library",
Expand All @@ -24,6 +25,7 @@ go_library(
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers:go_default_library",
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors:go_default_library",
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools:go_default_library",
"//vendor/github.com/olekukonko/tablewriter:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/gopkg.in/yaml.v2:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
Expand Down
41 changes: 34 additions & 7 deletions pkg/cmd/lb.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,18 @@ import (
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/loadbalancers"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/monitors"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas_v2/pools"
"github.com/sbueringer/kubectl-openstack-plugin/pkg/output/mattermost"
)

//TODO
type LBOptions struct {
configFlags *genericclioptions.ConfigFlags
rawConfig api.Config
//TODO decide what todo with list
list bool
args []string
list bool
exporter string
output string
args []string

genericclioptions.IOStreams
}
Expand Down Expand Up @@ -60,6 +63,8 @@ func NewCmdLB(streams genericclioptions.IOStreams) *cobra.Command {
},
}
cmd.Flags().BoolVar(&o.list, "list", o.list, "if true, list")
cmd.Flags().StringVarP(&o.exporter, "exporter", "e", "stdout", "stdout, mm or multiple (comma-separated)")
cmd.Flags().StringVarP(&o.output, "output", "o", "markdown", "markdown or raw")
o.configFlags.AddFlags(cmd.Flags())
return cmd
}
Expand Down Expand Up @@ -94,7 +99,7 @@ func (o *LBOptions) Run() error {
if err != nil {
return fmt.Errorf("error creating client: %v", err)
}
osProvider, err := getOpenStackClient(o.rawConfig)
osProvider, tenantID, err := getOpenStackClient(o.rawConfig)
if err != nil {
return fmt.Errorf("error creating client: %v", err)
}
Expand All @@ -109,16 +114,35 @@ func (o *LBOptions) Run() error {
return fmt.Errorf("error getting servers from OpenStack: %v", err)
}

output, err := getPrettyLBList(servicesMap, loadBalancersMap, listenersMap, poolsMap, membersMap, monitorsMap, floatingipsMap)
output, err := getPrettyLBList(servicesMap, loadBalancersMap, listenersMap, poolsMap, membersMap, monitorsMap, floatingipsMap, o.output)
if err != nil {
return fmt.Errorf("error creating output: %v", err)
}
fmt.Printf(output)

for _, exporter := range strings.Split(o.exporter, ",") {
switch exporter {
case "stdout":
{
fmt.Printf(output)
}
case "mm":
{
var msg string
switch o.output {
case "raw":
msg = fmt.Sprintf("LBaaS for %s:\n\n````\n%s````\n", tenantID, output)
case "markdown":
msg = fmt.Sprintf("LBaaS for %s:\n\n%s\n", tenantID, output)
}
mattermost.New().SendMessage(msg)
}
}
}

return nil
}

func getPrettyLBList(services map[int32]v1.Service, loadbalancers map[string]loadbalancers.LoadBalancer, listeners map[string]listeners.Listener, pools map[string]pools.Pool, members map[string]pools.Member, monitors map[string]monitors.Monitor, floatingIPs map[string]floatingips.FloatingIP) (string, error) {
func getPrettyLBList(services map[int32]v1.Service, loadbalancers map[string]loadbalancers.LoadBalancer, listeners map[string]listeners.Listener, pools map[string]pools.Pool, members map[string]pools.Member, monitors map[string]monitors.Monitor, floatingIPs map[string]floatingips.FloatingIP, output string) (string, error) {

header := []string{"NAME", "FLOATING_IPS", "VIP_ADDRESS", "PORTS", "SERVICES"}

Expand Down Expand Up @@ -155,11 +179,14 @@ func getPrettyLBList(services map[int32]v1.Service, loadbalancers map[string]loa
}
portMapping := fmt.Sprintf("%d => %s", l.ProtocolPort, strings.Join(targetsArray, ","))
svcs := strings.Join(svcsArray, ",")
if svcs == "" {
svcs = "-"
}

lines = append(lines, []string{lb.Name, floatingIPsString, lb.VipAddress, portMapping, svcs})
}
}
return printTable(table{header, lines, 0})
return convertToTable(table{header, lines, 0, output})
}
func getFloatingIPForLB(lb loadbalancers.LoadBalancer, floatingIPs map[string]floatingips.FloatingIP) []string {
var fips []string
Expand Down
20 changes: 11 additions & 9 deletions pkg/cmd/openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,16 +149,16 @@ func getLB(osProvider *gophercloud.ProviderClient) (map[string]loadbalancers.Loa
return loadBalancersMap, listenersMap, poolsMap, membersMap, monitorsMap, floatingipsMap, nil
}

func getOpenStackClient(rawConfig api.Config) (*gophercloud.ProviderClient, error) {
providerClient, err := createOpenStackProviderClient(rawConfig)
func getOpenStackClient(rawConfig api.Config) (*gophercloud.ProviderClient, string, error) {
providerClient, tenantID, err := createOpenStackProviderClient(rawConfig)
if err != nil {
return nil, fmt.Errorf("error creating openstack client: %v", err)
return nil, tenantID, fmt.Errorf("error creating openstack client: %v", err)
}

return providerClient, nil
return providerClient, tenantID, nil
}

func createOpenStackProviderClient(rawConfig api.Config) (*gophercloud.ProviderClient, error) {
func createOpenStackProviderClient(rawConfig api.Config) (*gophercloud.ProviderClient, string, error) {

context := rawConfig.CurrentContext
tenantID := strings.Split(context, "-")[0]
Expand All @@ -167,16 +167,18 @@ func createOpenStackProviderClient(rawConfig api.Config) (*gophercloud.ProviderC
if openstackConfigFile != "" {
authOptions, err := getAuthOptionsFromConfig(openstackConfigFile, tenantID)
if err != nil {
return nil, fmt.Errorf("error getting auth options from config file %s: %v", openstackConfigFile, err)
return nil, tenantID, fmt.Errorf("error getting auth options from config file %s: %v", openstackConfigFile, err)
}
return openstack.AuthenticatedClient(*authOptions)
osProvider, err := openstack.AuthenticatedClient(*authOptions)
return osProvider, tenantID, err
}

authOptions, err := getAuthOptionsFromEnv()
if err != nil {
return nil, fmt.Errorf("error getting auth options from env variables: %v", err)
return nil, tenantID, fmt.Errorf("error getting auth options from env variables: %v", err)
}
return openstack.AuthenticatedClient(*authOptions)
osProvider, err := openstack.AuthenticatedClient(*authOptions)
return osProvider, tenantID, err
}

func getAuthOptionsFromEnv() (*gophercloud.AuthOptions, error) {
Expand Down
40 changes: 33 additions & 7 deletions pkg/cmd/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import (

"fmt"

"strings"

"github.com/sbueringer/kubectl-openstack-plugin/pkg/output/mattermost"
"k8s.io/apimachinery/pkg/api/resource"
)

Expand All @@ -17,8 +20,10 @@ type ServerOptions struct {
configFlags *genericclioptions.ConfigFlags
rawConfig api.Config
//TODO decide what todo with list
list bool
args []string
list bool
exporter string
output string
args []string

genericclioptions.IOStreams
}
Expand Down Expand Up @@ -56,6 +61,8 @@ func NewCmdServer(streams genericclioptions.IOStreams) *cobra.Command {
},
}
cmd.Flags().BoolVar(&o.list, "list", o.list, "if true, list")
cmd.Flags().StringVarP(&o.exporter, "exporter", "e", "stdout", "stdout, mm or multiple (comma-separated)")
cmd.Flags().StringVarP(&o.output, "output", "o", "markdown", "markdown or raw")
o.configFlags.AddFlags(cmd.Flags())
return cmd
}
Expand Down Expand Up @@ -90,7 +97,7 @@ func (o *ServerOptions) Run() error {
if err != nil {
return fmt.Errorf("error creating client: %v", err)
}
osProvider, err := getOpenStackClient(o.rawConfig)
osProvider, tenantID, err := getOpenStackClient(o.rawConfig)
if err != nil {
return fmt.Errorf("error creating client: %v", err)
}
Expand All @@ -105,16 +112,35 @@ func (o *ServerOptions) Run() error {
return fmt.Errorf("error getting servers from OpenStack: %v", err)
}

output, err := getPrettyServerList(nodesMap, serversMap)
output, err := getPrettyServerList(nodesMap, serversMap, o.output)
if err != nil {
return fmt.Errorf("error creating output: %v", err)
}
fmt.Printf(output)

for _, exporter := range strings.Split(o.exporter, ",") {
switch exporter {
case "stdout":
{
fmt.Printf(output)
}
case "mm":
{
var msg string
switch o.output {
case "raw":
msg = fmt.Sprintf("Server for %s:\n\n````\n%s````\n", tenantID, output)
case "markdown":
msg = fmt.Sprintf("Server for %s:\n\n%s\n", tenantID, output)
}
mattermost.New().SendMessage(msg)
}
}
}

return nil
}

func getPrettyServerList(nodes map[string]v1.Node, server map[string]servers.Server) (string, error) {
func getPrettyServerList(nodes map[string]v1.Node, server map[string]servers.Server, output string) (string, error) {

header := []string{"NODE_NAME", "STATUS", "KUBELET_VERSION", "KUBEPROXY_VERSION", "RUNTIME_VERSION", "DHC_VERSION", "SERVER_ID", "STATE", "CPU", "RAM", "IP"}

Expand Down Expand Up @@ -154,5 +180,5 @@ func getPrettyServerList(nodes map[string]v1.Node, server map[string]servers.Ser
}
lines = append(lines, []string{name, status, kubeletVersion, kubeProxyVersion, containerRuntimeVersion, dhcVersion, s.ID, s.Status, cpu, ram, ip})
}
return printTable(table{header, lines, 0})
return convertToTable(table{header, lines, 0, output})
}
32 changes: 24 additions & 8 deletions pkg/cmd/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,47 @@ import (
"sort"
"strings"
"text/tabwriter"

"github.com/olekukonko/tablewriter"
)

type table struct {
header []string
lines [][]string
sortIndex int
output string
}

func (t table) Len() int { return len(t.lines) }
func (t table) Swap(i, j int) { t.lines[i], t.lines[j] = t.lines[j], t.lines[i] }
func (t table) Less(i, j int) bool { return t.lines[i][t.sortIndex] < t.lines[j][t.sortIndex] }

func printTable(t table) (string, error) {
func convertToTable(t table) (string, error) {

buff := &bytes.Buffer{}
w := tabwriter.NewWriter(buff, 0, 0, 2, ' ', 0)

sort.Sort(t)

fmt.Fprintf(w, "%s\n", strings.Join(t.header, "\t"))

for _, line := range t.lines {
fmt.Fprintf(w, "%s\n", strings.Join(line, "\t"))
switch t.output {
case "raw":
w := tabwriter.NewWriter(buff, 0, 0, 2, ' ', 0)
fmt.Fprintf(w, "%s\n", strings.Join(t.header, "\t"))
for _, line := range t.lines {
fmt.Fprintf(w, "%s\n", strings.Join(line, "\t"))
}
w.Flush()
case "markdown":
table := tablewriter.NewWriter(buff)
table.SetHeader(t.header)
table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})
table.SetCenterSeparator("|")
table.SetAutoWrapText(false)
table.SetReflowDuringAutoWrap(false)
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.AppendBulk(t.lines)
table.Render()
default:
panic(fmt.Errorf("unknown output: %s", t.output))
}

w.Flush()
return buff.String(), nil
}
Loading

0 comments on commit 5b030f4

Please sign in to comment.