Skip to content

Commit 391fa55

Browse files
authored
Merge pull request #444 from fanminshi/tls_impl
*: test the case where only the application TLS asset exists
2 parents 69da143 + 14957eb commit 391fa55

File tree

3 files changed

+108
-45
lines changed

3 files changed

+108
-45
lines changed

pkg/tlsutil/error.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2018 The Operator-SDK Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package tlsutil
16+
17+
import "errors"
18+
19+
var (
20+
ErrCANotFound = errors.New("ca secret and configMap are not found")
21+
// TODO: add other tls util errors.
22+
)

pkg/tlsutil/tls.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func (scg *SDKCertGenerator) GenerateCert(cr runtime.Object, service *v1.Service
167167
if hasAppSecret && hasCASecretAndConfigMap {
168168
return appSecret, caConfigMap, caSecret, nil
169169
} else if hasAppSecret && !hasCASecretAndConfigMap {
170-
// TODO
170+
return nil, nil, nil, ErrCANotFound
171171
} else if !hasAppSecret && hasCASecretAndConfigMap {
172172
// TODO
173173
} else {
@@ -196,12 +196,12 @@ func ToCASecretAndConfigMapName(kind, name string) string {
196196

197197
func getAppSecretInCluster(kubeClient kubernetes.Interface, name, namespace string) (*v1.Secret, error) {
198198
se, err := kubeClient.CoreV1().Secrets(namespace).Get(name, metav1.GetOptions{})
199+
if err != nil && !apiErrors.IsNotFound(err) {
200+
return nil, err
201+
}
199202
if apiErrors.IsNotFound(err) {
200203
return nil, nil
201204
}
202-
if err != nil {
203-
return nil, err
204-
}
205205
return se, nil
206206
}
207207

@@ -210,21 +210,21 @@ func getAppSecretInCluster(kubeClient kubernetes.Interface, name, namespace stri
210210
func getCASecretAndConfigMapInCluster(kubeClient kubernetes.Interface, name, namespace string) (*v1.Secret, *v1.ConfigMap, error) {
211211
hasConfigMap := true
212212
cm, err := kubeClient.CoreV1().ConfigMaps(namespace).Get(name, metav1.GetOptions{})
213+
if err != nil && !apiErrors.IsNotFound(err) {
214+
return nil, nil, err
215+
}
213216
if apiErrors.IsNotFound(err) {
214217
hasConfigMap = false
215218
}
216-
if err != nil {
217-
return nil, nil, err
218-
}
219219

220220
hasSecret := true
221221
se, err := kubeClient.CoreV1().Secrets(namespace).Get(name, metav1.GetOptions{})
222+
if err != nil && !apiErrors.IsNotFound(err) {
223+
return nil, nil, err
224+
}
222225
if apiErrors.IsNotFound(err) {
223226
hasSecret = false
224227
}
225-
if err != nil {
226-
return nil, nil, err
227-
}
228228

229229
if hasConfigMap != hasSecret {
230230
// TODO: this case can happen if creating CA configmap succeeds and creating CA secret failed. We need to handle this case properly.

test/e2e/tls_util_test.go

Lines changed: 76 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,35 @@ import (
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
)
2727

28+
var (
29+
// TLS test variables.
30+
crKind = "Pod"
31+
crName = "example-pod"
32+
certName = "app-cert"
33+
34+
caConfigMapAndSecretName = tlsutil.ToCASecretAndConfigMapName(crKind, crName)
35+
caConfigMap = &v1.ConfigMap{
36+
ObjectMeta: metav1.ObjectMeta{
37+
Name: caConfigMapAndSecretName,
38+
},
39+
}
40+
caSecret = &v1.Secret{
41+
ObjectMeta: metav1.ObjectMeta{
42+
Name: caConfigMapAndSecretName,
43+
},
44+
}
45+
46+
appSecret = &v1.Secret{
47+
ObjectMeta: metav1.ObjectMeta{
48+
Name: tlsutil.ToAppSecretName(crKind, crName, certName),
49+
},
50+
}
51+
52+
ccfg = &tlsutil.CertConfig{
53+
CertName: certName,
54+
}
55+
)
56+
2857
// TestBothAppAndCATLSAssetsExist ensures that when both application
2958
// and CA TLS assets exist in the k8s cluster for a given cr,
3059
// the GenerateCert() simply returns those to the caller.
@@ -37,9 +66,23 @@ func TestBothAppAndCATLSAssetsExist(t *testing.T) {
3766
t.Fatal(err)
3867
}
3968

69+
appSecret, err := f.KubeClient.CoreV1().Secrets(namespace).Create(appSecret)
70+
if err != nil {
71+
t.Fatal(err)
72+
}
73+
74+
caConfigMap, err := f.KubeClient.CoreV1().ConfigMaps(namespace).Create(caConfigMap)
75+
if err != nil {
76+
t.Fatal(err)
77+
}
78+
79+
caSecret, err := f.KubeClient.CoreV1().Secrets(namespace).Create(caSecret)
80+
if err != nil {
81+
t.Fatal(err)
82+
}
83+
84+
cg := tlsutil.NewSDKCertGenerator(f.KubeClient)
4085
// Use Pod as a dummy runtime object for the CR input of GenerateCert().
41-
crKind := "Pod"
42-
crName := "example-pod"
4386
mCR := &v1.Pod{
4487
TypeMeta: metav1.TypeMeta{
4588
Kind: crKind,
@@ -49,55 +92,53 @@ func TestBothAppAndCATLSAssetsExist(t *testing.T) {
4992
Namespace: namespace,
5093
},
5194
}
52-
53-
certName := "app-cert"
54-
appSecret := &v1.Secret{
55-
ObjectMeta: metav1.ObjectMeta{
56-
Name: tlsutil.ToAppSecretName(crKind, crName, certName),
57-
},
58-
}
59-
appSecret, err = f.KubeClient.CoreV1().Secrets(namespace).Create(appSecret)
95+
actualAppSecret, actualCaConfigMap, actualCaSecret, err := cg.GenerateCert(mCR, nil, ccfg)
6096
if err != nil {
6197
t.Fatal(err)
6298
}
6399

64-
caConfigMapAndSecretName := tlsutil.ToCASecretAndConfigMapName(crKind, crName)
65-
caConfigMap := &v1.ConfigMap{
66-
ObjectMeta: metav1.ObjectMeta{
67-
Name: caConfigMapAndSecretName,
68-
},
100+
if !reflect.DeepEqual(appSecret, actualAppSecret) {
101+
t.Fatalf("expect %+v, but got %+v", appSecret, actualAppSecret)
69102
}
70-
caConfigMap, err = f.KubeClient.CoreV1().ConfigMaps(namespace).Create(caConfigMap)
71-
if err != nil {
72-
t.Fatal(err)
103+
if !reflect.DeepEqual(caConfigMap, actualCaConfigMap) {
104+
t.Fatalf("expect %+v, but got %+v", caConfigMap, actualCaConfigMap)
73105
}
74-
75-
caSecret := &v1.Secret{
76-
ObjectMeta: metav1.ObjectMeta{
77-
Name: caConfigMapAndSecretName,
78-
},
106+
if !reflect.DeepEqual(caSecret, actualCaSecret) {
107+
t.Fatalf("expect %+v, but got %+v", caSecret, actualCaSecret)
79108
}
80-
caSecret, err = f.KubeClient.CoreV1().Secrets(namespace).Create(caSecret)
109+
}
110+
111+
// TestOnlyAppSecretExist tests a case where the application TLS asset exists but its correspoding CA asset doesn't. In this case, CertGenerator can't genereate a new CA because it won't verify the existing application TLS cert. Therefore, CertGenerator can't proceed and returns an error to the caller.
112+
func TestOnlyAppSecretExist(t *testing.T) {
113+
f := framework.Global
114+
ctx := f.NewTestCtx(t)
115+
defer ctx.Cleanup(t)
116+
namespace, err := ctx.GetNamespace()
81117
if err != nil {
82118
t.Fatal(err)
83119
}
84120

85-
cg := tlsutil.NewSDKCertGenerator(f.KubeClient)
86-
ccfg := &tlsutil.CertConfig{
87-
CertName: certName,
88-
}
89-
actualAppSecret, actualCaConfigMap, actualCaSecret, err := cg.GenerateCert(mCR, nil, ccfg)
121+
_, err = f.KubeClient.CoreV1().Secrets(namespace).Create(appSecret)
90122
if err != nil {
91123
t.Fatal(err)
92124
}
93125

94-
if !reflect.DeepEqual(appSecret, actualAppSecret) {
95-
t.Fatalf("expect %+v, got %+v", appSecret, actualAppSecret)
126+
cg := tlsutil.NewSDKCertGenerator(f.KubeClient)
127+
// Use Pod as a dummy runtime object for the CR input of GenerateCert().
128+
mCR := &v1.Pod{
129+
TypeMeta: metav1.TypeMeta{
130+
Kind: crKind,
131+
},
132+
ObjectMeta: metav1.ObjectMeta{
133+
Name: crName,
134+
Namespace: namespace,
135+
},
96136
}
97-
if !reflect.DeepEqual(caConfigMap, actualCaConfigMap) {
98-
t.Fatalf("expect %+v, got %+v", caConfigMap, actualCaConfigMap)
137+
_, _, _, err = cg.GenerateCert(mCR, nil, ccfg)
138+
if err == nil {
139+
t.Fatal("expect error, but got none")
99140
}
100-
if !reflect.DeepEqual(caSecret, actualCaSecret) {
101-
t.Fatalf("expect %+v, got %+v", caSecret, actualCaSecret)
141+
if err != tlsutil.ErrCANotFound {
142+
t.Fatalf("expect %v, but got %v", tlsutil.ErrCANotFound.Error(), err.Error())
102143
}
103144
}

0 commit comments

Comments
 (0)