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

Commit

Permalink
Merge pull request #22 from ZupIT/feature/logs-kubernetes
Browse files Browse the repository at this point in the history
Feature/logs kubernetes
  • Loading branch information
erneliojuniorzup authored Feb 12, 2020
2 parents fce7edd + dcaf0ef commit 512c7d9
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 23 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ SC_SPRING=scaffold/spring-iti
KAFKA=kafka
VIVO=vivo/deploy
DOCKER=docker/compose
FORMULAS=$(TERRAFORM) $(DARWIN) $(WEBHOOK) $(JENKINS_JOB) $(SC_COFFEE) $(SC_SPRING) $(KAFKA) $(VIVO) $(DOCKER) $(NAVIGATE_HANDBOOK) $(SEARCH_HANDBOOK)
KUBERNETES_LOGS=kubernetes/logs
FORMULAS=$(TERRAFORM) $(DARWIN) $(WEBHOOK) $(JENKINS_JOB) $(SC_COFFEE) $(SC_SPRING) $(KAFKA) $(VIVO) $(DOCKER) $(NAVIGATE_HANDBOOK) $(SEARCH_HANDBOOK) $(KUBERNETES_LOGS)

PWD_INITIAL=$(shell pwd)

Expand All @@ -27,10 +28,9 @@ push-s3:
bin:
echo "Init pwd: $(PWD_INITIAL)"
for formula in $(FORMULAS); do cd $$formula/src && make build && cd $(PWD_INITIAL); done
for formula in $(FORMULAS); do mkdir -p formulas/$$formula && cp $$formula/config.json formulas/$$formula && cp -rf $$formula/bin formulas/$$formula; done
./copy-bin-configs.sh "$(FORMULAS)"

test-local: bin
./copy-bin-configs.sh "$(FORMULAS)"
rm -rf ~/.rit/formulas
rm -rf ~/.rit/.cmd_tree.json
mv formulas ~/.rit
Expand Down
25 changes: 25 additions & 0 deletions kubernetes/logs/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"description": "Show logs kubernetes",
"inputs" : [
{
"name": "namespace",
"type": "text",
"label": "Type kubernates namespace: ",
"cache": {
"active": true
}
},
{
"name" : "pod_part_name",
"type" : "text",
"label": "Type name or part name of pod: ",
"cache": {
"active": true
}
},
{
"name" : "kubeconfig",
"type" : "CREDENTIAL_KUBECONFIG_BASE64CONFIG"
}
]
}
19 changes: 19 additions & 0 deletions kubernetes/logs/src/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Go parameters
GOCMD=go
GOBUILD=$(GOCMD) build
BINARY_NAME=kubernetes-logs
CMD_PATH=./main.go
DIST=../bin
DIST_MAC=$(DIST)/$(BINARY_NAME)-darwin
DIST_LINUX=$(DIST)/$(BINARY_NAME)-linux
DIST_WIN=$(DIST)/$(BINARY_NAME)-windows.exe

build:
mkdir -p $(DIST)
export MODULE=$(GO111MODULE=on go list -m)
#LINUX
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -tags release -ldflags '-X $(MODULE)/cmd.Version=$(VERSION) -X $(MODULE)/cmd.BuildDate=$(DATE)' -o ./$(DIST_LINUX) -v $(CMD_PATH)
#MAC
GOOS=darwin GOARCH=amd64 $(GOBUILD) -tags release -ldflags '-X $(MODULE)/cmd.Version=$(VERSION) -X $(MODULE)/cmd.BuildDate=$(DATE)' -o ./$(DIST_MAC) -v $(CMD_PATH)
#WINDOWS 64
GOOS=windows GOARCH=amd64 $(GOBUILD) -tags release -ldflags '-X $(MODULE)/cmd.Version=$(VERSION) -X $(MODULE)/cmd.BuildDate=$(DATE)' -o ./$(DIST_WIN) -v $(CMD_PATH)
14 changes: 14 additions & 0 deletions kubernetes/logs/src/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module kubernetes/logs

go 1.13

require (
github.com/imdario/mergo v0.3.8 // indirect
github.com/manifoldco/promptui v0.7.0
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
k8s.io/api v0.17.2
k8s.io/apimachinery v0.17.2
k8s.io/client-go v0.17.0
k8s.io/utils v0.0.0-20200124190032-861946025e34 // indirect
)
18 changes: 18 additions & 0 deletions kubernetes/logs/src/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package main

import (
"kubernetes/logs/pkg/logs"
"os"
)

func main() {
loadInputs().Run()
}

func loadInputs() logs.Inputs {
return logs.Inputs{
Namespace: os.Getenv("NAMESPACE"),
PodPartName: os.Getenv("POD_PART_NAME"),
Kubeconfig: os.Getenv("KUBECONFIG"),
}
}
81 changes: 81 additions & 0 deletions kubernetes/logs/src/pkg/logs/logs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package logs

