Initial logs streaming at release install.

pull/3263/head
Garanzha Dmitriy 8 years ago
parent 782f855ad9
commit 8ca8b30173

@ -61,7 +61,7 @@ service ReleaseService {
} }
// InstallRelease requests installation of a chart as a new release. // InstallRelease requests installation of a chart as a new release.
rpc InstallRelease(InstallReleaseRequest) returns (InstallReleaseResponse) { rpc InstallRelease(InstallReleaseRequest) returns (stream InstallReleaseResponse) {
} }
// UninstallRelease requests deletion of a named release. // UninstallRelease requests deletion of a named release.
@ -273,9 +273,23 @@ message InstallReleaseRequest {
bool wait = 9; bool wait = 9;
} }
message LogItem {
enum Level {
INFO = 0;
ERROR = 1;
}
Level level = 1;
string message = 2;
}
// InstallReleaseResponse is the response from a release installation. // InstallReleaseResponse is the response from a release installation.
message InstallReleaseResponse { message InstallReleaseResponse {
// One of the following will be filled in.
oneof response {
hapi.release.Release release = 1; hapi.release.Release release = 1;
LogItem logItem = 2;
}
} }
// UninstallReleaseRequest represents a request to uninstall a named release. // UninstallReleaseRequest represents a request to uninstall a named release.

