cloudfoundry/stratos

View on GitHub
src/jetstream/plugins/analysis/container/popeye.go

Summary

Maintainability
A
0 mins
Test Coverage
package main

import (
    "encoding/json"
    "errors"
    "io/ioutil"
    "os"
    "os/exec"
    "path/filepath"
    "time"

    log "github.com/sirupsen/logrus"
)

type popEyeSummary struct {
    Score int    `json:"score"`
    Grade string `json:"grade"`
}

type popEyeResult struct {
    PopEye popEyeSummary `json:"popeye"`
}

func runPopeye(job *AnalysisJob) error {

    log.Debug("Running popeye job")

    job.Busy = true
    job.Type = "popeye"
    job.Format = "popeye"
    setJobNameAndPath(job, "Popeye")

    log.Infof("Running popeye job: %s", job.Path)

    args := []string{"--kubeconfig", job.KubeConfigPath, "-o", "json", "--insecure-skip-tls-verify"}
    if len(job.Config.Namespace) > 0 {
        args = append(args, "-n")
        args = append(args, job.Config.Namespace)
    } else {
        args = append(args, "-A")
    }

    go func() {
        cmd := exec.Command("popeye", args...)
        cmd.Dir = job.Folder

        start := time.Now()
        out, err := cmd.Output()
        end := time.Now()
        job.EndTime = end

        job.Busy = false

        log.Infof("Completed kube score job: %s", job.Path)

        // Remove any config files when done
        job.RemoveTempFiles()

        job.Duration = int(end.Sub(start).Seconds())

        if err != nil {
            // There was an error
            // Remove the folder
            os.Remove(job.Folder)
            job.Status = "error"
        } else {
            reportFile := filepath.Join(job.Folder, "report.json")
            ioutil.WriteFile(reportFile, out, os.ModePerm)
            job.Status = "completed"

            // Parse the report
            if summary, err := parsePopeyeReport(reportFile); err == nil {
                job.Result = serializePopeyeReport(summary)
            }
        }
    }()

    return nil
}

func parsePopeyeReport(file string) (*popEyeSummary, error) {
    jsonFile, err := os.Open(file)
    if err != nil {
        return nil, err
    }
    defer jsonFile.Close()

    data, err := ioutil.ReadAll(jsonFile)
    if err != nil {
        return nil, err
    }

    result := popEyeResult{}
    if err = json.Unmarshal(data, &result); err != nil {
        return nil, errors.New("Failed to parse Popeye report")
    }

    return &result.PopEye, nil
}

func serializePopeyeReport(summary *popEyeSummary) string {
    jsonString, err := json.Marshal(summary)
    if err != nil {
        return ""
    }

    return string(jsonString)
}