import (
"bufio"
"encoding/base64"
"fmt"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"kubernetes/logs/pkg/prompt"
"log"
"strconv"
"strings"
)

type Inputs struct {
Namespace string
PodPartName string
Kubeconfig string
}

func (in Inputs) Run() {
kubeConfigBytes, _ := base64.StdEncoding.DecodeString(in.Kubeconfig)
clientConfig, err := clientcmd.NewClientConfigFromBytes(kubeConfigBytes)
if err != nil {
log.Fatalln("Failed to load config. Verify if you set credential kubeconfig in base64 format.")
}

config, err := clientConfig.ClientConfig()
if err != nil {
log.Fatalln("Failed to load config. Verify if you set credential kubeconfig in base64 format.")
}

// create the client
client, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalln("Failed to create kubernetes client.")
}

pods, err := client.CoreV1().Pods(in.Namespace).List(metav1.ListOptions{})
if err != nil {
log.Fatalf("Failed to list pods for namespace: %s.\n", in.Namespace)
}
if len(pods.Items) == 0 {
log.Fatalf("No result pods to namespace: %s.\n", in.Namespace)
}
var podsFilter []v1.Pod
for _, pod := range pods.Items {
if strings.Contains(pod.Name, in.PodPartName) {
podsFilter = append(podsFilter, pod)
}
}
if len(podsFilter) == 0 {
log.Fatalf("No result pods to name: %s and namespace: %s.\n", in.PodPartName, in.Namespace)
}
var items []string
for i, pod := range podsFilter {
items = append(items, fmt.Sprint(i, " - ", pod.Name))
}
itemSelect , _ := prompt.List("Select Pod: ", items)
ind, _ := strconv.Atoi(strings.Split(itemSelect, " - ")[0])
podSelect := podsFilter[ind]

var containersItems []string
for _, container := range podSelect.Spec.Containers {
containersItems = append(containersItems, container.Name)
}
containerSelect , _ := prompt.List("Select container: ", containersItems)

podLogOpts := v1.PodLogOptions{Follow:true, Container:containerSelect}

req := client.CoreV1().Pods(podSelect.Namespace).GetLogs(podSelect.Name, &podLogOpts)
podLogs, err := req.Stream()
scanner := bufio.NewScanner(podLogs)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
m := scanner.Text()
fmt.Println(m)
}
}
62 changes: 62 additions & 0 deletions kubernetes/logs/src/pkg/prompt/prompt.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package prompt

import (
"errors"
"strings"

"github.com/manifoldco/promptui"
)

// String show a prompt and parse to string.
func String(name string, required bool) (string, error) {
var prompt promptui.Prompt

if required {
prompt = promptui.Prompt{
Label: name,
Validate: validateEmptyInput,
Templates: defaultTemplate(),
}
} else {
prompt = promptui.Prompt{
Label: name,
Templates: defaultTemplate(),
}
}

return prompt.Run()
}


// List show a prompt with options and parse to string.
func List(name string, items []string) (string, error) {
prompt := promptui.Select{
Items: items,
Templates: defaultSelectTemplate(name),
}
_, result, err := prompt.Run()
return result, err
}

func defaultTemplate() *promptui.PromptTemplates {
return &promptui.PromptTemplates{
Prompt: "{{ . }} ",
Valid: "{{ . | bold }} ",
Invalid: "{{ . | red }} ",
Success: "{{ . | bold }} ",
}
}

func defaultSelectTemplate(label string) *promptui.SelectTemplates {
return &promptui.SelectTemplates{
Label: label,
}
}

func validateEmptyInput(input string) error {
if len(strings.TrimSpace(input)) < 1 {
return errors.New("this input must not be empty")
}
return nil
}

39 changes: 19 additions & 20 deletions tree/tree.json
Original file line number Diff line number Diff line change
Expand Up @@ -148,26 +148,6 @@
},
"parent": "root_kafka"
},
{
"usage": "user",
"help": "Create user",
"parent": "root_create"
},
{
"usage": "user",
"help": "Delete user",
"parent": "root_delete"
},
{
"usage": "zsh",
"help": "Generates auto-completion for zsh",
"parent": "root_completion"
},
{
"usage": "bash",
"help": "Generates auto-completion for bash",
"parent": "root_completion"
},
{
"usage": "scaffold",
"help": "Manipulate scaffold objects",
Expand Down Expand Up @@ -299,6 +279,25 @@
"bin": "docker-generate-compose-${so}"
},
"parent": "root_docker_generate"
},
{
"usage": "k8s",
"help": "Manipulate k8s objects",
"parent": "root"
},
{
"usage": "show",
"help": "Show k8s objects",
"parent": "root_k8s"
},
{
"usage": "logs",
"help": "Show k8s logs",
"formula": {
"path": "kubernetes/logs",
"bin": "kubernetes-logs-${so}"
},
"parent": "root_k8s_show"
}
],
"version": "1.0.0"
Expand Down

0 comments on commit 512c7d9

Please sign in to comment.