@ -266,6 +266,9 @@ func ensureHelmClient(h helm.Interface) helm.Interface {
func newClient() helm.Interface { func newClient() helm.Interface {
options := []helm.Option{helm.Host(settings.TillerHost)} options := []helm.Option{helm.Host(settings.TillerHost)}
logger := new(helm.ConsoleLogger)
options = append(options, helm.WithLogger(logger))
if tlsVerify || tlsEnable { if tlsVerify || tlsEnable {
if tlsCaCertFile == "" { if tlsCaCertFile == "" {
tlsCaCertFile = settings.Home.TLSCaCert() tlsCaCertFile = settings.Home.TLSCaCert()

@ -334,7 +334,34 @@ func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (*
defer c.Close() defer c.Close()
rlc := rls.NewReleaseServiceClient(c) rlc := rls.NewReleaseServiceClient(c)
return rlc.InstallRelease(ctx, req) client, err := rlc.InstallRelease(ctx, req)
if err != nil {
return nil, err
}
var releaseResponse *rls.InstallReleaseResponse
for {
result, err := client.Recv()
if err == io.EOF {
return releaseResponse, nil
}
if err != nil {
return nil, err
}
switch x := result.Response.(type) {
case *rls.InstallReleaseResponse_Release:
releaseResponse = result
break
case *rls.InstallReleaseResponse_LogItem:
h.opts.logger.Log(x.LogItem.Level, x.LogItem.Message)
break
}
}
} }
// Executes tiller.UninstallRelease RPC. // Executes tiller.UninstallRelease RPC.

@ -80,7 +80,9 @@ func (c *FakeClient) InstallReleaseFromChart(chart *chart.Chart, ns string, opts
c.Rels = append(c.Rels, release) c.Rels = append(c.Rels, release)
return &rls.InstallReleaseResponse{ return &rls.InstallReleaseResponse{
Response: &rls.InstallReleaseResponse_Release {
Release: release, Release: release,
},
}, nil }, nil
} }

@ -143,8 +143,10 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) {
opts: []InstallOption{ReleaseName("new-release")}, opts: []InstallOption{ReleaseName("new-release")},
}, },
want: &rls.InstallReleaseResponse{ want: &rls.InstallReleaseResponse{
Response: &rls.InstallReleaseResponse_Release{
Release: ReleaseMock(&MockReleaseOptions{Name: "new-release"}), Release: ReleaseMock(&MockReleaseOptions{Name: "new-release"}),
}, },
},
relsAfter: []*release.Release{ relsAfter: []*release.Release{
ReleaseMock(&MockReleaseOptions{Name: "new-release"}), ReleaseMock(&MockReleaseOptions{Name: "new-release"}),
}, },

@ -0,0 +1,23 @@
package helm
import (
"fmt"
rls "k8s.io/helm/pkg/proto/hapi/services"
)
type TillerOutputLogger interface {
Log(level rls.LogItem_Level, message string)
}
type ConsoleLogger struct {}
func (logger *ConsoleLogger) Log(level rls.LogItem_Level, message string) {
switch level {
case rls.LogItem_INFO:
fmt.Println(message)
break
case rls.LogItem_ERROR:
fmt.Println(fmt.Sprintf("Error: %s", message))
break
}
}

@ -78,6 +78,8 @@ type options struct {
reuseValues bool reuseValues bool
// release test options are applied directly to the test release history request // release test options are applied directly to the test release history request
testReq rls.TestReleaseRequest testReq rls.TestReleaseRequest
// logger for tiller output messages
logger TillerOutputLogger
} }
// Host specifies the host address of the Tiller release server, (default = ":44134"). // Host specifies the host address of the Tiller release server, (default = ":44134").
@ -87,6 +89,12 @@ func Host(host string) Option {
} }
} }
func WithLogger(logger TillerOutputLogger) Option {
return func(opts *options) {
opts.logger = logger
}
}
// WithTLS specifies the tls configuration if the helm client is enabled to use TLS. // WithTLS specifies the tls configuration if the helm client is enabled to use TLS.
func WithTLS(cfg *tls.Config) Option { func WithTLS(cfg *tls.Config) Option {
return func(opts *options) { return func(opts *options) {

@ -1,5 +1,6 @@
// Code generated by protoc-gen-go. DO NOT EDIT. // Code generated by protoc-gen-go.
// source: hapi/services/tiller.proto // source: hapi/services/tiller.proto
// DO NOT EDIT!
/* /*
Package services is a generated protocol buffer package. Package services is a generated protocol buffer package.
@ -20,6 +21,7 @@ It has these top-level messages:
RollbackReleaseRequest RollbackReleaseRequest
RollbackReleaseResponse RollbackReleaseResponse
InstallReleaseRequest InstallReleaseRequest
LogItem
InstallReleaseResponse InstallReleaseResponse
UninstallReleaseRequest UninstallReleaseRequest
UninstallReleaseResponse UninstallReleaseResponse
@ -106,6 +108,27 @@ func (x ListSort_SortOrder) String() string {
} }
func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 1} } func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 1} }
type LogItem_Level int32
const (
LogItem_INFO LogItem_Level = 0
LogItem_ERROR LogItem_Level = 1
)
var LogItem_Level_name = map[int32]string{
0: "INFO",
1: "ERROR",
}
var LogItem_Level_value = map[string]int32{
"INFO": 0,
"ERROR": 1,
}
func (x LogItem_Level) String() string {
return proto.EnumName(LogItem_Level_name, int32(x))
}
func (LogItem_Level) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} }
// ListReleasesRequest requests a list of releases. // ListReleasesRequest requests a list of releases.
// //
// Releases can be retrieved in chunks by setting limit and offset. // Releases can be retrieved in chunks by setting limit and offset.
@ -138,55 +161,6 @@ func (m *ListReleasesRequest) String() string { return proto.CompactT
func (*ListReleasesRequest) ProtoMessage() {} func (*ListReleasesRequest) ProtoMessage() {}
func (*ListReleasesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } func (*ListReleasesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *ListReleasesRequest) GetLimit() int64 {
if m != nil {
return m.Limit
}
return 0
}
func (m *ListReleasesRequest) GetOffset() string {
if m != nil {
return m.Offset
}
return ""
}
func (m *ListReleasesRequest) GetSortBy() ListSort_SortBy {
if m != nil {
return m.SortBy
}
return ListSort_UNKNOWN
}
func (m *ListReleasesRequest) GetFilter() string {
if m != nil {
return m.Filter
}
return ""
}
func (m *ListReleasesRequest) GetSortOrder() ListSort_SortOrder {
if m != nil {
return m.SortOrder
}
return ListSort_ASC
}
func (m *ListReleasesRequest) GetStatusCodes() []hapi_release3.Status_Code {
if m != nil {
return m.StatusCodes
}
return nil
}
func (m *ListReleasesRequest) GetNamespace() string {
if m != nil {
return m.Namespace
}
return ""
}
// ListSort defines sorting fields on a release list. // ListSort defines sorting fields on a release list.
type ListSort struct { type ListSort struct {
} }
@ -214,27 +188,6 @@ func (m *ListReleasesResponse) String() string { return proto.Compact
func (*ListReleasesResponse) ProtoMessage() {} func (*ListReleasesResponse) ProtoMessage() {}
func (*ListReleasesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } func (*ListReleasesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *ListReleasesResponse) GetCount() int64 {
if m != nil {
return m.Count
}
return 0
}
func (m *ListReleasesResponse) GetNext() string {
if m != nil {
return m.Next
}
return ""
}
func (m *ListReleasesResponse) GetTotal() int64 {
if m != nil {
return m.Total
}
return 0
}
func (m *ListReleasesResponse) GetReleases() []*hapi_release5.Release { func (m *ListReleasesResponse) GetReleases() []*hapi_release5.Release {
if m != nil { if m != nil {
return m.Releases return m.Releases
@ -255,20 +208,6 @@ func (m *GetReleaseStatusRequest) String() string { return proto.Comp
func (*GetReleaseStatusRequest) ProtoMessage() {} func (*GetReleaseStatusRequest) ProtoMessage() {}
func (*GetReleaseStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } func (*GetReleaseStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *GetReleaseStatusRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *GetReleaseStatusRequest) GetVersion() int32 {
if m != nil {
return m.Version
}
return 0
}
// GetReleaseStatusResponse is the response indicating the status of the named release. // GetReleaseStatusResponse is the response indicating the status of the named release.
type GetReleaseStatusResponse struct { type GetReleaseStatusResponse struct {
// Name is the name of the release. // Name is the name of the release.
@ -284,13 +223,6 @@ func (m *GetReleaseStatusResponse) String() string { return proto.Com
func (*GetReleaseStatusResponse) ProtoMessage() {} func (*GetReleaseStatusResponse) ProtoMessage() {}
func (*GetReleaseStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } func (*GetReleaseStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *GetReleaseStatusResponse) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *GetReleaseStatusResponse) GetInfo() *hapi_release4.Info { func (m *GetReleaseStatusResponse) GetInfo() *hapi_release4.Info {
if m != nil { if m != nil {
return m.Info return m.Info
@ -298,13 +230,6 @@ func (m *GetReleaseStatusResponse) GetInfo() *hapi_release4.Info {
return nil return nil
} }
func (m *GetReleaseStatusResponse) GetNamespace() string {
if m != nil {
return m.Namespace
}
return ""
}
// GetReleaseContentRequest is a request to get the contents of a release. // GetReleaseContentRequest is a request to get the contents of a release.
type GetReleaseContentRequest struct { type GetReleaseContentRequest struct {
// The name of the release // The name of the release
@ -318,20 +243,6 @@ func (m *GetReleaseContentRequest) String() string { return proto.Com
func (*GetReleaseContentRequest) ProtoMessage() {} func (*GetReleaseContentRequest) ProtoMessage() {}
func (*GetReleaseContentRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (*GetReleaseContentRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *GetReleaseContentRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *GetReleaseContentRequest) GetVersion() int32 {
if m != nil {
return m.Version
}
return 0
}
// GetReleaseContentResponse is a response containing the contents of a release. // GetReleaseContentResponse is a response containing the contents of a release.
type GetReleaseContentResponse struct { type GetReleaseContentResponse struct {
// The release content // The release content
@ -383,13 +294,6 @@ func (m *UpdateReleaseRequest) String() string { return proto.Compact
func (*UpdateReleaseRequest) ProtoMessage() {} func (*UpdateReleaseRequest) ProtoMessage() {}
func (*UpdateReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (*UpdateReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *UpdateReleaseRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *UpdateReleaseRequest) GetChart() *hapi_chart3.Chart { func (m *UpdateReleaseRequest) GetChart() *hapi_chart3.Chart {
if m != nil { if m != nil {
return m.Chart return m.Chart
@ -404,62 +308,6 @@ func (m *UpdateReleaseRequest) GetValues() *hapi_chart.Config {
return nil return nil
} }
func (m *UpdateReleaseRequest) GetDryRun() bool {
if m != nil {
return m.DryRun
}
return false
}
func (m *UpdateReleaseRequest) GetDisableHooks() bool {
if m != nil {
return m.DisableHooks
}
return false
}
func (m *UpdateReleaseRequest) GetRecreate() bool {
if m != nil {
return m.Recreate
}
return false
}
func (m *UpdateReleaseRequest) GetTimeout() int64 {
if m != nil {
return m.Timeout
}
return 0
}
func (m *UpdateReleaseRequest) GetResetValues() bool {
if m != nil {
return m.ResetValues
}
return false
}
func (m *UpdateReleaseRequest) GetWait() bool {
if m != nil {
return m.Wait
}
return false
}
func (m *UpdateReleaseRequest) GetReuseValues() bool {
if m != nil {
return m.ReuseValues
}
return false
}
func (m *UpdateReleaseRequest) GetForce() bool {
if m != nil {
return m.Force
}
return false
}
// UpdateReleaseResponse is the response to an update request. // UpdateReleaseResponse is the response to an update request.
type UpdateReleaseResponse struct { type UpdateReleaseResponse struct {
Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"`
@ -502,62 +350,6 @@ func (m *RollbackReleaseRequest) String() string { return proto.Compa
func (*RollbackReleaseRequest) ProtoMessage() {} func (*RollbackReleaseRequest) ProtoMessage() {}
func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *RollbackReleaseRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *RollbackReleaseRequest) GetDryRun() bool {
if m != nil {
return m.DryRun
}
return false
}
func (m *RollbackReleaseRequest) GetDisableHooks() bool {
if m != nil {
return m.DisableHooks
}
return false
}
func (m *RollbackReleaseRequest) GetVersion() int32 {
if m != nil {
return m.Version
}
return 0
}
func (m *RollbackReleaseRequest) GetRecreate() bool {
if m != nil {
return m.Recreate
}
return false
}
func (m *RollbackReleaseRequest) GetTimeout() int64 {
if m != nil {
return m.Timeout
}
return 0
}
func (m *RollbackReleaseRequest) GetWait() bool {
if m != nil {
return m.Wait
}
return false
}
func (m *RollbackReleaseRequest) GetForce() bool {
if m != nil {
return m.Force
}
return false
}
// RollbackReleaseResponse is the response to an update request. // RollbackReleaseResponse is the response to an update request.
type RollbackReleaseResponse struct { type RollbackReleaseResponse struct {
Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"`
@ -621,72 +413,140 @@ func (m *InstallReleaseRequest) GetValues() *hapi_chart.Config {
return nil return nil
} }
func (m *InstallReleaseRequest) GetDryRun() bool { type LogItem struct {
if m != nil { Level LogItem_Level `protobuf:"varint,1,opt,name=level,enum=hapi.services.tiller.LogItem_Level" json:"level,omitempty"`
return m.DryRun Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
}
return false
} }
func (m *InstallReleaseRequest) GetName() string { func (m *LogItem) Reset() { *m = LogItem{} }
if m != nil { func (m *LogItem) String() string { return proto.CompactTextString(m) }
return m.Name func (*LogItem) ProtoMessage() {}
} func (*LogItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
return ""
// InstallReleaseResponse is the response from a release installation.
type InstallReleaseResponse struct {
// One of the following will be filled in.
//
// Types that are valid to be assigned to Response:
// *InstallReleaseResponse_Release
// *InstallReleaseResponse_LogItem
Response isInstallReleaseResponse_Response `protobuf_oneof:"response"`
} }
func (m *InstallReleaseRequest) GetDisableHooks() bool { func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} }
if m != nil { func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) }
return m.DisableHooks func (*InstallReleaseResponse) ProtoMessage() {}
} func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
return false
type isInstallReleaseResponse_Response interface {
isInstallReleaseResponse_Response()
} }
func (m *InstallReleaseRequest) GetNamespace() string { type InstallReleaseResponse_Release struct {
if m != nil { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release,oneof"`
return m.Namespace }
} type InstallReleaseResponse_LogItem struct {
return "" LogItem *LogItem `protobuf:"bytes,2,opt,name=logItem,oneof"`
} }
func (m *InstallReleaseRequest) GetReuseName() bool { func (*InstallReleaseResponse_Release) isInstallReleaseResponse_Response() {}
func (*InstallReleaseResponse_LogItem) isInstallReleaseResponse_Response() {}
func (m *InstallReleaseResponse) GetResponse() isInstallReleaseResponse_Response {
if m != nil { if m != nil {
return m.ReuseName return m.Response
} }
return false return nil
} }
func (m *InstallReleaseRequest) GetTimeout() int64 { func (m *InstallReleaseResponse) GetRelease() *hapi_release5.Release {
if m != nil { if x, ok := m.GetResponse().(*InstallReleaseResponse_Release); ok {
return m.Timeout return x.Release
} }
return 0 return nil
} }
func (m *InstallReleaseRequest) GetWait() bool { func (m *InstallReleaseResponse) GetLogItem() *LogItem {
if m != nil { if x, ok := m.GetResponse().(*InstallReleaseResponse_LogItem); ok {
return m.Wait return x.LogItem
} }
return false return nil
} }
// InstallReleaseResponse is the response from a release installation. // XXX_OneofFuncs is for the internal use of the proto package.
type InstallReleaseResponse struct { func (*InstallReleaseResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` return _InstallReleaseResponse_OneofMarshaler, _InstallReleaseResponse_OneofUnmarshaler, _InstallReleaseResponse_OneofSizer, []interface{}{
(*InstallReleaseResponse_Release)(nil),
(*InstallReleaseResponse_LogItem)(nil),
}
} }
func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} } func _InstallReleaseResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } m := msg.(*InstallReleaseResponse)
func (*InstallReleaseResponse) ProtoMessage() {} // response
func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } switch x := m.Response.(type) {
case *InstallReleaseResponse_Release:
func (m *InstallReleaseResponse) GetRelease() *hapi_release5.Release { b.EncodeVarint(1<<3 | proto.WireBytes)
if m != nil { if err := b.EncodeMessage(x.Release); err != nil {
return m.Release return err
}
case *InstallReleaseResponse_LogItem:
b.EncodeVarint(2<<3 | proto.WireBytes)
if err := b.EncodeMessage(x.LogItem); err != nil {
return err
}
case nil:
default:
return fmt.Errorf("InstallReleaseResponse.Response has unexpected type %T", x)
} }
return nil return nil
} }
func _InstallReleaseResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
m := msg.(*InstallReleaseResponse)
switch tag {
case 1: // response.release
if wire != proto.WireBytes {
return true, proto.ErrInternalBadWireType
}
msg := new(hapi_release5.Release)
err := b.DecodeMessage(msg)
m.Response = &InstallReleaseResponse_Release{msg}
return true, err
case 2: // response.logItem
if wire != proto.WireBytes {
return true, proto.ErrInternalBadWireType
}
msg := new(LogItem)
err := b.DecodeMessage(msg)
m.Response = &InstallReleaseResponse_LogItem{msg}
return true, err
default:
return false, nil
}
}
func _InstallReleaseResponse_OneofSizer(msg proto.Message) (n int) {
m := msg.(*InstallReleaseResponse)
// response
switch x := m.Response.(type) {
case *InstallReleaseResponse_Release:
s := proto.Size(x.Release)
n += proto.SizeVarint(1<<3 | proto.WireBytes)
n += proto.SizeVarint(uint64(s))
n += s
case *InstallReleaseResponse_LogItem:
s := proto.Size(x.LogItem)
n += proto.SizeVarint(2<<3 | proto.WireBytes)
n += proto.SizeVarint(uint64(s))
n += s
case nil:
default:
panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
}
return n
}
// UninstallReleaseRequest represents a request to uninstall a named release. // UninstallReleaseRequest represents a request to uninstall a named release.
type UninstallReleaseRequest struct { type UninstallReleaseRequest struct {
// Name is the name of the release to delete. // Name is the name of the release to delete.
@ -702,35 +562,7 @@ type UninstallReleaseRequest struct {
func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest{} } func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest{} }
func (m *UninstallReleaseRequest) String() string { return proto.CompactTextString(m) } func (m *UninstallReleaseRequest) String() string { return proto.CompactTextString(m) }
func (*UninstallReleaseRequest) ProtoMessage() {} func (*UninstallReleaseRequest) ProtoMessage() {}
func (*UninstallReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } func (*UninstallReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *UninstallReleaseRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *UninstallReleaseRequest) GetDisableHooks() bool {
if m != nil {
return m.DisableHooks
}
return false
}
func (m *UninstallReleaseRequest) GetPurge() bool {
if m != nil {
return m.Purge
}
return false
}
func (m *UninstallReleaseRequest) GetTimeout() int64 {
if m != nil {
return m.Timeout
}
return 0
}
// UninstallReleaseResponse represents a successful response to an uninstall request. // UninstallReleaseResponse represents a successful response to an uninstall request.
type UninstallReleaseResponse struct { type UninstallReleaseResponse struct {
@ -743,7 +575,7 @@ type UninstallReleaseResponse struct {
func (m *UninstallReleaseResponse) Reset() { *m = UninstallReleaseResponse{} } func (m *UninstallReleaseResponse) Reset() { *m = UninstallReleaseResponse{} }
func (m *UninstallReleaseResponse) String() string { return proto.CompactTextString(m) } func (m *UninstallReleaseResponse) String() string { return proto.CompactTextString(m) }
func (*UninstallReleaseResponse) ProtoMessage() {} func (*UninstallReleaseResponse) ProtoMessage() {}
func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *UninstallReleaseResponse) GetRelease() *hapi_release5.Release { func (m *UninstallReleaseResponse) GetRelease() *hapi_release5.Release {
if m != nil { if m != nil {
@ -752,13 +584,6 @@ func (m *UninstallReleaseResponse) GetRelease() *hapi_release5.Release {
return nil return nil
} }
func (m *UninstallReleaseResponse) GetInfo() string {
if m != nil {
return m.Info
}
return ""
}
// GetVersionRequest requests for version information. // GetVersionRequest requests for version information.
type GetVersionRequest struct { type GetVersionRequest struct {
} }
@ -766,7 +591,7 @@ type GetVersionRequest struct {
func (m *GetVersionRequest) Reset() { *m = GetVersionRequest{} } func (m *GetVersionRequest) Reset() { *m = GetVersionRequest{} }
func (m *GetVersionRequest) String() string { return proto.CompactTextString(m) } func (m *GetVersionRequest) String() string { return proto.CompactTextString(m) }
func (*GetVersionRequest) ProtoMessage() {} func (*GetVersionRequest) ProtoMessage() {}
func (*GetVersionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (*GetVersionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
type GetVersionResponse struct { type GetVersionResponse struct {
Version *hapi_version.Version `protobuf:"bytes,1,opt,name=Version" json:"Version,omitempty"` Version *hapi_version.Version `protobuf:"bytes,1,opt,name=Version" json:"Version,omitempty"`
@ -775,7 +600,7 @@ type GetVersionResponse struct {
func (m *GetVersionResponse) Reset() { *m = GetVersionResponse{} } func (m *GetVersionResponse) Reset() { *m = GetVersionResponse{} }
func (m *GetVersionResponse) String() string { return proto.CompactTextString(m) } func (m *GetVersionResponse) String() string { return proto.CompactTextString(m) }
func (*GetVersionResponse) ProtoMessage() {} func (*GetVersionResponse) ProtoMessage() {}
func (*GetVersionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } func (*GetVersionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *GetVersionResponse) GetVersion() *hapi_version.Version { func (m *GetVersionResponse) GetVersion() *hapi_version.Version {
if m != nil { if m != nil {
@ -795,21 +620,7 @@ type GetHistoryRequest struct {
func (m *GetHistoryRequest) Reset() { *m = GetHistoryRequest{} } func (m *GetHistoryRequest) Reset() { *m = GetHistoryRequest{} }
func (m *GetHistoryRequest) String() string { return proto.CompactTextString(m) } func (m *GetHistoryRequest) String() string { return proto.CompactTextString(m) }
func (*GetHistoryRequest) ProtoMessage() {} func (*GetHistoryRequest) ProtoMessage() {}
func (*GetHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (*GetHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *GetHistoryRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *GetHistoryRequest) GetMax() int32 {
if m != nil {
return m.Max
}
return 0
}
// GetHistoryResponse is received in response to a GetHistory rpc. // GetHistoryResponse is received in response to a GetHistory rpc.
type GetHistoryResponse struct { type GetHistoryResponse struct {
@ -819,7 +630,7 @@ type GetHistoryResponse struct {
func (m *GetHistoryResponse) Reset() { *m = GetHistoryResponse{} } func (m *GetHistoryResponse) Reset() { *m = GetHistoryResponse{} }
func (m *GetHistoryResponse) String() string { return proto.CompactTextString(m) } func (m *GetHistoryResponse) String() string { return proto.CompactTextString(m) }
func (*GetHistoryResponse) ProtoMessage() {} func (*GetHistoryResponse) ProtoMessage() {}
func (*GetHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } func (*GetHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *GetHistoryResponse) GetReleases() []*hapi_release5.Release { func (m *GetHistoryResponse) GetReleases() []*hapi_release5.Release {
if m != nil { if m != nil {
@ -841,28 +652,7 @@ type TestReleaseRequest struct {
func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} } func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} }
func (m *TestReleaseRequest) String() string { return proto.CompactTextString(m) } func (m *TestReleaseRequest) String() string { return proto.CompactTextString(m) }
func (*TestReleaseRequest) ProtoMessage() {} func (*TestReleaseRequest) ProtoMessage() {}
func (*TestReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (*TestReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *TestReleaseRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *TestReleaseRequest) GetTimeout() int64 {
if m != nil {
return m.Timeout
}
return 0
}
func (m *TestReleaseRequest) GetCleanup() bool {
if m != nil {
return m.Cleanup
}
return false
}
// TestReleaseResponse represents a message from executing a test // TestReleaseResponse represents a message from executing a test
type TestReleaseResponse struct { type TestReleaseResponse struct {
@ -873,21 +663,7 @@ type TestReleaseResponse struct {
func (m *TestReleaseResponse) Reset() { *m = TestReleaseResponse{} } func (m *TestReleaseResponse) Reset() { *m = TestReleaseResponse{} }
func (m *TestReleaseResponse) String() string { return proto.CompactTextString(m) } func (m *TestReleaseResponse) String() string { return proto.CompactTextString(m) }
func (*TestReleaseResponse) ProtoMessage() {} func (*TestReleaseResponse) ProtoMessage() {}
func (*TestReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } func (*TestReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *TestReleaseResponse) GetMsg() string {
if m != nil {
return m.Msg
}
return ""
}
func (m *TestReleaseResponse) GetStatus() hapi_release1.TestRun_Status {
if m != nil {
return m.Status
}
return hapi_release1.TestRun_UNKNOWN
}
func init() { func init() {
proto.RegisterType((*ListReleasesRequest)(nil), "hapi.services.tiller.ListReleasesRequest") proto.RegisterType((*ListReleasesRequest)(nil), "hapi.services.tiller.ListReleasesRequest")
@ -902,6 +678,7 @@ func init() {
proto.RegisterType((*RollbackReleaseRequest)(nil), "hapi.services.tiller.RollbackReleaseRequest") proto.RegisterType((*RollbackReleaseRequest)(nil), "hapi.services.tiller.RollbackReleaseRequest")
proto.RegisterType((*RollbackReleaseResponse)(nil), "hapi.services.tiller.RollbackReleaseResponse") proto.RegisterType((*RollbackReleaseResponse)(nil), "hapi.services.tiller.RollbackReleaseResponse")
proto.RegisterType((*InstallReleaseRequest)(nil), "hapi.services.tiller.InstallReleaseRequest") proto.RegisterType((*InstallReleaseRequest)(nil), "hapi.services.tiller.InstallReleaseRequest")
proto.RegisterType((*LogItem)(nil), "hapi.services.tiller.LogItem")
proto.RegisterType((*InstallReleaseResponse)(nil), "hapi.services.tiller.InstallReleaseResponse") proto.RegisterType((*InstallReleaseResponse)(nil), "hapi.services.tiller.InstallReleaseResponse")
proto.RegisterType((*UninstallReleaseRequest)(nil), "hapi.services.tiller.UninstallReleaseRequest") proto.RegisterType((*UninstallReleaseRequest)(nil), "hapi.services.tiller.UninstallReleaseRequest")
proto.RegisterType((*UninstallReleaseResponse)(nil), "hapi.services.tiller.UninstallReleaseResponse") proto.RegisterType((*UninstallReleaseResponse)(nil), "hapi.services.tiller.UninstallReleaseResponse")
@ -913,6 +690,7 @@ func init() {
proto.RegisterType((*TestReleaseResponse)(nil), "hapi.services.tiller.TestReleaseResponse") proto.RegisterType((*TestReleaseResponse)(nil), "hapi.services.tiller.TestReleaseResponse")
proto.RegisterEnum("hapi.services.tiller.ListSort_SortBy", ListSort_SortBy_name, ListSort_SortBy_value) proto.RegisterEnum("hapi.services.tiller.ListSort_SortBy", ListSort_SortBy_name, ListSort_SortBy_value)
proto.RegisterEnum("hapi.services.tiller.ListSort_SortOrder", ListSort_SortOrder_name, ListSort_SortOrder_value) proto.RegisterEnum("hapi.services.tiller.ListSort_SortOrder", ListSort_SortOrder_name, ListSort_SortOrder_value)
proto.RegisterEnum("hapi.services.tiller.LogItem_Level", LogItem_Level_name, LogItem_Level_value)
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -938,7 +716,7 @@ type ReleaseServiceClient interface {
// UpdateRelease updates release content. // UpdateRelease updates release content.
UpdateRelease(ctx context.Context, in *UpdateReleaseRequest, opts ...grpc.CallOption) (*UpdateReleaseResponse, error) UpdateRelease(ctx context.Context, in *UpdateReleaseRequest, opts ...grpc.CallOption) (*UpdateReleaseResponse, error)
// InstallRelease requests installation of a chart as a new release. // InstallRelease requests installation of a chart as a new release.
InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (ReleaseService_InstallReleaseClient, error)
// UninstallRelease requests deletion of a named release. // UninstallRelease requests deletion of a named release.
UninstallRelease(ctx context.Context, in *UninstallReleaseRequest, opts ...grpc.CallOption) (*UninstallReleaseResponse, error) UninstallRelease(ctx context.Context, in *UninstallReleaseRequest, opts ...grpc.CallOption) (*UninstallReleaseResponse, error)
// GetVersion returns the current version of the server. // GetVersion returns the current version of the server.
@ -1018,13 +796,36 @@ func (c *releaseServiceClient) UpdateRelease(ctx context.Context, in *UpdateRele
return out, nil return out, nil
} }
func (c *releaseServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) { func (c *releaseServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (ReleaseService_InstallReleaseClient, error) {
out := new(InstallReleaseResponse) stream, err := grpc.NewClientStream(ctx, &_ReleaseService_serviceDesc.Streams[1], c.cc, "/hapi.services.tiller.ReleaseService/InstallRelease", opts...)
err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/InstallRelease", in, out, c.cc, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return out, nil x := &releaseServiceInstallReleaseClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type ReleaseService_InstallReleaseClient interface {
Recv() (*InstallReleaseResponse, error)
grpc.ClientStream
}
type releaseServiceInstallReleaseClient struct {
grpc.ClientStream
}
func (x *releaseServiceInstallReleaseClient) Recv() (*InstallReleaseResponse, error) {
m := new(InstallReleaseResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
} }
func (c *releaseServiceClient) UninstallRelease(ctx context.Context, in *UninstallReleaseRequest, opts ...grpc.CallOption) (*UninstallReleaseResponse, error) { func (c *releaseServiceClient) UninstallRelease(ctx context.Context, in *UninstallReleaseRequest, opts ...grpc.CallOption) (*UninstallReleaseResponse, error) {
@ -1064,7 +865,7 @@ func (c *releaseServiceClient) GetHistory(ctx context.Context, in *GetHistoryReq
} }
func (c *releaseServiceClient) RunReleaseTest(ctx context.Context, in *TestReleaseRequest, opts ...grpc.CallOption) (ReleaseService_RunReleaseTestClient, error) { func (c *releaseServiceClient) RunReleaseTest(ctx context.Context, in *TestReleaseRequest, opts ...grpc.CallOption) (ReleaseService_RunReleaseTestClient, error) {
stream, err := grpc.NewClientStream(ctx, &_ReleaseService_serviceDesc.Streams[1], c.cc, "/hapi.services.tiller.ReleaseService/RunReleaseTest", opts...) stream, err := grpc.NewClientStream(ctx, &_ReleaseService_serviceDesc.Streams[2], c.cc, "/hapi.services.tiller.ReleaseService/RunReleaseTest", opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1110,7 +911,7 @@ type ReleaseServiceServer interface {
// UpdateRelease updates release content. // UpdateRelease updates release content.
UpdateRelease(context.Context, *UpdateReleaseRequest) (*UpdateReleaseResponse, error) UpdateRelease(context.Context, *UpdateReleaseRequest) (*UpdateReleaseResponse, error)
// InstallRelease requests installation of a chart as a new release. // InstallRelease requests installation of a chart as a new release.
InstallRelease(context.Context, *InstallReleaseRequest) (*InstallReleaseResponse, error) InstallRelease(*InstallReleaseRequest, ReleaseService_InstallReleaseServer) error
// UninstallRelease requests deletion of a named release. // UninstallRelease requests deletion of a named release.
UninstallRelease(context.Context, *UninstallReleaseRequest) (*UninstallReleaseResponse, error) UninstallRelease(context.Context, *UninstallReleaseRequest) (*UninstallReleaseResponse, error)
// GetVersion returns the current version of the server. // GetVersion returns the current version of the server.
@ -1202,22 +1003,25 @@ func _ReleaseService_UpdateRelease_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _ReleaseService_InstallRelease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _ReleaseService_InstallRelease_Handler(srv interface{}, stream grpc.ServerStream) error {
in := new(InstallReleaseRequest) m := new(InstallReleaseRequest)
if err := dec(in); err != nil { if err := stream.RecvMsg(m); err != nil {
return nil, err return err
}
if interceptor == nil {
return srv.(ReleaseServiceServer).InstallRelease(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/hapi.services.tiller.ReleaseService/InstallRelease",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ReleaseServiceServer).InstallRelease(ctx, req.(*InstallReleaseRequest))
} }
return interceptor(ctx, in, info, handler) return srv.(ReleaseServiceServer).InstallRelease(m, &releaseServiceInstallReleaseServer{stream})
}
type ReleaseService_InstallReleaseServer interface {
Send(*InstallReleaseResponse) error
grpc.ServerStream
}
type releaseServiceInstallReleaseServer struct {
grpc.ServerStream
}
func (x *releaseServiceInstallReleaseServer) Send(m *InstallReleaseResponse) error {
return x.ServerStream.SendMsg(m)
} }
func _ReleaseService_UninstallRelease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _ReleaseService_UninstallRelease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
@ -1329,10 +1133,6 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
MethodName: "UpdateRelease", MethodName: "UpdateRelease",
Handler: _ReleaseService_UpdateRelease_Handler, Handler: _ReleaseService_UpdateRelease_Handler,
}, },
{
MethodName: "InstallRelease",
Handler: _ReleaseService_InstallRelease_Handler,
},
{ {
MethodName: "UninstallRelease", MethodName: "UninstallRelease",
Handler: _ReleaseService_UninstallRelease_Handler, Handler: _ReleaseService_UninstallRelease_Handler,
@ -1356,6 +1156,11 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
Handler: _ReleaseService_ListReleases_Handler, Handler: _ReleaseService_ListReleases_Handler,
ServerStreams: true, ServerStreams: true,
}, },
{
StreamName: "InstallRelease",
Handler: _ReleaseService_InstallRelease_Handler,
ServerStreams: true,
},
{ {
StreamName: "RunReleaseTest", StreamName: "RunReleaseTest",
Handler: _ReleaseService_RunReleaseTest_Handler, Handler: _ReleaseService_RunReleaseTest_Handler,
@ -1368,82 +1173,87 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 1217 bytes of a gzipped FileDescriptorProto // 1312 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0x1b, 0x45,
0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x36, 0xff, 0x74, 0x9a, 0xb6, 0xae, 0xff, 0x0b, 0x2a, 0x46, 0xb0, 0x14, 0xce, 0xfa, 0xdf, 0x27, 0xa9, 0x71, 0xa7, 0x69, 0xb2, 0x35, 0x2d, 0x0a, 0x5b, 0x41, 0xdd,
0xd9, 0x85, 0x4d, 0x21, 0x70, 0x83, 0x84, 0x90, 0xba, 0xdd, 0xa8, 0x2d, 0x94, 0xae, 0xe4, 0x6c, 0x42, 0x1d, 0x6a, 0xb8, 0xa9, 0x84, 0x90, 0xd2, 0xd4, 0x24, 0x81, 0x90, 0x48, 0x93, 0xb6, 0x48,
0x17, 0x09, 0x01, 0x91, 0x9b, 0x4c, 0x5a, 0xb3, 0x8e, 0x27, 0x78, 0xc6, 0x65, 0x7b, 0xcb, 0x1d, 0x08, 0xb0, 0x36, 0xf6, 0x38, 0x5d, 0xba, 0xde, 0x31, 0x3b, 0xb3, 0xa1, 0x91, 0xb8, 0xe2, 0x8e,
0x8f, 0xc2, 0x5b, 0xf0, 0x1e, 0x5c, 0xc2, 0x83, 0x20, 0xcf, 0x87, 0xeb, 0x49, 0xed, 0xd6, 0xf4, 0x5b, 0xde, 0x82, 0xb7, 0xe0, 0x45, 0xb8, 0x82, 0x07, 0x41, 0xf3, 0xb7, 0xf1, 0x38, 0xbb, 0xc9,
0x26, 0x9e, 0x99, 0xf3, 0xfd, 0x3b, 0x67, 0xce, 0x9c, 0x80, 0x75, 0xe9, 0x2e, 0xbc, 0x3d, 0x8a, 0x92, 0x9b, 0x78, 0x67, 0xce, 0xef, 0x7c, 0xdf, 0x99, 0x33, 0x27, 0xd0, 0x79, 0xed, 0xcf, 0x82,
0xc3, 0x2b, 0x6f, 0x82, 0xe9, 0x1e, 0xf3, 0x7c, 0x1f, 0x87, 0xfd, 0x45, 0x48, 0x18, 0x41, 0xdd, 0x4d, 0x46, 0xe2, 0xd3, 0x60, 0x44, 0xd8, 0x26, 0x0f, 0xc2, 0x90, 0xc4, 0xbd, 0x59, 0x4c, 0x39,
0x98, 0xd6, 0x57, 0xb4, 0xbe, 0xa0, 0x59, 0x5b, 0x5c, 0x62, 0x72, 0xe9, 0x86, 0x4c, 0xfc, 0x0a, 0x45, 0xab, 0x42, 0xd6, 0x33, 0xb2, 0x9e, 0x92, 0x75, 0xd6, 0xa4, 0xc5, 0xe8, 0xb5, 0x1f, 0x73,
0x6e, 0x6b, 0x3b, 0x7d, 0x4e, 0x82, 0x99, 0x77, 0x21, 0x09, 0xc2, 0x44, 0x88, 0x7d, 0xec, 0x52, 0xf5, 0x57, 0x69, 0x77, 0xd6, 0xe7, 0xf7, 0x69, 0x34, 0x09, 0x4e, 0xb4, 0x40, 0x85, 0x88, 0x49,
0xac, 0xbe, 0x9a, 0x90, 0xa2, 0x79, 0xc1, 0x8c, 0x48, 0xc2, 0xff, 0x35, 0x02, 0xc3, 0x94, 0x8d, 0x48, 0x7c, 0x46, 0xcc, 0xaf, 0x65, 0x64, 0x64, 0x41, 0x34, 0xa1, 0x5a, 0xf0, 0xae, 0x25, 0xe0,
0xc3, 0x28, 0x90, 0xc4, 0x1d, 0x8d, 0x48, 0x99, 0xcb, 0x22, 0xaa, 0x19, 0xbb, 0xc2, 0x21, 0xf5, 0x84, 0xf1, 0x61, 0x9c, 0x44, 0x5a, 0x78, 0xc7, 0x12, 0x32, 0xee, 0xf3, 0x84, 0x59, 0xc1, 0x4e,
0x48, 0xa0, 0xbe, 0x82, 0x66, 0xff, 0x59, 0x82, 0x8d, 0x13, 0x8f, 0x32, 0x47, 0x08, 0x52, 0x07, 0x49, 0xcc, 0x02, 0x1a, 0x99, 0x5f, 0x25, 0xf3, 0xfe, 0x2a, 0xc1, 0xad, 0xfd, 0x80, 0x71, 0xac,
0xff, 0x12, 0x61, 0xca, 0x50, 0x17, 0xaa, 0xbe, 0x37, 0xf7, 0x98, 0x69, 0xec, 0x1a, 0xbd, 0xb2, 0x0c, 0x19, 0x26, 0x3f, 0x27, 0x84, 0x71, 0xb4, 0x0a, 0xd5, 0x30, 0x98, 0x06, 0xdc, 0x75, 0x36,
0x23, 0x36, 0x68, 0x0b, 0x6a, 0x64, 0x36, 0xa3, 0x98, 0x99, 0xa5, 0x5d, 0xa3, 0xd7, 0x74, 0xe4, 0x9c, 0x6e, 0x19, 0xab, 0x05, 0x5a, 0x83, 0x1a, 0x9d, 0x4c, 0x18, 0xe1, 0x6e, 0x69, 0xc3, 0xe9,
0x0e, 0x7d, 0x05, 0x75, 0x4a, 0x42, 0x36, 0x3e, 0xbf, 0x36, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, 0x36, 0xb1, 0x5e, 0xa1, 0x2f, 0xa0, 0xce, 0x68, 0xcc, 0x87, 0xc7, 0x67, 0x6e, 0x79, 0xc3, 0xe9,
0xa0, 0x9f, 0x85, 0x53, 0x3f, 0xb6, 0x34, 0x22, 0x21, 0xeb, 0xc7, 0x3f, 0xcf, 0xaf, 0x9d, 0x1a, 0xb6, 0xfa, 0x1f, 0xf4, 0xb2, 0x70, 0xea, 0x89, 0x48, 0x47, 0x34, 0xe6, 0x3d, 0xf1, 0xe7, 0xd9,
0xe5, 0xdf, 0x58, 0xef, 0xcc, 0xf3, 0x19, 0x0e, 0xcd, 0x8a, 0xd0, 0x2b, 0x76, 0xe8, 0x10, 0x80, 0x19, 0xae, 0x31, 0xf9, 0x2b, 0xfc, 0x4e, 0x82, 0x90, 0x93, 0xd8, 0xad, 0x28, 0xbf, 0x6a, 0x85,
0xeb, 0x25, 0xe1, 0x14, 0x87, 0x66, 0x95, 0xab, 0xee, 0x15, 0x50, 0xfd, 0x32, 0xe6, 0x77, 0x9a, 0x76, 0x00, 0xa4, 0x5f, 0x1a, 0x8f, 0x49, 0xec, 0x56, 0xa5, 0xeb, 0x6e, 0x01, 0xd7, 0x87, 0x42,
0x54, 0x2d, 0xd1, 0x97, 0xb0, 0x2a, 0x20, 0x19, 0x4f, 0xc8, 0x14, 0x53, 0xb3, 0xb6, 0x5b, 0xee, 0x1f, 0x37, 0x99, 0xf9, 0x44, 0x9f, 0xc3, 0x8a, 0x82, 0x64, 0x38, 0xa2, 0x63, 0xc2, 0xdc, 0xda,
0xb5, 0x07, 0x3b, 0x42, 0x95, 0x82, 0x7f, 0x24, 0x40, 0x3b, 0x20, 0x53, 0xec, 0xb4, 0x04, 0x7b, 0x46, 0xb9, 0xdb, 0xea, 0xdf, 0x51, 0xae, 0x0c, 0xfc, 0x47, 0x0a, 0xb4, 0x6d, 0x3a, 0x26, 0x78,
0xbc, 0xa6, 0xe8, 0x11, 0x34, 0x03, 0x77, 0x8e, 0xe9, 0xc2, 0x9d, 0x60, 0xb3, 0xce, 0x3d, 0xbc, 0x59, 0xa9, 0x8b, 0x6f, 0x86, 0xee, 0x42, 0x33, 0xf2, 0xa7, 0x84, 0xcd, 0xfc, 0x11, 0x71, 0xeb,
0x39, 0xb0, 0x7f, 0x82, 0x86, 0x32, 0x6e, 0x0f, 0xa0, 0x26, 0x42, 0x43, 0x2d, 0xa8, 0x9f, 0x9d, 0x32, 0xc3, 0xf3, 0x0d, 0xef, 0x47, 0x68, 0x98, 0xe0, 0x5e, 0x1f, 0x6a, 0xea, 0x68, 0x68, 0x19,
0x7e, 0x73, 0xfa, 0xf2, 0xbb, 0xd3, 0xce, 0x0a, 0x6a, 0x40, 0xe5, 0x74, 0xff, 0xdb, 0x61, 0xc7, 0xea, 0x2f, 0x0f, 0xbe, 0x3e, 0x38, 0xfc, 0xf6, 0xa0, 0xbd, 0x84, 0x1a, 0x50, 0x39, 0xd8, 0xfa,
0x40, 0xeb, 0xb0, 0x76, 0xb2, 0x3f, 0x7a, 0x35, 0x76, 0x86, 0x27, 0xc3, 0xfd, 0xd1, 0xf0, 0x45, 0x66, 0xd0, 0x76, 0xd0, 0x4d, 0xb8, 0xb1, 0xbf, 0x75, 0xf4, 0x62, 0x88, 0x07, 0xfb, 0x83, 0xad,
0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0xe8, 0x40, 0x88, 0xbc, 0x18, 0xa3, 0xc1, 0xf3, 0x76, 0xc9, 0x7b, 0x0f, 0x9a, 0x69, 0xce, 0xa8, 0x0e, 0xe5, 0xad, 0xa3, 0x6d,
0x8e, 0x0e, 0x3a, 0x86, 0xfd, 0xbb, 0x01, 0x5d, 0x3d, 0x45, 0x74, 0x41, 0x02, 0x8a, 0xe3, 0x1c, 0x65, 0xf2, 0x7c, 0x70, 0xb4, 0xdd, 0x76, 0xbc, 0xdf, 0x1d, 0x58, 0xb5, 0x29, 0x62, 0x33, 0x1a,
0x4d, 0x48, 0x14, 0x24, 0x39, 0xe2, 0x1b, 0x84, 0xa0, 0x12, 0xe0, 0xb7, 0x2a, 0x43, 0x7c, 0x1d, 0x31, 0x22, 0x38, 0x1a, 0xd1, 0x24, 0x4a, 0x39, 0x92, 0x0b, 0x84, 0xa0, 0x12, 0x91, 0xb7, 0x86,
0x73, 0x32, 0xc2, 0x5c, 0x9f, 0x67, 0xa7, 0xec, 0x88, 0x0d, 0xfa, 0x14, 0x1a, 0x32, 0x74, 0x6a, 0x21, 0xf9, 0x2d, 0x34, 0x39, 0xe5, 0x7e, 0x28, 0xd9, 0x29, 0x63, 0xb5, 0x40, 0x4f, 0xa0, 0xa1,
0x56, 0x76, 0xcb, 0xbd, 0xd6, 0x60, 0x53, 0x07, 0x44, 0x5a, 0x74, 0x12, 0x36, 0xfb, 0x10, 0xb6, 0x8f, 0xce, 0xdc, 0xca, 0x46, 0xb9, 0xbb, 0xdc, 0xbf, 0x6d, 0x03, 0xa2, 0x23, 0xe2, 0x54, 0xcd,
0x0f, 0xb1, 0xf2, 0x44, 0xe0, 0xa5, 0x2a, 0x26, 0xb6, 0xeb, 0xce, 0x31, 0x77, 0x26, 0xb6, 0xeb, 0xdb, 0x81, 0xf5, 0x1d, 0x62, 0x32, 0x51, 0x78, 0x99, 0x8a, 0x11, 0x71, 0xfd, 0x29, 0x91, 0xc9,
0xce, 0x31, 0x32, 0xa1, 0x2e, 0xcb, 0x8d, 0xbb, 0x53, 0x75, 0xd4, 0xd6, 0x66, 0x60, 0xde, 0x56, 0x88, 0xb8, 0xfe, 0x94, 0x20, 0x17, 0xea, 0xba, 0xdc, 0x64, 0x3a, 0x55, 0x6c, 0x96, 0x1e, 0x07,
0x24, 0xe3, 0xca, 0xd2, 0xf4, 0x21, 0x54, 0xe2, 0x9b, 0xc0, 0xd5, 0xb4, 0x06, 0x48, 0xf7, 0xf3, 0xf7, 0xa2, 0x23, 0x7d, 0xae, 0x2c, 0x4f, 0x1f, 0x42, 0x45, 0xdc, 0x04, 0xe9, 0x66, 0xb9, 0x8f,
0x38, 0x98, 0x11, 0x87, 0xd3, 0xf5, 0x54, 0x95, 0x97, 0x53, 0x75, 0x94, 0xb6, 0x7a, 0x40, 0x02, 0xec, 0x3c, 0xf7, 0xa2, 0x09, 0xc5, 0x52, 0x6e, 0x53, 0x55, 0x5e, 0xa4, 0x6a, 0x77, 0x3e, 0xea,
0x86, 0x03, 0xf6, 0x30, 0xff, 0x4f, 0x60, 0x27, 0x43, 0x93, 0x0c, 0x60, 0x0f, 0xea, 0xd2, 0x35, 0x36, 0x8d, 0x38, 0x89, 0xf8, 0xf5, 0xf2, 0xdf, 0x87, 0x3b, 0x19, 0x9e, 0xf4, 0x01, 0x36, 0xa1,
0xae, 0x2d, 0x17, 0x57, 0xc5, 0x65, 0xff, 0x5d, 0x82, 0xee, 0xd9, 0x62, 0xea, 0x32, 0xac, 0x48, 0xae, 0x53, 0x93, 0xde, 0x72, 0x71, 0x35, 0x5a, 0xde, 0x3f, 0x25, 0x58, 0x7d, 0x39, 0x1b, 0xfb,
0x77, 0x38, 0xf5, 0x18, 0xaa, 0xbc, 0xa3, 0x48, 0x2c, 0xd6, 0x85, 0x6e, 0xd1, 0x76, 0x0e, 0xe2, 0x9c, 0x18, 0xd1, 0x25, 0x49, 0x3d, 0x80, 0xaa, 0xec, 0x28, 0x1a, 0x8b, 0x9b, 0xca, 0xb7, 0x6a,
0x5f, 0x47, 0xd0, 0xd1, 0x53, 0xa8, 0x5d, 0xb9, 0x7e, 0x84, 0x29, 0x07, 0x22, 0x41, 0x4d, 0x72, 0x3b, 0xdb, 0xe2, 0x2f, 0x56, 0x72, 0xf4, 0x08, 0x6a, 0xa7, 0x7e, 0x98, 0x10, 0x26, 0x81, 0x48,
0xf2, 0x76, 0xe4, 0x48, 0x0e, 0xb4, 0x0d, 0xf5, 0x69, 0x78, 0x1d, 0xf7, 0x13, 0x7e, 0x05, 0x1b, 0x51, 0xd3, 0x9a, 0xb2, 0x1d, 0x61, 0xad, 0x81, 0xd6, 0xa1, 0x3e, 0x8e, 0xcf, 0x44, 0x3f, 0x91,
0x4e, 0x6d, 0x1a, 0x5e, 0x3b, 0x51, 0x80, 0xde, 0x87, 0xb5, 0xa9, 0x47, 0xdd, 0x73, 0x1f, 0x8f, 0x57, 0xb0, 0x81, 0x6b, 0xe3, 0xf8, 0x0c, 0x27, 0x11, 0xba, 0x0f, 0x37, 0xc6, 0x01, 0xf3, 0x8f,
0x2f, 0x09, 0x79, 0x43, 0xf9, 0x2d, 0x6c, 0x38, 0xab, 0xf2, 0xf0, 0x28, 0x3e, 0x43, 0x56, 0x5c, 0x43, 0x32, 0x7c, 0x4d, 0xe9, 0x1b, 0x26, 0x6f, 0x61, 0x03, 0xaf, 0xe8, 0xcd, 0x5d, 0xb1, 0x87,
0x49, 0x93, 0x10, 0xbb, 0x0c, 0x9b, 0x35, 0x4e, 0x4f, 0xf6, 0x31, 0x86, 0xcc, 0x9b, 0x63, 0x12, 0x3a, 0xa2, 0x92, 0x46, 0x31, 0xf1, 0x39, 0x71, 0x6b, 0x52, 0x9e, 0xae, 0x05, 0x86, 0x3c, 0x98,
0x31, 0x7e, 0x75, 0xca, 0x8e, 0xda, 0xa2, 0xf7, 0x60, 0x35, 0xc4, 0x14, 0xb3, 0xb1, 0xf4, 0xb2, 0x12, 0x9a, 0x70, 0x79, 0x75, 0xca, 0xd8, 0x2c, 0xd1, 0xfb, 0xb0, 0x12, 0x13, 0x46, 0xf8, 0x50,
0xc1, 0x25, 0x5b, 0xfc, 0xec, 0xb5, 0x70, 0x0b, 0x41, 0xe5, 0x57, 0xd7, 0x63, 0x66, 0x93, 0x93, 0x67, 0xd9, 0x90, 0x96, 0xcb, 0x72, 0xef, 0x95, 0x4a, 0x0b, 0x41, 0xe5, 0x17, 0x3f, 0xe0, 0x6e,
0xf8, 0x5a, 0x88, 0x45, 0x14, 0x2b, 0x31, 0x50, 0x62, 0x11, 0xc5, 0x52, 0xac, 0x0b, 0xd5, 0x19, 0x53, 0x8a, 0xe4, 0xb7, 0x32, 0x4b, 0x18, 0x31, 0x66, 0x60, 0xcc, 0x12, 0x46, 0xb4, 0xd9, 0x2a,
0x09, 0x27, 0xd8, 0x6c, 0x71, 0x9a, 0xd8, 0xd8, 0x47, 0xb0, 0xb9, 0x04, 0xf2, 0x43, 0xf3, 0xf5, 0x54, 0x27, 0x34, 0x1e, 0x11, 0x77, 0x59, 0xca, 0xd4, 0xc2, 0xdb, 0x85, 0xdb, 0x0b, 0x20, 0x5f,
0x8f, 0x01, 0x5b, 0x0e, 0xf1, 0xfd, 0x73, 0x77, 0xf2, 0xa6, 0x40, 0xc6, 0x52, 0xe0, 0x96, 0xee, 0x97, 0xaf, 0x7f, 0x1d, 0x58, 0xc3, 0x34, 0x0c, 0x8f, 0xfd, 0xd1, 0x9b, 0x02, 0x8c, 0xcd, 0x81,
0x06, 0xb7, 0x9c, 0x01, 0x6e, 0xaa, 0x08, 0x2b, 0x5a, 0x11, 0x6a, 0xb0, 0x57, 0xf3, 0x61, 0xaf, 0x5b, 0xba, 0x1c, 0xdc, 0x72, 0x06, 0xb8, 0x73, 0x45, 0x58, 0xb1, 0x8a, 0xd0, 0x82, 0xbd, 0x9a,
0xe9, 0xb0, 0x2b, 0x4c, 0xeb, 0x29, 0x4c, 0x13, 0xc0, 0x1a, 0x69, 0xc0, 0xbe, 0x86, 0xed, 0x5b, 0x0f, 0x7b, 0xcd, 0x86, 0xdd, 0x60, 0x5a, 0x9f, 0xc3, 0x34, 0x05, 0xac, 0x31, 0x0f, 0xd8, 0x57,
0x51, 0x3e, 0x14, 0xb2, 0x3f, 0x4a, 0xb0, 0x79, 0x1c, 0x50, 0xe6, 0xfa, 0xfe, 0x12, 0x62, 0x49, 0xb0, 0x7e, 0xe1, 0x94, 0xd7, 0x85, 0xec, 0xcf, 0x12, 0xdc, 0xde, 0x8b, 0x18, 0xf7, 0xc3, 0x70,
0x3d, 0x1b, 0x85, 0xeb, 0xb9, 0xf4, 0x5f, 0xea, 0xb9, 0xac, 0x41, 0xae, 0xf2, 0x53, 0x49, 0xe5, 0x01, 0xb1, 0xb4, 0x9e, 0x9d, 0xc2, 0xf5, 0x5c, 0xfa, 0x3f, 0xf5, 0x5c, 0xb6, 0x20, 0x37, 0xfc,
0xa7, 0x50, 0x8d, 0x6b, 0x9d, 0xa5, 0xb6, 0xd4, 0x59, 0xd0, 0x3b, 0x00, 0xa2, 0x28, 0xb9, 0x72, 0x54, 0xe6, 0xf8, 0x29, 0x54, 0xe3, 0x56, 0x67, 0xa9, 0x2d, 0x74, 0x16, 0x74, 0x0f, 0x40, 0x15,
0x01, 0x6d, 0x93, 0x9f, 0x9c, 0xca, 0x46, 0xa2, 0xb2, 0xd1, 0xc8, 0xce, 0x46, 0xaa, 0xc2, 0xed, 0xa5, 0x74, 0xae, 0xa0, 0x6d, 0xca, 0x9d, 0x03, 0xdd, 0x48, 0x0c, 0x1b, 0x8d, 0x6c, 0x36, 0xe6,
0x63, 0xd8, 0x5a, 0x86, 0xea, 0xa1, 0xb0, 0xff, 0x66, 0xc0, 0xf6, 0x59, 0xe0, 0x65, 0x02, 0x9f, 0x2a, 0xdc, 0xfb, 0x15, 0xea, 0xfb, 0xf4, 0x64, 0x8f, 0x93, 0x29, 0x7a, 0x0a, 0xd5, 0x90, 0x9c,
0x55, 0xaa, 0xb7, 0xa0, 0x28, 0x65, 0x40, 0xd1, 0x85, 0xea, 0x22, 0x0a, 0x2f, 0xb0, 0x84, 0x56, 0x92, 0x50, 0x82, 0xd3, 0xea, 0xdf, 0xcf, 0x79, 0xfc, 0x94, 0x76, 0x6f, 0x5f, 0xa8, 0x62, 0x65,
0x6c, 0xd2, 0x31, 0x56, 0xb4, 0x18, 0xed, 0x31, 0x98, 0xb7, 0x7d, 0x78, 0x60, 0x44, 0xb1, 0xd7, 0x21, 0x62, 0x4e, 0x09, 0x63, 0xfe, 0x09, 0xd1, 0x6f, 0x81, 0x59, 0x7a, 0x77, 0xa1, 0x2a, 0x35,
0xc9, 0x4b, 0xd0, 0x14, 0x5d, 0xdf, 0xde, 0x80, 0xf5, 0x43, 0xcc, 0x5e, 0x8b, 0x6b, 0x21, 0xc3, 0xc5, 0x23, 0xb3, 0x77, 0xf0, 0xe5, 0x61, 0x7b, 0x09, 0x35, 0xa1, 0x3a, 0xc0, 0xf8, 0x10, 0xb7,
0xb3, 0x87, 0x80, 0xd2, 0x87, 0x37, 0xf6, 0xe4, 0x91, 0x6e, 0x4f, 0x8d, 0x45, 0x8a, 0x5f, 0x71, 0x1d, 0xef, 0x0f, 0x07, 0xd6, 0x16, 0x99, 0xd2, 0xac, 0x3f, 0x29, 0xc6, 0xfa, 0xee, 0x52, 0xca,
0xd9, 0x5f, 0x70, 0xdd, 0x47, 0x1e, 0x65, 0x24, 0xbc, 0xbe, 0x0b, 0xba, 0x0e, 0x94, 0xe7, 0xee, 0x3b, 0x7a, 0x0a, 0xf5, 0x50, 0x65, 0xa7, 0x59, 0xbb, 0x77, 0xe9, 0x11, 0x84, 0xa9, 0xd6, 0x7f,
0x5b, 0xf9, 0x50, 0xc4, 0x4b, 0xfb, 0x90, 0x7b, 0x90, 0x88, 0x4a, 0x0f, 0xd2, 0xcf, 0xae, 0x51, 0x06, 0xa2, 0xbc, 0x55, 0x64, 0xef, 0x37, 0x07, 0xd6, 0x5f, 0x46, 0x41, 0x66, 0x01, 0x65, 0x5d,
0xec, 0xd9, 0xfd, 0x01, 0xd0, 0x2b, 0x9c, 0x4c, 0x00, 0xf7, 0xbc, 0x58, 0x2a, 0x09, 0x25, 0xbd, 0xb9, 0x0b, 0x94, 0x96, 0x32, 0x28, 0x5d, 0x85, 0xea, 0x2c, 0x89, 0x4f, 0x88, 0x2e, 0x11, 0xb5,
0xd0, 0x4c, 0xa8, 0x4f, 0x7c, 0xec, 0x06, 0xd1, 0x42, 0xa6, 0x4d, 0x6d, 0xed, 0x1f, 0x61, 0x43, 0x98, 0xe7, 0xaa, 0x62, 0x71, 0xe5, 0x0d, 0xc1, 0xbd, 0x98, 0xc3, 0x35, 0x2f, 0x84, 0xc8, 0x3a,
0xd3, 0x2e, 0xfd, 0x8c, 0xe3, 0xa1, 0x17, 0x52, 0x7b, 0xbc, 0x44, 0x9f, 0x43, 0x4d, 0x8c, 0x45, 0x7d, 0xd1, 0x9a, 0xea, 0xf5, 0xf2, 0x6e, 0xc1, 0xcd, 0x1d, 0xc2, 0x5f, 0xa9, 0xeb, 0xad, 0x8f,
0x5c, 0x77, 0x7b, 0xf0, 0x48, 0xf7, 0x9b, 0x2b, 0x89, 0x02, 0x39, 0x47, 0x39, 0x92, 0x77, 0xf0, 0xe7, 0x0d, 0x00, 0xcd, 0x6f, 0x9e, 0xc7, 0xd3, 0x5b, 0x76, 0x3c, 0x33, 0xde, 0x19, 0x7d, 0xa3,
0x57, 0x03, 0xda, 0xea, 0xa1, 0x17, 0x43, 0x1b, 0xf2, 0x60, 0x35, 0x3d, 0xd1, 0xa0, 0x27, 0xf9, 0xe5, 0x3d, 0x95, 0xbe, 0x77, 0x03, 0xc6, 0x69, 0x7c, 0x76, 0x19, 0x74, 0x6d, 0x28, 0x4f, 0xfd,
0x33, 0xdd, 0xd2, 0x60, 0x6a, 0x3d, 0x2d, 0xc2, 0x2a, 0x22, 0xb0, 0x57, 0x3e, 0x31, 0x10, 0x85, 0xb7, 0xfa, 0xc1, 0x13, 0x9f, 0xde, 0x8e, 0xcc, 0x20, 0x35, 0x4d, 0x8b, 0xe1, 0x7c, 0x7c, 0x70,
0xce, 0xf2, 0xa0, 0x81, 0x9e, 0x65, 0xeb, 0xc8, 0x99, 0x6c, 0xac, 0x7e, 0x51, 0x76, 0x65, 0x16, 0x8a, 0x8d, 0x0f, 0xdf, 0x03, 0x7a, 0x41, 0xd2, 0x49, 0xe6, 0x8a, 0x97, 0xd7, 0x90, 0x50, 0xb2,
0x5d, 0xf1, 0x9a, 0xd1, 0xa7, 0x03, 0x74, 0xaf, 0x1a, 0x7d, 0x20, 0xb1, 0xf6, 0x0a, 0xf3, 0x27, 0x2f, 0x8c, 0x0b, 0xf5, 0x51, 0x48, 0xfc, 0x28, 0x99, 0x69, 0xda, 0xcc, 0xd2, 0xfb, 0x01, 0x6e,
0x76, 0x7f, 0x86, 0x35, 0xed, 0x85, 0x43, 0x39, 0x68, 0x65, 0xcd, 0x1a, 0xd6, 0x47, 0x85, 0x78, 0x59, 0xde, 0x75, 0x9e, 0xe2, 0x3c, 0xec, 0x44, 0x7b, 0x17, 0x9f, 0xe8, 0x33, 0xa8, 0xa9, 0xf1,
0x13, 0x5b, 0x73, 0x68, 0xeb, 0x4d, 0x0a, 0xe5, 0x28, 0xc8, 0xec, 0xfa, 0xd6, 0xc7, 0xc5, 0x98, 0x4e, 0xfa, 0x6e, 0xf5, 0xef, 0xda, 0x79, 0x4b, 0x27, 0x49, 0xa4, 0xe7, 0x41, 0xac, 0x75, 0xfb,
0x13, 0x73, 0x14, 0x3a, 0xcb, 0x3d, 0x24, 0x2f, 0x8f, 0x39, 0xfd, 0x2e, 0x2f, 0x8f, 0x79, 0xad, 0x7f, 0x37, 0xa0, 0x65, 0x06, 0x16, 0x55, 0xbc, 0x28, 0x80, 0x95, 0xf9, 0xc9, 0x0c, 0x3d, 0xcc,
0xc9, 0x5e, 0x41, 0x2e, 0xc0, 0x4d, 0x0b, 0x41, 0x8f, 0x73, 0x13, 0xa2, 0x77, 0x1e, 0xab, 0x77, 0x9f, 0x4d, 0x17, 0x06, 0xec, 0xce, 0xa3, 0x22, 0xaa, 0xba, 0xf8, 0x97, 0x3e, 0x71, 0x10, 0x83,
0x3f, 0x63, 0x62, 0x62, 0x01, 0xff, 0x5b, 0x7a, 0x63, 0x51, 0x0e, 0x34, 0xd9, 0x03, 0x87, 0xf5, 0xf6, 0xe2, 0xc0, 0x84, 0x1e, 0x67, 0xfb, 0xc8, 0x99, 0xd0, 0x3a, 0xbd, 0xa2, 0xea, 0x26, 0x2c,
0xac, 0x20, 0xf7, 0x52, 0x50, 0xb2, 0x2b, 0xdd, 0x11, 0x94, 0xde, 0xf2, 0xee, 0x08, 0x6a, 0xa9, 0x3a, 0x95, 0x35, 0x63, 0x4f, 0x39, 0xe8, 0x4a, 0x37, 0xf6, 0x60, 0xd5, 0xd9, 0x2c, 0xac, 0x9f,
0xc1, 0xd9, 0x2b, 0xc8, 0x83, 0xb6, 0x13, 0x05, 0xd2, 0x74, 0xdc, 0x16, 0x50, 0x8e, 0xf4, 0xed, 0xc6, 0xfd, 0x09, 0x6e, 0x58, 0x2f, 0x35, 0xca, 0x41, 0x2b, 0x6b, 0x66, 0xea, 0x7c, 0x54, 0x48,
0xae, 0x66, 0x3d, 0x29, 0xc0, 0x79, 0x73, 0xbf, 0x9f, 0xc3, 0xf7, 0x0d, 0xc5, 0x7a, 0x5e, 0xe3, 0x37, 0x8d, 0x45, 0xa1, 0x65, 0x77, 0x3b, 0x94, 0xe3, 0x20, 0xf3, 0xf5, 0xea, 0x7c, 0x5c, 0x4c,
0xff, 0x69, 0x3f, 0xfb, 0x37, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x7c, 0x9c, 0x49, 0xc1, 0x0f, 0x00, 0xd9, 0x66, 0x72, 0xb1, 0x8b, 0xe4, 0x31, 0x99, 0xd3, 0xf1, 0xf2, 0x98, 0xcc, 0x6b, 0x4e, 0xde,
0x00, 0x12, 0xf2, 0x01, 0xce, 0x9b, 0x08, 0x7a, 0x90, 0x4b, 0x89, 0xdd, 0x7b, 0x3a, 0xdd, 0xab, 0x15,
0xd3, 0x10, 0x33, 0x78, 0x67, 0x61, 0x5a, 0x40, 0x39, 0xe0, 0x64, 0x8f, 0x4e, 0x9d, 0xc7, 0x05,
0xb5, 0x17, 0x0e, 0xa5, 0xfb, 0xd2, 0x25, 0x87, 0xb2, 0x9b, 0xde, 0x25, 0x87, 0x5a, 0x68, 0x71,
0xde, 0x12, 0x0a, 0xa0, 0x85, 0x93, 0x48, 0x87, 0x16, 0x8d, 0x01, 0xe5, 0x58, 0x5f, 0xec, 0x6b,
0x9d, 0x87, 0x05, 0x34, 0xcf, 0xeb, 0xe2, 0x19, 0x7c, 0xd7, 0x30, 0xaa, 0xc7, 0x35, 0xf9, 0xdf,
0xf9, 0xa7, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x67, 0x31, 0x71, 0xbf, 0x8b, 0x10, 0x00, 0x00,
} }

@ -20,8 +20,6 @@ import (
"fmt" "fmt"
"strings" "strings"
ctx "golang.org/x/net/context"
"k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/hooks" "k8s.io/helm/pkg/hooks"
"k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/release"
@ -30,28 +28,71 @@ import (
"k8s.io/helm/pkg/timeconv" "k8s.io/helm/pkg/timeconv"
) )
type ClientLogger struct {
stream services.ReleaseService_InstallReleaseServer
}
func (logger *ClientLogger) log(level services.LogItem_Level, message string) (error) {
log := &services.InstallReleaseResponse{
Response: &services.InstallReleaseResponse_LogItem {
&services.LogItem{
Level: level,
Message: message,
},
},
}
return logger.stream.Send(log)
}
func (logger *ClientLogger) Info(message string) (error) {
return logger.log(services.LogItem_INFO, message)
}
func (logger *ClientLogger) Error(message string) (error) {
return logger.log(services.LogItem_ERROR, message)
}
// InstallRelease installs a release and stores the release record. // InstallRelease installs a release and stores the release record.
func (s *ReleaseServer) InstallRelease(c ctx.Context, req *services.InstallReleaseRequest) (*services.InstallReleaseResponse, error) { func (s *ReleaseServer) InstallRelease(req *services.InstallReleaseRequest, stream services.ReleaseService_InstallReleaseServer) (error) {
clientLogger := ClientLogger{
stream: stream,
}
s.Log("preparing install for %s", req.Name) s.Log("preparing install for %s", req.Name)
rel, err := s.prepareRelease(req) rel, err := s.prepareRelease(req)
if err != nil { if err != nil {
s.Log("failed install prepare step: %s", err) s.Log("failed install prepare step: %s", err)
res := &services.InstallReleaseResponse{Release: rel}
// On dry run, append the manifest contents to a failed release. This is // On dry run, append the manifest contents to a failed release. This is
// a stop-gap until we can revisit an error backchannel post-2.0. // a stop-gap until we can revisit an error backchannel post-2.0.
if req.DryRun && strings.HasPrefix(err.Error(), "YAML parse error") { if req.DryRun && strings.HasPrefix(err.Error(), "YAML parse error") {
err = fmt.Errorf("%s\n%s", err, rel.Manifest) err = fmt.Errorf("%s\n%s", err, rel.Manifest)
} }
return res, err
return err
} }
s.Log("performing install for %s", req.Name) s.Log("performing install for %s", req.Name)
err = clientLogger.Info(fmt.Sprintf("performing install for %s", req.Name))
if err != nil {
return err
}
res, err := s.performRelease(rel, req) res, err := s.performRelease(rel, req)
if err != nil { if err != nil {
s.Log("failed install perform step: %s", err) s.Log("failed install perform step: %s", err)
} }
return res, err
sendErr := stream.Send(res)
if sendErr != nil {
return sendErr
}
return err
} }
// prepareRelease builds a release for an install operation. // prepareRelease builds a release for an install operation.
@ -133,11 +174,17 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
// performRelease runs a release. // performRelease runs a release.
func (s *ReleaseServer) performRelease(r *release.Release, req *services.InstallReleaseRequest) (*services.InstallReleaseResponse, error) { func (s *ReleaseServer) performRelease(r *release.Release, req *services.InstallReleaseRequest) (*services.InstallReleaseResponse, error) {
res := &services.InstallReleaseResponse{Release: r} res := &services.InstallReleaseResponse{
Response: &services.InstallReleaseResponse_Release {
Release: r,
},
}
if req.DryRun { if req.DryRun {
s.Log("dry run for %s", r.Name) s.Log("dry run for %s", r.Name)
res.Release.Info.Description = "Dry run complete"
releaseResponse := res.Response.(*services.InstallReleaseResponse_Release)
releaseResponse.Release.Info.Description = "Dry run complete"
return res, nil return res, nil
} }

@ -29,7 +29,6 @@ import (
) )
func TestInstallRelease(t *testing.T) { func TestInstallRelease(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -43,7 +42,10 @@ func TestInstallRelease(t *testing.T) {
}, },
}, },
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Fatalf("Failed install: %s", err) t.Fatalf("Failed install: %s", err)
} }
@ -93,7 +95,6 @@ func TestInstallRelease(t *testing.T) {
} }
func TestInstallRelease_WithNotes(t *testing.T) { func TestInstallRelease_WithNotes(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -108,7 +109,9 @@ func TestInstallRelease_WithNotes(t *testing.T) {
}, },
}, },
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Fatalf("Failed install: %s", err) t.Fatalf("Failed install: %s", err)
} }
@ -162,7 +165,6 @@ func TestInstallRelease_WithNotes(t *testing.T) {
} }
func TestInstallRelease_WithNotesRendered(t *testing.T) { func TestInstallRelease_WithNotesRendered(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -177,7 +179,9 @@ func TestInstallRelease_WithNotesRendered(t *testing.T) {
}, },
}, },
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Fatalf("Failed install: %s", err) t.Fatalf("Failed install: %s", err)
} }
@ -233,7 +237,6 @@ func TestInstallRelease_WithNotesRendered(t *testing.T) {
func TestInstallRelease_TillerVersion(t *testing.T) { func TestInstallRelease_TillerVersion(t *testing.T) {
version.Version = "2.2.0" version.Version = "2.2.0"
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -247,7 +250,8 @@ func TestInstallRelease_TillerVersion(t *testing.T) {
}, },
}, },
} }
_, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
if err != nil { if err != nil {
t.Fatalf("Expected valid range. Got %q", err) t.Fatalf("Expected valid range. Got %q", err)
} }
@ -255,7 +259,6 @@ func TestInstallRelease_TillerVersion(t *testing.T) {
func TestInstallRelease_WrongTillerVersion(t *testing.T) { func TestInstallRelease_WrongTillerVersion(t *testing.T) {
version.Version = "2.2.0" version.Version = "2.2.0"
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -269,7 +272,8 @@ func TestInstallRelease_WrongTillerVersion(t *testing.T) {
}, },
}, },
} }
_, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
if err == nil { if err == nil {
t.Fatalf("Expected to fail because of wrong version") t.Fatalf("Expected to fail because of wrong version")
} }
@ -281,7 +285,6 @@ func TestInstallRelease_WrongTillerVersion(t *testing.T) {
} }
func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) { func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
// TODO: Refactor this into a mock. // TODO: Refactor this into a mock.
@ -307,7 +310,9 @@ func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) {
}, },
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Fatalf("Failed install: %s", err) t.Fatalf("Failed install: %s", err)
} }
@ -332,14 +337,15 @@ func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) {
} }
func TestInstallRelease_DryRun(t *testing.T) { func TestInstallRelease_DryRun(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
req := &services.InstallReleaseRequest{ req := &services.InstallReleaseRequest{
Chart: chartStub(), Chart: chartStub(),
DryRun: true, DryRun: true,
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Errorf("Failed install: %s", err) t.Errorf("Failed install: %s", err)
} }
@ -385,7 +391,6 @@ func TestInstallRelease_DryRun(t *testing.T) {
} }
func TestInstallRelease_NoHooks(t *testing.T) { func TestInstallRelease_NoHooks(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
rs.env.Releases.Create(releaseStub()) rs.env.Releases.Create(releaseStub())
@ -393,7 +398,9 @@ func TestInstallRelease_NoHooks(t *testing.T) {
Chart: chartStub(), Chart: chartStub(),
DisableHooks: true, DisableHooks: true,
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Errorf("Failed install: %s", err) t.Errorf("Failed install: %s", err)
} }
@ -404,7 +411,6 @@ func TestInstallRelease_NoHooks(t *testing.T) {
} }
func TestInstallRelease_FailedHooks(t *testing.T) { func TestInstallRelease_FailedHooks(t *testing.T) {
c := helm.NewContext()
rs := rsFixture() rs := rsFixture()
rs.env.Releases.Create(releaseStub()) rs.env.Releases.Create(releaseStub())
rs.env.KubeClient = newHookFailingKubeClient() rs.env.KubeClient = newHookFailingKubeClient()
@ -412,7 +418,9 @@ func TestInstallRelease_FailedHooks(t *testing.T) {
req := &services.InstallReleaseRequest{ req := &services.InstallReleaseRequest{
Chart: chartStub(), Chart: chartStub(),
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err == nil { if err == nil {
t.Error("Expected failed install") t.Error("Expected failed install")
} }
@ -434,7 +442,9 @@ func TestInstallRelease_ReuseName(t *testing.T) {
ReuseName: true, ReuseName: true,
Name: rel.Name, Name: rel.Name,
} }
res, err := rs.InstallRelease(c, req) mrs := &mockInstallServer{}
err := rs.InstallRelease(req, mrs)
res := mrs.val.Response.(*services.InstallReleaseResponse_Release)
if err != nil { if err != nil {
t.Fatalf("Failed install: %s", err) t.Fatalf("Failed install: %s", err)
} }

@ -340,6 +340,22 @@ func (l *mockListServer) SendHeader(m metadata.MD) error { return nil }
func (l *mockListServer) SetTrailer(m metadata.MD) {} func (l *mockListServer) SetTrailer(m metadata.MD) {}
func (l *mockListServer) SetHeader(m metadata.MD) error { return nil } func (l *mockListServer) SetHeader(m metadata.MD) error { return nil }
type mockInstallServer struct {
val *services.InstallReleaseResponse
}
func (l *mockInstallServer) Send(res *services.InstallReleaseResponse) error {
l.val = res
return nil
}
func (l *mockInstallServer) Context() context.Context { return helm.NewContext() }
func (l *mockInstallServer) SendMsg(v interface{}) error { return nil }
func (l *mockInstallServer) RecvMsg(v interface{}) error { return nil }
func (l *mockInstallServer) SendHeader(m metadata.MD) error { return nil }
func (l *mockInstallServer) SetTrailer(m metadata.MD) {}
func (l *mockInstallServer) SetHeader(m metadata.MD) error { return nil }
type mockRunReleaseTestServer struct { type mockRunReleaseTestServer struct {
stream grpc.ServerStream stream grpc.ServerStream
} }

Loading…
Cancel
Save