...
1
16
17 package state
18
19 import (
20 "encoding/json"
21 "fmt"
22 "hash/fnv"
23 "strings"
24
25 "k8s.io/apimachinery/pkg/util/dump"
26 "k8s.io/kubernetes/pkg/kubelet/checkpointmanager"
27 "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum"
28 "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors"
29 )
30
31 var _ checkpointmanager.Checkpoint = &CPUManagerCheckpointV1{}
32 var _ checkpointmanager.Checkpoint = &CPUManagerCheckpointV2{}
33 var _ checkpointmanager.Checkpoint = &CPUManagerCheckpoint{}
34
35
36 type CPUManagerCheckpoint struct {
37 PolicyName string `json:"policyName"`
38 DefaultCPUSet string `json:"defaultCpuSet"`
39 Entries map[string]map[string]string `json:"entries,omitempty"`
40 Checksum checksum.Checksum `json:"checksum"`
41 }
42
43
44 type CPUManagerCheckpointV1 struct {
45 PolicyName string `json:"policyName"`
46 DefaultCPUSet string `json:"defaultCpuSet"`
47 Entries map[string]string `json:"entries,omitempty"`
48 Checksum checksum.Checksum `json:"checksum"`
49 }
50
51
52 type CPUManagerCheckpointV2 = CPUManagerCheckpoint
53
54
55 func NewCPUManagerCheckpoint() *CPUManagerCheckpoint {
56
57 return newCPUManagerCheckpointV2()
58 }
59
60 func newCPUManagerCheckpointV1() *CPUManagerCheckpointV1 {
61 return &CPUManagerCheckpointV1{
62 Entries: make(map[string]string),
63 }
64 }
65
66 func newCPUManagerCheckpointV2() *CPUManagerCheckpointV2 {
67 return &CPUManagerCheckpointV2{
68 Entries: make(map[string]map[string]string),
69 }
70 }
71
72
73 func (cp *CPUManagerCheckpointV1) MarshalCheckpoint() ([]byte, error) {
74
75 cp.Checksum = 0
76 cp.Checksum = checksum.New(cp)
77 return json.Marshal(*cp)
78 }
79
80
81 func (cp *CPUManagerCheckpointV2) MarshalCheckpoint() ([]byte, error) {
82
83 cp.Checksum = 0
84 cp.Checksum = checksum.New(cp)
85 return json.Marshal(*cp)
86 }
87
88
89 func (cp *CPUManagerCheckpointV1) UnmarshalCheckpoint(blob []byte) error {
90 return json.Unmarshal(blob, cp)
91 }
92
93
94 func (cp *CPUManagerCheckpointV2) UnmarshalCheckpoint(blob []byte) error {
95 return json.Unmarshal(blob, cp)
96 }
97
98
99 func (cp *CPUManagerCheckpointV1) VerifyChecksum() error {
100 if cp.Checksum == 0 {
101
102 return nil
103 }
104
105 ck := cp.Checksum
106 cp.Checksum = 0
107 object := dump.ForHash(cp)
108 object = strings.Replace(object, "CPUManagerCheckpointV1", "CPUManagerCheckpoint", 1)
109 cp.Checksum = ck
110
111 hash := fnv.New32a()
112 fmt.Fprintf(hash, "%v", object)
113 if cp.Checksum != checksum.Checksum(hash.Sum32()) {
114 return errors.ErrCorruptCheckpoint
115 }
116
117 return nil
118 }
119
120
121 func (cp *CPUManagerCheckpointV2) VerifyChecksum() error {
122 if cp.Checksum == 0 {
123
124 return nil
125 }
126 ck := cp.Checksum
127 cp.Checksum = 0
128 err := ck.Verify(cp)
129 cp.Checksum = ck
130 return err
131 }
132
View as plain text