...
1
16
17 package testing
18
19 import (
20 "crypto"
21 "fmt"
22 "os"
23 "path/filepath"
24 "regexp"
25 "runtime"
26 "runtime/debug"
27 "strings"
28 "sync"
29 "testing"
30
31 kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
32 "k8s.io/kubernetes/cmd/kubeadm/app/util/pkiutil"
33 )
34
35
36
37 func RunWithPrivateKeyFixtureDirectory(m *testing.M) {
38 defer install()()
39 os.Exit(m.Run())
40 }
41
42
43 func Reset() {
44 lock.Lock()
45 defer lock.Unlock()
46 ecdsa = 0
47 rsa = 0
48 }
49
50 var (
51 testFunction = regexp.MustCompile(`.*\.Test[^./]+(.func\d*)?$`)
52
53 lock = sync.Mutex{}
54 fixtureDir = ""
55 lastTest = ""
56 ecdsa = 0
57 rsa = 0
58 )
59
60 func install() (cleanup func()) {
61 lock.Lock()
62 defer lock.Unlock()
63
64 _, filename, _, ok := runtime.Caller(1)
65 if !ok {
66 fmt.Println("Could not determine testdata location, skipping private key fixture installation")
67 return func() {}
68 }
69 fixtureDir = filepath.Join(filepath.Dir(filename), "testdata")
70
71 originalNewPrivateKey := pkiutil.NewPrivateKey
72 pkiutil.NewPrivateKey = newPrivateKey
73 return func() {
74 pkiutil.NewPrivateKey = originalNewPrivateKey
75 }
76 }
77
78 func newPrivateKey(keyType kubeadmapi.EncryptionAlgorithmType) (crypto.Signer, error) {
79 lock.Lock()
80 defer lock.Unlock()
81
82 var pcs [50]uintptr
83 nCallers := runtime.Callers(2, pcs[:])
84 frames := runtime.CallersFrames(pcs[:nCallers])
85 thisTest := ""
86 for {
87 frame, more := frames.Next()
88 if strings.HasSuffix(frame.File, "_test.go") && testFunction.MatchString(frame.Function) {
89 thisTest = frame.Function
90 break
91 }
92 if !more {
93 break
94 }
95 }
96
97 if len(thisTest) == 0 {
98 fmt.Println("could not determine test for private key fixture")
99 debug.PrintStack()
100 return pkiutil.GeneratePrivateKey(keyType)
101 }
102
103 if thisTest != lastTest {
104 rsa = 0
105 ecdsa = 0
106 lastTest = thisTest
107 }
108
109 keyName := ""
110 switch keyType {
111 case kubeadmapi.EncryptionAlgorithmECDSAP256:
112 ecdsa++
113 keyName = fmt.Sprintf("%d.ecdsa", ecdsa)
114 default:
115 rsa++
116 keyName = fmt.Sprintf("%d.rsa", rsa)
117 }
118
119 if len(keyName) > 0 {
120 privKey, err := pkiutil.TryLoadKeyFromDisk(fixtureDir, keyName)
121 if err == nil {
122 return privKey, nil
123 }
124 }
125
126 fmt.Println("GeneratePrivateKey " + keyName + " for " + thisTest)
127
128 signer, err := pkiutil.GeneratePrivateKey(keyType)
129 if err != nil {
130 return signer, err
131 }
132
133 if len(keyName) > 0 {
134 pkiutil.WriteKey(fixtureDir, keyName, signer)
135 }
136
137 return signer, err
138 }
139
View as plain text