Updated from master

pull/2342/head
John Welsh 9 years ago
commit 0d16a01db7

@ -60,7 +60,7 @@ You can reach the Helm community and developers via the following channels:
- [Kubernetes Slack](https://slack.k8s.io): #helm - [Kubernetes Slack](https://slack.k8s.io): #helm
- Mailing List: https://groups.google.com/forum/#!forum/kubernetes-sig-apps - Mailing List: https://groups.google.com/forum/#!forum/kubernetes-sig-apps
- Developer Call: Thursdays at 9:30-10:00 Pacific. https://engineyard.zoom.us/j/366425549 - Developer Call: Thursdays at 9:30-10:00 Pacific. [https://zoom.us/j/4526666954](https://zoom.us/j/4526666954)
### Code of conduct ### Code of conduct

@ -0,0 +1,49 @@
// Copyright 2016 The Kubernetes Authors All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package hapi.release;
import "google/protobuf/timestamp.proto";
option go_package = "release";
message Log {
// Allows filtering by log event source
enum Source {
HOOK = 0;
TEST = 1;
POD = 2;
SYSTEM = 3;
}
// Syslog log levels
enum LogLevel {
EMERG = 0;
ALERT = 1;
CRIT = 2;
ERR = 3;
WARNING = 4;
NOTICE = 5;
INFO = 6;
DEBUG = 7;
}
Source source = 1;
string release = 2;
string log = 3;
google.protobuf.Timestamp timestamp = 4;
}

@ -194,10 +194,7 @@ message GetReleaseLogsRequest {
} }
message GetReleaseLogsResponse { message GetReleaseLogsResponse {
// Source is the name of the release that generated the log hapi.release.Log log = 1;
string source = 1;
// Log is a single log line
string log = 2;
} }
// UpdateReleaseRequest updates a release. // UpdateReleaseRequest updates a release.

@ -100,7 +100,7 @@ func (d *dependencyUpdateCmd) run() error {
if d.verify { if d.verify {
man.Verify = downloader.VerifyIfPossible man.Verify = downloader.VerifyIfPossible
} }
if settings.FlagDebug { if settings.Debug {
man.Debug = true man.Debug = true
} }
return man.Update() return man.Update()

@ -105,7 +105,7 @@ func newRootCmd(out io.Writer) *cobra.Command {
settings.Home = helmpath.Home(helmHomeTemp) settings.Home = helmpath.Home(helmHomeTemp)
p.StringVar(&settings.TillerHost, "host", helm_env.DefaultHelmHost(), "address of tiller. Overrides $HELM_HOST") p.StringVar(&settings.TillerHost, "host", helm_env.DefaultHelmHost(), "address of tiller. Overrides $HELM_HOST")
p.StringVar(&kubeContext, "kube-context", "", "name of the kubeconfig context to use") p.StringVar(&kubeContext, "kube-context", "", "name of the kubeconfig context to use")
p.BoolVar(&settings.FlagDebug, "debug", false, "enable verbose output") p.BoolVar(&settings.Debug, "debug", false, "enable verbose output")
p.StringVar(&settings.TillerNamespace, "tiller-namespace", tiller_env.GetTillerNamespace(), "namespace of tiller") p.StringVar(&settings.TillerNamespace, "tiller-namespace", tiller_env.GetTillerNamespace(), "namespace of tiller")
if os.Getenv(helm_env.PluginDisableEnvVar) != "1" { if os.Getenv(helm_env.PluginDisableEnvVar) != "1" {
@ -190,15 +190,12 @@ func setupConnection(c *cobra.Command, args []string) error {
} }
settings.TillerHost = fmt.Sprintf("localhost:%d", tunnel.Local) settings.TillerHost = fmt.Sprintf("localhost:%d", tunnel.Local)
if settings.FlagDebug { debug("Created tunnel using local port: '%d'\n", tunnel.Local)
fmt.Printf("Created tunnel using local port: '%d'\n", tunnel.Local)
}
} }
// Set up the gRPC config. // Set up the gRPC config.
if settings.FlagDebug { debug("SERVER: %q\n", settings.TillerHost)
fmt.Printf("SERVER: %q\n", settings.TillerHost)
}
// Plugin support. // Plugin support.
return nil return nil
} }

