-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
write.go
79 lines (66 loc) · 2.23 KB
/
write.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
Copyright 2019 The Tekton Authors
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.
*/
package termination
import (
"encoding/json"
"io/ioutil"
"os"
v1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
)
const (
// MaxContainerTerminationMessageLength is the upper bound any one container may write to
// its termination message path. Contents above this length will cause a failure.
MaxContainerTerminationMessageLength = 1024 * 4
)
// WriteMessage writes the results to the termination message path.
func WriteMessage(path string, pro []v1alpha1.PipelineResourceResult) error {
// if the file at path exists, concatenate the new values otherwise create it
// file at path already exists
fileContents, err := ioutil.ReadFile(path)
if err == nil {
var existingEntries []v1alpha1.PipelineResourceResult
if err := json.Unmarshal([]byte(fileContents), &existingEntries); err == nil {
// append new entries to existing entries
pro = append(existingEntries, pro...)
}
} else if !os.IsNotExist(err) {
return err
}
jsonOutput, err := json.Marshal(pro)
if err != nil {
return err
}
if len(jsonOutput) > MaxContainerTerminationMessageLength {
return aboveMax
}
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
return err
}
defer f.Close()
if _, err = f.Write(jsonOutput); err != nil {
return err
}
if err := f.Sync(); err != nil {
return err
}
return nil
}
//MessageLengthError indicate the length of termination message of container is beyond 4096 which is the max length read by kubenates
type MessageLengthError string
const (
aboveMax MessageLengthError = "Termination message is above max allowed size 4096, caused by large task result."
)
func (e MessageLengthError) Error() string {
return string(e)
}