mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-04 10:41:14 +00:00
b990f48 Merge pull request #42 from kinvolk/lorenzo/fix-git-diff 224a145 Check if SHA1 exists before calling `git diff` 1c3000d Add auto_apply config for wcloud 0ebf5c0 Fix wcloud -serivice4fe078aMerge pull request #39 from weaveworks/fix-wrong-subtree-use3f4934dRemove generate_latest_map48beb60Sync changes done directly in scope/tools45dcdd5Merge pull request #37 from weaveworks/fix-mflag-missingb895344Use mflag package from weaveworks fork until we find a better solutione030008Merge pull request #36 from weaveworks/wcloud-service-flags9cbab40Add wcloud Makefileef55901Review feedback, and build wcloud in circle.3fe92f5Add wcloud deploy --service flag3527b56Merge pull request #34 from weaveworks/repo-branch92cd0b8[wcloud] Add support for repo_branch option9f760abAllow wcloud users to override username38037f8Merge pull request #33 from weaveworks/wcloud-templates7acfbd7Propagate the local usernamee6876d1Add template fields to wcloud config.f1bb537Merge pull request #30 from weaveworks/mike/shell-lint/dont-error-if-emptye60f5dfMerge pull request #31 from weaveworks/mike/fix-shell-lint-errorse8e2b69integrations: Fix a shellcheck linter errora781575shell-lint: Don't fail if no shell scripts founddb5efc0Merge pull request #28 from weaveworks/mike/add-image-tag5312c40Import image-tag script into build tools so it can be shared7e850f8Fix logs pathdda9785Update deploy apif2f4e5bFix the wcloud client3925eb6Merge pull request #27 from weaveworks/wcloud-events77355b9Lintd9a1c6cAdd wcloud events, update flags and error nicely when there is no config git-subtree-dir: tools git-subtree-split: b990f488bdc7909b62d9245bc4b4caf58f5ae7ea
239 lines
4.6 KiB
Go
239 lines
4.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/olekukonko/tablewriter"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
// ArrayFlags allows you to collect repeated flags
|
|
type ArrayFlags []string
|
|
|
|
func (a *ArrayFlags) String() string {
|
|
return strings.Join(*a, ",")
|
|
}
|
|
|
|
// Set implements flags.Value
|
|
func (a *ArrayFlags) Set(value string) error {
|
|
*a = append(*a, value)
|
|
return nil
|
|
}
|
|
|
|
func env(key, def string) string {
|
|
if val, ok := os.LookupEnv(key); ok {
|
|
return val
|
|
}
|
|
return def
|
|
}
|
|
|
|
var (
|
|
token = env("SERVICE_TOKEN", "")
|
|
baseURL = env("BASE_URL", "https://cloud.weave.works")
|
|
)
|
|
|
|
func usage() {
|
|
fmt.Println(`Usage:
|
|
deploy <image>:<version> Deploy image to your configured env
|
|
list List recent deployments
|
|
config (<filename>) Get (or set) the configured env
|
|
logs <deploy> Show lots for the given deployment`)
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) <= 1 {
|
|
usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
c := NewClient(token, baseURL)
|
|
|
|
switch os.Args[1] {
|
|
case "deploy":
|
|
deploy(c, os.Args[2:])
|
|
case "list":
|
|
list(c, os.Args[2:])
|
|
case "config":
|
|
config(c, os.Args[2:])
|
|
case "logs":
|
|
logs(c, os.Args[2:])
|
|
case "events":
|
|
events(c, os.Args[2:])
|
|
case "help":
|
|
usage()
|
|
default:
|
|
usage()
|
|
}
|
|
}
|
|
|
|
func deploy(c Client, args []string) {
|
|
var (
|
|
flags = flag.NewFlagSet("", flag.ContinueOnError)
|
|
username = flags.String("u", "", "Username to report to deploy service (default with be current user)")
|
|
services ArrayFlags
|
|
)
|
|
flags.Var(&services, "service", "Service to update (can be repeated)")
|
|
if err := flags.Parse(args); err != nil {
|
|
usage()
|
|
return
|
|
}
|
|
args = flags.Args()
|
|
if len(args) != 1 {
|
|
usage()
|
|
return
|
|
}
|
|
parts := strings.SplitN(args[0], ":", 2)
|
|
if len(parts) < 2 {
|
|
usage()
|
|
return
|
|
}
|
|
if *username == "" {
|
|
user, err := user.Current()
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
*username = user.Username
|
|
}
|
|
deployment := Deployment{
|
|
ImageName: parts[0],
|
|
Version: parts[1],
|
|
TriggeringUser: *username,
|
|
IntendedServices: services,
|
|
}
|
|
if err := c.Deploy(deployment); err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func list(c Client, args []string) {
|
|
var (
|
|
flags = flag.NewFlagSet("", flag.ContinueOnError)
|
|
since = flags.Duration("since", 7*24*time.Hour, "How far back to fetch results")
|
|
)
|
|
if err := flags.Parse(args); err != nil {
|
|
usage()
|
|
return
|
|
}
|
|
through := time.Now()
|
|
from := through.Add(-*since)
|
|
deployments, err := c.GetDeployments(from.Unix(), through.Unix())
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
table := tablewriter.NewWriter(os.Stdout)
|
|
table.SetHeader([]string{"Created", "ID", "Image", "Version", "State"})
|
|
table.SetBorder(false)
|
|
table.SetColumnSeparator(" ")
|
|
for _, deployment := range deployments {
|
|
table.Append([]string{
|
|
deployment.CreatedAt.Format(time.RFC822),
|
|
deployment.ID,
|
|
deployment.ImageName,
|
|
deployment.Version,
|
|
deployment.State,
|
|
})
|
|
}
|
|
table.Render()
|
|
}
|
|
|
|
func events(c Client, args []string) {
|
|
var (
|
|
flags = flag.NewFlagSet("", flag.ContinueOnError)
|
|
since = flags.Duration("since", 7*24*time.Hour, "How far back to fetch results")
|
|
)
|
|
if err := flags.Parse(args); err != nil {
|
|
usage()
|
|
return
|
|
}
|
|
through := time.Now()
|
|
from := through.Add(-*since)
|
|
events, err := c.GetEvents(from.Unix(), through.Unix())
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Println("events: ", string(events))
|
|
}
|
|
|
|
func loadConfig(filename string) (*Config, error) {
|
|
extension := filepath.Ext(filename)
|
|
var config Config
|
|
buf, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if extension == ".yaml" || extension == ".yml" {
|
|
if err := yaml.Unmarshal(buf, &config); err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
if err := json.NewDecoder(bytes.NewReader(buf)).Decode(&config); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return &config, nil
|
|
}
|
|
|
|
func config(c Client, args []string) {
|
|
if len(args) > 1 {
|
|
usage()
|
|
return
|
|
}
|
|
|
|
if len(args) == 1 {
|
|
config, err := loadConfig(args[0])
|
|
if err != nil {
|
|
fmt.Println("Error reading config:", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := c.SetConfig(config); err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
} else {
|
|
config, err := c.GetConfig()
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
buf, err := yaml.Marshal(config)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Println(string(buf))
|
|
}
|
|
}
|
|
|
|
func logs(c Client, args []string) {
|
|
if len(args) != 1 {
|
|
usage()
|
|
return
|
|
}
|
|
|
|
output, err := c.GetLogs(args[0])
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Println(string(output))
|
|
}
|