Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
H
helm3
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
helm3
Commits
492dbb37
Commit
492dbb37
authored
Aug 22, 2016
by
vaikas-google
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for NOTES.txt file
parent
27480470
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
203 additions
and
26 deletions
+203
-26
status.proto
_proto/hapi/release/status.proto
+4
-0
tiller.proto
_proto/hapi/services/tiller.proto
+3
-0
status.go
cmd/helm/status.go
+6
-1
release_server.go
cmd/tiller/release_server.go
+36
-7
release_server_test.go
cmd/tiller/release_server_test.go
+133
-0
engine.go
pkg/engine/engine.go
+1
-1
status.pb.go
pkg/proto/hapi/release/status.pb.go
+20
-17
tiller.pb.go
pkg/proto/hapi/services/tiller.pb.go
+0
-0
No files found.
_proto/hapi/release/status.proto
View file @
492dbb37
...
...
@@ -38,6 +38,10 @@ message Status {
Code
code
=
1
;
google.protobuf.Any
details
=
2
;
// Cluster resources as kubectl would print them.
string
resources
=
3
;
// Contains the rendered templates/NOTES.txt if available
string
notes
=
4
;
}
_proto/hapi/services/tiller.proto
View file @
492dbb37
...
...
@@ -142,6 +142,9 @@ message GetReleaseStatusResponse {
// Info contains information about the release.
hapi.release.Info
info
=
2
;
// Namesapce the release was released into
string
namespace
=
3
;
}
// GetReleaseContentRequest is a request to get the contents of a release.
...
...
cmd/helm/status.go
View file @
492dbb37
...
...
@@ -67,10 +67,15 @@ func (s *statusCmd) run() error {
}
fmt
.
Fprintf
(
s
.
out
,
"Last Deployed: %s
\n
"
,
timeconv
.
String
(
res
.
Info
.
LastDeployed
))
fmt
.
Fprintf
(
s
.
out
,
"Namespace: %s
\n
"
,
res
.
Namespace
)
fmt
.
Fprintf
(
s
.
out
,
"Status: %s
\n
"
,
res
.
Info
.
Status
.
Code
)
fmt
.
Fprintf
(
s
.
out
,
"Resources:
\n
%s
\n
"
,
res
.
Info
.
Status
.
Resources
)
if
res
.
Info
.
Status
.
Details
!=
nil
{
fmt
.
Fprintf
(
s
.
out
,
"Details: %s
\n
"
,
res
.
Info
.
Status
.
Details
)
}
fmt
.
Fprintf
(
s
.
out
,
"
\n
"
)
fmt
.
Fprintf
(
s
.
out
,
"Resources:
\n
%s
\n
"
,
res
.
Info
.
Status
.
Resources
)
if
len
(
res
.
Info
.
Status
.
Notes
)
>
0
{
fmt
.
Fprintf
(
s
.
out
,
"Notes:
\n
%s
\n
"
,
res
.
Info
.
Status
.
Notes
)
}
return
nil
}
cmd/tiller/release_server.go
View file @
492dbb37
...
...
@@ -23,6 +23,7 @@ import (
"log"
"regexp"
"sort"
"strings"
"github.com/ghodss/yaml"
"github.com/technosophos/moniker"
...
...
@@ -47,6 +48,12 @@ var srv *releaseServer
// characters in length. See https://github.com/kubernetes/helm/issues/1071
const
releaseNameMaxLen
=
14
// NOTES.txt suffix that we want to treat special. It goes through the templating engine
// but it's not a yaml file (resource) hence can't have hooks, etc. And the user actually
// wants to see this file after rendering in the status command. However, it must be a suffix
// since there can be filepath in front of it.
const
NOTES_FILE_SUFFIX
=
"NOTES.txt"
func
init
()
{
srv
=
&
releaseServer
{
env
:
env
,
...
...
@@ -179,6 +186,9 @@ func (s *releaseServer) GetReleaseStatus(c ctx.Context, req *services.GetRelease
if
rel
.
Info
==
nil
{
return
nil
,
errors
.
New
(
"release info is missing"
)
}
if
rel
.
Chart
==
nil
{
return
nil
,
errors
.
New
(
"release chart is missing"
)
}
// Ok, we got the status of the release as we had jotted down, now we need to match the
// manifest we stashed away with reality from the cluster.
...
...
@@ -190,7 +200,7 @@ func (s *releaseServer) GetReleaseStatus(c ctx.Context, req *services.GetRelease
}
rel
.
Info
.
Status
.
Resources
=
resp
return
&
services
.
GetReleaseStatusResponse
{
Info
:
rel
.
Info
},
nil
return
&
services
.
GetReleaseStatusResponse
{
Info
:
rel
.
Info
,
Namespace
:
rel
.
Namespace
},
nil
}
func
(
s
*
releaseServer
)
GetReleaseContent
(
c
ctx
.
Context
,
req
*
services
.
GetReleaseContentRequest
)
(
*
services
.
GetReleaseContentResponse
,
error
)
{
...
...
@@ -281,7 +291,7 @@ func (s *releaseServer) prepareUpdate(req *services.UpdateReleaseRequest) (*rele
return
nil
,
nil
,
err
}
hooks
,
manifestDoc
,
err
:=
s
.
renderResources
(
req
.
Chart
,
valuesToRender
)
hooks
,
manifestDoc
,
notesTxt
,
err
:=
s
.
renderResources
(
req
.
Chart
,
valuesToRender
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
...
...
@@ -302,6 +312,9 @@ func (s *releaseServer) prepareUpdate(req *services.UpdateReleaseRequest) (*rele
Hooks
:
hooks
,
}
if
len
(
notesTxt
)
>
0
{
updatedRelease
.
Info
.
Status
.
Notes
=
notesTxt
}
return
currentRelease
,
updatedRelease
,
nil
}
...
...
@@ -389,7 +402,7 @@ func (s *releaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
return
nil
,
err
}
hooks
,
manifestDoc
,
err
:=
s
.
renderResources
(
req
.
Chart
,
valuesToRender
)
hooks
,
manifestDoc
,
notesTxt
,
err
:=
s
.
renderResources
(
req
.
Chart
,
valuesToRender
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -409,6 +422,9 @@ func (s *releaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
Hooks
:
hooks
,
Version
:
1
,
}
if
len
(
notesTxt
)
>
0
{
rel
.
Info
.
Status
.
Notes
=
notesTxt
}
return
rel
,
nil
}
...
...
@@ -437,11 +453,24 @@ func (s *releaseServer) getVersionSet() (versionSet, error) {
return
newVersionSet
(
versions
...
),
nil
}
func
(
s
*
releaseServer
)
renderResources
(
ch
*
chart
.
Chart
,
values
chartutil
.
Values
)
([]
*
release
.
Hook
,
*
bytes
.
Buffer
,
error
)
{
func
(
s
*
releaseServer
)
renderResources
(
ch
*
chart
.
Chart
,
values
chartutil
.
Values
)
([]
*
release
.
Hook
,
*
bytes
.
Buffer
,
string
,
error
)
{
renderer
:=
s
.
engine
(
ch
)
files
,
err
:=
renderer
.
Render
(
ch
,
values
)
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
""
,
err
}
// NOTES.txt gets rendered like all the other files, but because it's not a hook nor a resource,
// pull it out of here into a separate file so that we can actually use the output of the rendered
// text file. We have to spin through this map because the file contains path information, so we
// look for terminating NOTES.txt. We also remove it from the files so that we don't have to skip
// it in the sortHooks.
notes
:=
""
for
k
,
v
:=
range
files
{
if
strings
.
HasSuffix
(
k
,
NOTES_FILE_SUFFIX
)
{
notes
=
v
delete
(
files
,
k
)
}
}
// Sort hooks, manifests, and partials. Only hooks and manifests are returned,
...
...
@@ -455,7 +484,7 @@ func (s *releaseServer) renderResources(ch *chart.Chart, values chartutil.Values
if
err
!=
nil
{
// By catching parse errors here, we can prevent bogus releases from going
// to Kubernetes.
return
nil
,
nil
,
err
return
nil
,
nil
,
""
,
err
}
// Aggregate all valid manifests into one big doc.
...
...
@@ -465,7 +494,7 @@ func (s *releaseServer) renderResources(ch *chart.Chart, values chartutil.Values
b
.
WriteString
(
file
)
}
return
hooks
,
b
,
nil
return
hooks
,
b
,
n
otes
,
n
il
}
// validateYAML checks to see if YAML is well-formed.
...
...
cmd/tiller/release_server_test.go
View file @
492dbb37
...
...
@@ -35,6 +35,8 @@ import (
"k8s.io/helm/pkg/storage/driver"
)
const
NOTES_TEXT
=
"my notes here"
var
manifestWithHook
=
`apiVersion: v1
kind: ConfigMap
metadata:
...
...
@@ -230,6 +232,137 @@ func TestInstallRelease(t *testing.T) {
}
}
func
TestInstallReleaseWithNotes
(
t
*
testing
.
T
)
{
c
:=
context
.
Background
()
rs
:=
rsFixture
()
// TODO: Refactor this into a mock.
req
:=
&
services
.
InstallReleaseRequest
{
Namespace
:
"spaced"
,
Chart
:
&
chart
.
Chart
{
Metadata
:
&
chart
.
Metadata
{
Name
:
"hello"
},
Templates
:
[]
*
chart
.
Template
{
{
Name
:
"hello"
,
Data
:
[]
byte
(
"hello: world"
)},
{
Name
:
"hooks"
,
Data
:
[]
byte
(
manifestWithHook
)},
{
Name
:
"NOTES.txt"
,
Data
:
[]
byte
(
NOTES_TEXT
)},
},
},
}
res
,
err
:=
rs
.
InstallRelease
(
c
,
req
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed install: %s"
,
err
)
}
if
res
.
Release
.
Name
==
""
{
t
.
Errorf
(
"Expected release name."
)
}
if
res
.
Release
.
Namespace
!=
"spaced"
{
t
.
Errorf
(
"Expected release namespace 'spaced', got '%s'."
,
res
.
Release
.
Namespace
)
}
rel
,
err
:=
rs
.
env
.
Releases
.
Get
(
res
.
Release
.
Name
)
if
err
!=
nil
{
t
.
Errorf
(
"Expected release for %s (%v)."
,
res
.
Release
.
Name
,
rs
.
env
.
Releases
)
}
t
.
Logf
(
"rel: %v"
,
rel
)
if
len
(
rel
.
Hooks
)
!=
1
{
t
.
Fatalf
(
"Expected 1 hook, got %d"
,
len
(
rel
.
Hooks
))
}
if
rel
.
Hooks
[
0
]
.
Manifest
!=
manifestWithHook
{
t
.
Errorf
(
"Unexpected manifest: %v"
,
rel
.
Hooks
[
0
]
.
Manifest
)
}
if
rel
.
Info
.
Status
.
Notes
!=
NOTES_TEXT
{
t
.
Fatalf
(
"Expected '%s', got '%s'"
,
NOTES_TEXT
,
rel
.
Info
.
Status
.
Notes
)
}
if
rel
.
Hooks
[
0
]
.
Events
[
0
]
!=
release
.
Hook_POST_INSTALL
{
t
.
Errorf
(
"Expected event 0 is post install"
)
}
if
rel
.
Hooks
[
0
]
.
Events
[
1
]
!=
release
.
Hook_PRE_DELETE
{
t
.
Errorf
(
"Expected event 0 is pre-delete"
)
}
if
len
(
res
.
Release
.
Manifest
)
==
0
{
t
.
Errorf
(
"No manifest returned: %v"
,
res
.
Release
)
}
if
len
(
rel
.
Manifest
)
==
0
{
t
.
Errorf
(
"Expected manifest in %v"
,
res
)
}
if
!
strings
.
Contains
(
rel
.
Manifest
,
"---
\n
# Source: hello/hello
\n
hello: world"
)
{
t
.
Errorf
(
"unexpected output: %s"
,
rel
.
Manifest
)
}
}
func
TestInstallReleaseWithNotesRendered
(
t
*
testing
.
T
)
{
c
:=
context
.
Background
()
rs
:=
rsFixture
()
// TODO: Refactor this into a mock.
req
:=
&
services
.
InstallReleaseRequest
{
Namespace
:
"spaced"
,
Chart
:
&
chart
.
Chart
{
Metadata
:
&
chart
.
Metadata
{
Name
:
"hello"
},
Templates
:
[]
*
chart
.
Template
{
{
Name
:
"hello"
,
Data
:
[]
byte
(
"hello: world"
)},
{
Name
:
"hooks"
,
Data
:
[]
byte
(
manifestWithHook
)},
{
Name
:
"NOTES.txt"
,
Data
:
[]
byte
(
NOTES_TEXT
+
" {{.Release.Name}}"
)},
},
},
}
res
,
err
:=
rs
.
InstallRelease
(
c
,
req
)
if
err
!=
nil
{
t
.
Errorf
(
"Failed install: %s"
,
err
)
}
if
res
.
Release
.
Name
==
""
{
t
.
Errorf
(
"Expected release name."
)
}
if
res
.
Release
.
Namespace
!=
"spaced"
{
t
.
Errorf
(
"Expected release namespace 'spaced', got '%s'."
,
res
.
Release
.
Namespace
)
}
rel
,
err
:=
rs
.
env
.
Releases
.
Get
(
res
.
Release
.
Name
)
if
err
!=
nil
{
t
.
Errorf
(
"Expected release for %s (%v)."
,
res
.
Release
.
Name
,
rs
.
env
.
Releases
)
}
t
.
Logf
(
"rel: %v"
,
rel
)
if
len
(
rel
.
Hooks
)
!=
1
{
t
.
Fatalf
(
"Expected 1 hook, got %d"
,
len
(
rel
.
Hooks
))
}
if
rel
.
Hooks
[
0
]
.
Manifest
!=
manifestWithHook
{
t
.
Errorf
(
"Unexpected manifest: %v"
,
rel
.
Hooks
[
0
]
.
Manifest
)
}
expectedNotes
:=
fmt
.
Sprintf
(
"%s %s"
,
NOTES_TEXT
,
res
.
Release
.
Name
)
if
rel
.
Info
.
Status
.
Notes
!=
expectedNotes
{
t
.
Fatalf
(
"Expected '%s', got '%s'"
,
expectedNotes
,
rel
.
Info
.
Status
.
Notes
)
}
if
rel
.
Hooks
[
0
]
.
Events
[
0
]
!=
release
.
Hook_POST_INSTALL
{
t
.
Errorf
(
"Expected event 0 is post install"
)
}
if
rel
.
Hooks
[
0
]
.
Events
[
1
]
!=
release
.
Hook_PRE_DELETE
{
t
.
Errorf
(
"Expected event 0 is pre-delete"
)
}
if
len
(
res
.
Release
.
Manifest
)
==
0
{
t
.
Errorf
(
"No manifest returned: %v"
,
res
.
Release
)
}
if
len
(
rel
.
Manifest
)
==
0
{
t
.
Errorf
(
"Expected manifest in %v"
,
res
)
}
if
!
strings
.
Contains
(
rel
.
Manifest
,
"---
\n
# Source: hello/hello
\n
hello: world"
)
{
t
.
Errorf
(
"unexpected output: %s"
,
rel
.
Manifest
)
}
}
func
TestInstallReleaseDryRun
(
t
*
testing
.
T
)
{
c
:=
context
.
Background
()
rs
:=
rsFixture
()
...
...
pkg/engine/engine.go
View file @
492dbb37
...
...
@@ -54,7 +54,7 @@ func New() *Engine {
}
}
// Render takes a chart, optional values, and value overrids, and attempts to render the Go templates.
// Render takes a chart, optional values, and value overrid
e
s, and attempts to render the Go templates.
//
// Render can be called repeatedly on the same engine.
//
...
...
pkg/proto/hapi/release/status.pb.go
View file @
492dbb37
...
...
@@ -55,6 +55,8 @@ type Status struct {
Details
*
google_protobuf1
.
Any
`protobuf:"bytes,2,opt,name=details" json:"details,omitempty"`
// Cluster resources as kubectl would print them.
Resources
string
`protobuf:"bytes,3,opt,name=resources" json:"resources,omitempty"`
// Contains the rendered templates/NOTES.txt if available
Notes
string
`protobuf:"bytes,4,opt,name=notes" json:"notes,omitempty"`
}
func
(
m
*
Status
)
Reset
()
{
*
m
=
Status
{}
}
...
...
@@ -75,21 +77,22 @@ func init() {
}
var
fileDescriptor3
=
[]
byte
{
// 247 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x09
,
0x6e
,
0x88
,
0x02
,
0xff
,
0xe2
,
0x92
,
0xcc
,
0x48
,
0x2c
,
0xc8
,
0xd4
,
0x2f
,
0x4a
,
0xcd
,
0x49
,
0x4d
,
0x2c
,
0x4e
,
0xd5
,
0x2f
,
0x2e
,
0x49
,
0x2c
,
0x29
,
0x2d
,
0xd6
,
0x2b
,
0x28
,
0xca
,
0x2f
,
0xc9
,
0x17
,
0xe2
,
0x01
,
0x49
,
0xe9
,
0x41
,
0xa5
,
0xa4
,
0x24
,
0xd3
,
0xf3
,
0xf3
,
0xd3
,
0x73
,
0x52
,
0xf5
,
0xc1
,
0x72
,
0x49
,
0xa5
,
0x69
,
0xfa
,
0x89
,
0x79
,
0x95
,
0x10
,
0x85
,
0x4a
,
0x17
,
0x19
,
0xb9
,
0xd8
,
0x82
,
0xc1
,
0x3a
,
0x85
,
0x74
,
0xb9
,
0x58
,
0x92
,
0xf3
,
0x53
,
0x52
,
0x25
,
0x18
,
0x15
,
0x18
,
0x35
,
0xf8
,
0x8c
,
0x24
,
0xf5
,
0x90
,
0x8d
,
0xd0
,
0x83
,
0xa8
,
0xd1
,
0x73
,
0x06
,
0x2a
,
0x08
,
0x02
,
0x2b
,
0x13
,
0xd2
,
0xe3
,
0x62
,
0x4f
,
0x49
,
0x2d
,
0x49
,
0xcc
,
0xcc
,
0x29
,
0x96
,
0x60
,
0x02
,
0xea
,
0xe0
,
0x36
,
0x12
,
0xd1
,
0x83
,
0x58
,
0xa3
,
0x07
,
0xb3
,
0x46
,
0xcf
,
0x31
,
0xaf
,
0x32
,
0x08
,
0xa6
,
0x48
,
0x48
,
0x86
,
0x8b
,
0xb3
,
0x28
,
0xb5
,
0x38
,
0xbf
,
0xb4
,
0x28
,
0x39
,
0xb5
,
0x58
,
0x82
,
0x19
,
0xa8
,
0x83
,
0x33
,
0x08
,
0x21
,
0xa0
,
0xe4
,
0xc5
,
0xc5
,
0x02
,
0x32
,
0x5b
,
0x88
,
0x9b
,
0x8b
,
0x3d
,
0xd4
,
0xcf
,
0xdb
,
0xcf
,
0x3f
,
0xdc
,
0x4f
,
0x80
,
0x41
,
0x88
,
0x87
,
0x8b
,
0xc3
,
0xc5
,
0x35
,
0xc0
,
0xc7
,
0x3f
,
0xd2
,
0xd5
,
0x45
,
0x80
,
0x11
,
0x24
,
0xe5
,
0xe2
,
0xea
,
0xe3
,
0x1a
,
0x02
,
0xe4
,
0x30
,
0x09
,
0xf1
,
0x71
,
0x71
,
0x05
,
0x87
,
0x06
,
0xb8
,
0x06
,
0x05
,
0xbb
,
0xba
,
0x00
,
0xf9
,
0xcc
,
0x42
,
0x5c
,
0x5c
,
0x6c
,
0x6e
,
0x8e
,
0x9e
,
0x3e
,
0x40
,
0x36
,
0x8b
,
0x13
,
0x67
,
0x14
,
0x3b
,
0xd4
,
0xd9
,
0x49
,
0x6c
,
0x60
,
0xb7
,
0x18
,
0x03
,
0x02
,
0x00
,
0x00
,
0xff
,
0xff
,
0xd1
,
0xc3
,
0xbf
,
0x50
,
0x2b
,
0x01
,
0x00
,
0x00
,
// 259 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x09
,
0x6e
,
0x88
,
0x02
,
0xff
,
0x4c
,
0x8f
,
0xc1
,
0x4e
,
0xf2
,
0x40
,
0x14
,
0x85
,
0xff
,
0x42
,
0xff
,
0xd6
,
0x5e
,
0x08
,
0x21
,
0x37
,
0x2c
,
0x5a
,
0xe3
,
0xc2
,
0xb0
,
0x72
,
0xe3
,
0x6d
,
0x82
,
0x4f
,
0x80
,
0x76
,
0x4c
,
0xd4
,
0xa6
,
0x90
,
0x56
,
0x62
,
0x74
,
0x37
,
0xc0
,
0x88
,
0x24
,
0x4d
,
0x87
,
0x74
,
0xa6
,
0x0b
,
0x9e
,
0xd8
,
0xd7
,
0x70
,
0x3a
,
0x85
,
0xe8
,
0xae
,
0xa7
,
0xdf
,
0x77
,
0xe6
,
0xcc
,
0x40
,
0xf4
,
0xc5
,
0x0f
,
0xfb
,
0xb8
,
0x16
,
0xa5
,
0xe0
,
0x4a
,
0xc4
,
0x4a
,
0x73
,
0xdd
,
0x28
,
0x3a
,
0xd4
,
0x52
,
0x4b
,
0x1c
,
0xb6
,
0x88
,
0x4e
,
0xe8
,
0x32
,
0xda
,
0x49
,
0xb9
,
0x2b
,
0x45
,
0x6c
,
0xd9
,
0xba
,
0xf9
,
0x8c
,
0x79
,
0x75
,
0xec
,
0xc4
,
0xe9
,
0xb7
,
0x03
,
0x5e
,
0x61
,
0x9b
,
0x78
,
0x0b
,
0xee
,
0x46
,
0x6e
,
0x45
,
0xe8
,
0x5c
,
0x3b
,
0x37
,
0xa3
,
0x59
,
0x44
,
0x7f
,
0x8f
,
0xa0
,
0xce
,
0xa1
,
0x07
,
0x23
,
0xe4
,
0x56
,
0x43
,
0x02
,
0x7f
,
0x2b
,
0x34
,
0xdf
,
0x97
,
0x2a
,
0xec
,
0x99
,
0xc6
,
0x60
,
0x36
,
0xa1
,
0x6e
,
0x86
,
0xce
,
0x33
,
0x34
,
0xaf
,
0x8e
,
0xf9
,
0x59
,
0xc2
,
0x2b
,
0x08
,
0x6a
,
0xa1
,
0x64
,
0x53
,
0x6f
,
0x84
,
0x0a
,
0xfb
,
0xa6
,
0x11
,
0xe4
,
0xbf
,
0x3f
,
0x70
,
0x02
,
0xff
,
0x2b
,
0xa9
,
0x0d
,
0x71
,
0x2d
,
0xe9
,
0xc2
,
0xf4
,
0x19
,
0xdc
,
0x76
,
0x11
,
0x07
,
0xe0
,
0xaf
,
0xb2
,
0x97
,
0x6c
,
0xf1
,
0x96
,
0x8d
,
0xff
,
0xe1
,
0x10
,
0x2e
,
0x12
,
0xb6
,
0x4c
,
0x17
,
0xef
,
0x2c
,
0x19
,
0x3b
,
0x2d
,
0x4a
,
0x58
,
0xca
,
0x5e
,
0x4d
,
0xe8
,
0xe1
,
0x08
,
0xa0
,
0x58
,
0x2d
,
0x59
,
0x5e
,
0xb0
,
0xc4
,
0xe4
,
0x3e
,
0x02
,
0x78
,
0x8f
,
0xf3
,
0xa7
,
0xd4
,
0x7c
,
0xbb
,
0xf7
,
0xc1
,
0x87
,
0x7f
,
0x7a
,
0xcc
,
0xda
,
0xb3
,
0x37
,
0xbc
,
0xfb
,
0x09
,
0x00
,
0x00
,
0xff
,
0xff
,
0xae
,
0x07
,
0x47
,
0x1f
,
0x41
,
0x01
,
0x00
,
0x00
,
}
pkg/proto/hapi/services/tiller.pb.go
View file @
492dbb37
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment