Skip to content

Commit 0b0a7a2

Browse files
Merge pull request #84 from martinkunc/invalid-interval-not-reported2
Fix reporting duration error and add tests
2 parents 913cf99 + 76ee326 commit 0b0a7a2

File tree

213 files changed

+17123
-20
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

213 files changed

+17123
-20
lines changed

config/local.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ leaderElection:
44
disable: true
55
interval: "30s"
66
storagePath: /tmp/insights-operator
7-
endpoint: http://localhost:8081
7+
endpoint: http://[::1]:8081
88
#impersonate: system:serviceaccount:openshift-insights:gather

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require (
1717
github.com/spf13/cobra v0.0.5
1818
github.com/spf13/pflag v1.0.5
1919
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
20-
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect
20+
golang.org/x/net v0.0.0-20200301022130-244492dfa37a // indirect
2121
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
2222
google.golang.org/appengine v1.6.1 // indirect
2323
k8s.io/api v0.17.1

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8ou
468468
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
469469
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
470470
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
471+
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
472+
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
471473
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
472474
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
473475
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

pkg/config/configobserver/configobserver.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ func (c *Controller) retrieveConfig() error {
130130
nextConfig.Report = len(nextConfig.Endpoint) > 0
131131

132132
if intervalString, ok := secret.Data["interval"]; ok {
133-
duration, err := time.ParseDuration(string(intervalString))
133+
var duration time.Duration
134+
duration, err = time.ParseDuration(string(intervalString))
134135
if err == nil && duration < time.Minute {
135136
err = fmt.Errorf("too short")
136137
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package configobserver
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"os"
8+
"reflect"
9+
"testing"
10+
"time"
11+
12+
"github.com/openshift/insights-operator/pkg/config"
13+
"github.com/openshift/insights-operator/pkg/utils"
14+
corev1 "k8s.io/api/core/v1"
15+
"k8s.io/apimachinery/pkg/runtime"
16+
"k8s.io/client-go/kubernetes"
17+
clsetfake "k8s.io/client-go/kubernetes/fake"
18+
corefake "k8s.io/client-go/kubernetes/typed/core/v1/fake"
19+
"k8s.io/klog"
20+
21+
clienttesting "k8s.io/client-go/testing"
22+
)
23+
24+
func TestChangeSupportConfig(t *testing.T) {
25+
var cases = []struct {
26+
name string
27+
config map[string]*corev1.Secret
28+
expConfig *config.Controller
29+
expErr error
30+
}{
31+
{name: "interval too short",
32+
config: map[string]*corev1.Secret{
33+
pullSecretKey: &corev1.Secret{Data: map[string][]byte{
34+
".dockerconfigjson": nil,
35+
}},
36+
supportKey: &corev1.Secret{Data: map[string][]byte{
37+
"username": []byte("someone"),
38+
"password": []byte("secret"),
39+
"endpoint": []byte("http://po.rt"),
40+
"interval": []byte("1s"),
41+
}},
42+
},
43+
expErr: fmt.Errorf("insights secret interval must be a duration (1h, 10m) greater than or equal to one minute: too short"),
44+
},
45+
{name: "correct interval",
46+
config: map[string]*corev1.Secret{
47+
pullSecretKey: &corev1.Secret{Data: map[string][]byte{
48+
".dockerconfigjson": nil,
49+
}},
50+
supportKey: &corev1.Secret{Data: map[string][]byte{
51+
"interval": []byte("1m"),
52+
}},
53+
},
54+
expConfig: &config.Controller{
55+
Interval: 1 * time.Minute,
56+
},
57+
expErr: nil,
58+
},
59+
}
60+
61+
for _, tt := range cases {
62+
t.Run(tt.name, func(t *testing.T) {
63+
64+
// log klog to test
65+
klog.SetOutput(utils.NewTestLog(t).Writer())
66+
67+
ctrl := config.Controller{}
68+
kube := kubeClientResponder{}
69+
secs := tt.config
70+
// setup mock responses for secretes by secret name
71+
kube.CoreV1().(*corefake.FakeCoreV1).Fake.AddReactor("get", "secrets",
72+
func(action clienttesting.Action) (handled bool, ret runtime.Object, err error) {
73+
actionName := ""
74+
if getAction, ok := action.(clienttesting.GetAction); ok {
75+
actionName = getAction.GetName()
76+
}
77+
78+
key := fmt.Sprintf("(%s) %s.%s", action.GetResource(), action.GetNamespace(), actionName)
79+
sv, ok := secs[key]
80+
if !ok {
81+
return false, nil, nil
82+
}
83+
return true, sv, nil
84+
})
85+
// imitates New function
86+
c := &Controller{
87+
kubeClient: &kube,
88+
defaultConfig: ctrl,
89+
}
90+
c.mergeConfigLocked()
91+
err := c.retrieveToken()
92+
if err == nil {
93+
err = c.retrieveConfig()
94+
}
95+
expErrS := ""
96+
if tt.expErr != nil {
97+
expErrS = tt.expErr.Error()
98+
}
99+
errS := ""
100+
if err != nil {
101+
errS = err.Error()
102+
}
103+
if expErrS != errS {
104+
t.Fatalf("The test expected error doesn't match actual error.\nExpected: %s Actual: %s", tt.expErr, err)
105+
}
106+
if tt.expConfig != nil && !reflect.DeepEqual(tt.expConfig, c.config) {
107+
t.Fatalf("The test expected config doesn't match actual config.\nExpected: %v Actual: %v", tt.expConfig, c.config)
108+
}
109+
})
110+
}
111+
112+
}
113+
114+
const (
115+
pullSecretKey = "(/v1, Resource=secrets) openshift-config.pull-secret"
116+
supportKey = "(/v1, Resource=secrets) openshift-config.support"
117+
intervalKey = "interval"
118+
)
119+
120+
func mustMarshal(v interface{}) []byte {
121+
bt, err := json.Marshal(v)
122+
if err != nil {
123+
panic(err)
124+
}
125+
return bt
126+
}
127+
128+
func mustLoad(filename string) []byte {
129+
f, err := os.Open(filename)
130+
if err != nil {
131+
panic(fmt.Errorf("test failed to load data: %v", err))
132+
}
133+
defer f.Close()
134+
bts, err := ioutil.ReadAll(f)
135+
if err != nil {
136+
panic(fmt.Errorf("test failed to read data: %v", err))
137+
}
138+
return bts
139+
}
140+
141+
type kubeClientResponder struct {
142+
clsetfake.Clientset
143+
}
144+
145+
var _ kubernetes.Interface = (*kubeClientResponder)(nil)

pkg/utils/testlog.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package utils
2+
3+
import (
4+
"log"
5+
"testing"
6+
)
7+
8+
func NewTestLog(t testing.TB) *log.Logger {
9+
t.Helper()
10+
return log.New(testWriter{TB: t}, t.Name()+" ", log.LstdFlags|log.Lshortfile|log.LUTC)
11+
}
12+
13+
type testWriter struct {
14+
testing.TB
15+
}
16+
17+
func (tw testWriter) Write(p []byte) (int, error) {
18+
tw.Helper()
19+
tw.Logf("%s", p)
20+
return len(p), nil
21+
}

vendor/golang.org/x/net/http2/http2.go

-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/golang.org/x/net/http2/server.go

+4-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/golang.org/x/net/http2/transport.go

-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)