@ -36,7 +36,7 @@ func newHomeCmd(out io.Writer) *cobra.Command {
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
h := settings.Home h := settings.Home
fmt.Fprintf(out, "%s\n", h) fmt.Fprintf(out, "%s\n", h)
if settings.FlagDebug { if settings.Debug {
fmt.Fprintf(out, "Repository: %s\n", h.Repository()) fmt.Fprintf(out, "Repository: %s\n", h.Repository())
fmt.Fprintf(out, "RepositoryFile: %s\n", h.RepositoryFile()) fmt.Fprintf(out, "RepositoryFile: %s\n", h.RepositoryFile())
fmt.Fprintf(out, "Cache: %s\n", h.Cache()) fmt.Fprintf(out, "Cache: %s\n", h.Cache())

@ -155,7 +155,7 @@ func (i *initCmd) run() error {
i.opts.UseCanary = i.canary i.opts.UseCanary = i.canary
i.opts.ImageSpec = i.image i.opts.ImageSpec = i.image
if settings.FlagDebug { if settings.Debug {
writeYAMLManifest := func(apiVersion, kind, body string, first, last bool) error { writeYAMLManifest := func(apiVersion, kind, body string, first, last bool) error {
w := i.out w := i.out
if !first { if !first {

@ -140,11 +140,11 @@ func TestInitCmd_dryRun(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
dbg := settings.FlagDebug dbg := settings.Debug
settings.FlagDebug = true settings.Debug = true
defer func() { defer func() {
os.Remove(home) os.Remove(home)
settings.FlagDebug = dbg settings.Debug = dbg
}() }()
var buf bytes.Buffer var buf bytes.Buffer

@ -195,9 +195,7 @@ func streamLogs(client helm.Interface, rlsName string, done <-chan struct{}) err
} }
func (i *installCmd) run() error { func (i *installCmd) run() error {
if settings.FlagDebug { debug("CHART PATH: %s\n", i.chartPath)
fmt.Fprintf(i.out, "CHART PATH: %s\n", i.chartPath)
}
if i.namespace == "" { if i.namespace == "" {
i.namespace = defaultNamespace() i.namespace = defaultNamespace()
@ -324,14 +322,14 @@ func (i *installCmd) vals() ([]byte, error) {
return yaml.Marshal(base) return yaml.Marshal(base)
} }
// printRelease prints info about a release if the flagDebug is true. // printRelease prints info about a release if the Debug is true.
func (i *installCmd) printRelease(rel *release.Release) { func (i *installCmd) printRelease(rel *release.Release) {
if rel == nil { if rel == nil {
return return
} }
// TODO: Switch to text/template like everything else. // TODO: Switch to text/template like everything else.
fmt.Fprintf(i.out, "NAME: %s\n", rel.Name) fmt.Fprintf(i.out, "NAME: %s\n", rel.Name)
if settings.FlagDebug { if settings.Debug {
printRelease(i.out, rel) printRelease(i.out, rel)
} }
} }
@ -390,11 +388,9 @@ func locateChartPath(name, version string, verify bool, keyring string) (string,
if err != nil { if err != nil {
return filename, err return filename, err
} }
if settings.FlagDebug { debug("Fetched %s to %s\n", name, filename)
fmt.Printf("Fetched %s to %s\n", name, filename)
}
return lname, nil return lname, nil
} else if settings.FlagDebug { } else if settings.Debug {
return filename, err return filename, err
} }

@ -119,9 +119,7 @@ func (p *packageCmd) run(cmd *cobra.Command, args []string) error {
if err := setVersion(ch, p.version); err != nil { if err := setVersion(ch, p.version); err != nil {
return err return err
} }
if settings.FlagDebug { debug("Setting version to %s", p.version)
fmt.Fprintf(p.out, "Setting version to %s", p.version)
}
} }
if filepath.Base(path) != ch.Metadata.Name { if filepath.Base(path) != ch.Metadata.Name {
@ -145,8 +143,8 @@ func (p *packageCmd) run(cmd *cobra.Command, args []string) error {
} }
name, err := chartutil.Save(ch, dest) name, err := chartutil.Save(ch, dest)
if err == nil && settings.FlagDebug { if err == nil {
fmt.Fprintf(p.out, "Saved %s to current directory\n", name) debug("Saved %s to current directory\n", name)
} }
// Save to $HELM_HOME/local directory. This is second, because we don't want // Save to $HELM_HOME/local directory. This is second, because we don't want
@ -155,9 +153,8 @@ func (p *packageCmd) run(cmd *cobra.Command, args []string) error {
lr := p.home.LocalRepository() lr := p.home.LocalRepository()
if err := repo.AddChartToLocalRepo(ch, lr); err != nil { if err := repo.AddChartToLocalRepo(ch, lr); err != nil {
return err return err
} else if settings.FlagDebug {
fmt.Fprintf(p.out, "Saved %s to %s\n", name, lr)
} }
debug("Saved %s to %s\n", name, lr)
} }
if p.sign { if p.sign {
@ -194,9 +191,7 @@ func (p *packageCmd) clearsign(filename string) error {
return err return err
} }
if settings.FlagDebug { debug(sig)
fmt.Fprintln(p.out, sig)
}
return ioutil.WriteFile(filename+".prov", []byte(sig), 0755) return ioutil.WriteFile(filename+".prov", []byte(sig), 0755)
} }

@ -59,7 +59,7 @@ func (pcmd *pluginInstallCmd) complete(args []string) error {
} }
func (pcmd *pluginInstallCmd) run() error { func (pcmd *pluginInstallCmd) run() error {
installer.Debug = settings.FlagDebug installer.Debug = settings.Debug
i, err := installer.NewForSource(pcmd.source, pcmd.version, pcmd.home) i, err := installer.NewForSource(pcmd.source, pcmd.version, pcmd.home)
if err != nil { if err != nil {

@ -162,9 +162,9 @@ func TestSetupEnv(t *testing.T) {
settings.Home = helmpath.Home("testdata/helmhome") settings.Home = helmpath.Home("testdata/helmhome")
base := filepath.Join(settings.Home.Plugins(), name) base := filepath.Join(settings.Home.Plugins(), name)
settings.PlugDirs = settings.Home.Plugins() settings.PlugDirs = settings.Home.Plugins()
settings.FlagDebug = true settings.Debug = true
defer func() { defer func() {
settings.FlagDebug = false settings.Debug = false
}() }()
plugin.SetupPluginEnv(settings, name, base) plugin.SetupPluginEnv(settings, name, base)

@ -75,7 +75,7 @@ func tpl(t string, vals map[string]interface{}, out io.Writer) error {
} }
func debug(format string, args ...interface{}) { func debug(format string, args ...interface{}) {
if settings.FlagDebug { if settings.Debug {
format = fmt.Sprintf("[debug] %s\n", format) format = fmt.Sprintf("[debug] %s\n", format)
fmt.Printf(format, args...) fmt.Printf(format, args...)
} }

@ -185,7 +185,7 @@ func (u *upgradeCmd) run() error {
return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err))
} }
if settings.FlagDebug { if settings.Debug {
printRelease(u.out, resp.Release) printRelease(u.out, resp.Release)
} }

@ -20,7 +20,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"os"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"google.golang.org/grpc" "google.golang.org/grpc"
@ -105,9 +104,7 @@ func (v *versionCmd) run() error {
if grpc.Code(err) == codes.Unimplemented { if grpc.Code(err) == codes.Unimplemented {
return errors.New("server is too old to know its version") return errors.New("server is too old to know its version")
} }
if settings.FlagDebug { debug("%s", err)
fmt.Fprintln(os.Stderr, err)
}
return errors.New("cannot connect to Tiller") return errors.New("cannot connect to Tiller")
} }
fmt.Fprintf(v.out, "Server: %s\n", formatVersion(resp.Version, v.short)) fmt.Fprintf(v.out, "Server: %s\n", formatVersion(resp.Version, v.short))

@ -56,7 +56,7 @@ Helm and Tiller communicate using gRPC. To get started with gRPC, you will need
- Run Helm's `make bootstrap` to generate the `protoc-gen-go` plugin and - Run Helm's `make bootstrap` to generate the `protoc-gen-go` plugin and
place it in `bin/`. place it in `bin/`.
Note that you need to be on protobuf 3.x (`protoc --version`). The Note that you need to be on protobuf 3.2.0 (`protoc --version`). The
version of `protoc-gen-go` is tied to the version of gRPC used in version of `protoc-gen-go` is tied to the version of gRPC used in
Kubernetes. So the plugin is maintained locally. Kubernetes. So the plugin is maintained locally.

@ -4,6 +4,8 @@ Helm 2.1.0 introduced the concept of a client-side Helm _plugin_. A plugin is a
tool that can be accessed through the `helm` CLI, but which is not part of the tool that can be accessed through the `helm` CLI, but which is not part of the
built-in Helm codebase. built-in Helm codebase.
Existing plugins can be found on [related](related.md#helm-plugins) section or by searching [Github](https://github.com/search?q=topic%3Ahelm-plugin&type=Repositories).
This guide explains how to use and create plugins. This guide explains how to use and create plugins.
## An Overview ## An Overview
@ -170,4 +172,3 @@ these flags are _not_ passed on to the plugin.
Plugins _should_ display help text and then exit for `-h` and `--help`. In all Plugins _should_ display help text and then exit for `-h` and `--help`. In all
other cases, plugins may use flags as appropriate. other cases, plugins may use flags as appropriate.

2
glide.lock generated

@ -1,5 +1,5 @@
hash: 59f320c07649cfd057b84f1044074670230fa3ca27b32632eb77a16a972adc8e hash: 59f320c07649cfd057b84f1044074670230fa3ca27b32632eb77a16a972adc8e
updated: 2017-04-20T16:44:51.583176673-07:00 updated: 2017-04-24T14:43:55.783514424-07:00
imports: imports:
- name: bitbucket.org/ww/goautoneg - name: bitbucket.org/ww/goautoneg
version: 75cd24fc2f2c2a2088577d12123ddee5f54e0675 version: 75cd24fc2f2c2a2088577d12123ddee5f54e0675

@ -403,6 +403,7 @@ func (h *Client) logs(ctx context.Context, req *rls.GetReleaseLogsRequest, done
go func() { go func() {
defer close(out) defer close(out)
defer c.Close() defer c.Close()
for {
select { select {
case rs := s.Recv(): case rs := s.Recv():
if err == io.EOF { if err == io.EOF {
@ -416,6 +417,7 @@ func (h *Client) logs(ctx context.Context, req *rls.GetReleaseLogsRequest, done
case <-done: case <-done:
return return
} }
}
}() }()
return out, nil return out, nil

@ -52,5 +52,5 @@ type EnvSettings struct {
TillerNamespace string TillerNamespace string
Home helmpath.Home Home helmpath.Home
PlugDirs string PlugDirs string
FlagDebug bool Debug bool
} }

@ -195,7 +195,7 @@ func SetupPluginEnv(settings helm_env.EnvSettings,
os.Setenv(key, val) os.Setenv(key, val)
} }
if settings.FlagDebug { if settings.Debug {
os.Setenv("HELM_DEBUG", "1") os.Setenv("HELM_DEBUG", "1")
} }
} }

@ -0,0 +1,48 @@
package logdistributor
import "fmt"
type Log struct {
Log string
}
type Subscription struct {
c chan<- *Log
}
type Listener struct {
subs map[*Subscription]bool
}
type Distributor struct {
listeners map[string]*Listener
}
func (l *Listener) subscribe(c chan<- *Log) *Subscription {
sub := &Subscription{c}
l.subs[sub] = true
return sub
}
func (d *Distributor) Subscribe() {
}
func (l *Listener) unsubscribe(sub *Subscription) {
delete(l.subs, sub)
}
func (l *Listener) writeLog(log *Log) error {
for _, s := range l.subs {
s.c <- log
}
return nil
}
func (d *Distributor) WriteLog(log *Log, release string) error {
l := d.listeners[release]
if l == nil {
return fmt.Errorf("No listeners configured for %s", release)
}
return l.writeLog(log)
}

@ -0,0 +1,42 @@
package logdistributor
import (
"testing"
"fmt"
)
func TestDistributor_WriteLog(t *testing.T) {
d := &Distributor{}
l := &Log{Log: "Test log"}
d.WriteLog(l, "testrelease")
if len(d.listeners) != 1 {
t.Errorf("Invalid number of listeners present: %d (expecting 1)", len(d.listeners))
}
}
func BenchmarkDistributor_WriteLog(b *testing.B) {
}
func ExampleDistributor_WriteLog() {
sub := &Subscription{}
c := make(chan *Log)
sub.c = c
go func(){
for l := range c {
fmt.Println(l.Log)
}
for {
select {
case l := <-c:
fmt.Println(l.Log)
}
}
}()
sub.c <- &Log{Log: "Test log!"}
// Output: Test log!
}
Loading…
Cancel
Save