Skip to content

Commit 829233e

Browse files
committed
added unit test for ClusterInfo
1 parent 8562b2e commit 829233e

File tree

2 files changed

+247
-34
lines changed

2 files changed

+247
-34
lines changed

pkg/asset/agent/joiner/clusterinfo.go

Lines changed: 50 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import (
2424
// from an already existing cluster. A number of different resources
2525
// are inspected to extract the required configuration.
2626
type ClusterInfo struct {
27+
Config *rest.Config
28+
Client kubernetes.Interface
29+
OpenshiftClient configclient.Interface
30+
2731
ClusterID string
2832
Version string
2933
ReleaseImage string
@@ -65,45 +69,36 @@ func (ci *ClusterInfo) Generate(dependencies asset.Parents) error {
6569
return nil
6670
}
6771

68-
config, err := ci.getRestConfig(addNodesConfig.Params.Kubeconfig)
69-
if err != nil {
70-
return err
71-
}
72-
err = ci.retrieveAPIDNSName(config)
72+
err := ci.initClients(addNodesConfig.Params.Kubeconfig)
7373
if err != nil {
7474
return err
7575
}
76-
77-
clientset, err := configclient.NewForConfig(config)
76+
err = ci.retrieveAPIDNSName()
7877
if err != nil {
7978
return err
8079
}
81-
err = ci.retrieveClusterData(clientset)
80+
err = ci.retrieveClusterData()
8281
if err != nil {
8382
return err
8483
}
85-
err = ci.retrieveProxy(clientset)
84+
err = ci.retrieveProxy()
8685
if err != nil {
8786
return err
8887
}
8988

90-
k8sclientset, err := kubernetes.NewForConfig(config)
91-
if err != nil {
92-
return err
93-
}
94-
err = ci.retrievePullSecret(k8sclientset)
89+
err = ci.retrievePullSecret()
9590
if err != nil {
9691
return err
9792
}
98-
err = ci.retrieveUserTrustBundle(k8sclientset)
93+
err = ci.retrieveUserTrustBundle()
9994
if err != nil {
10095
return err
10196
}
102-
err = ci.retrieveArchitecture(k8sclientset)
97+
err = ci.retrieveArchitecture()
10398
if err != nil {
10499
return err
105100
}
106-
err = ci.retrieveInstallConfigData(k8sclientset)
101+
err = ci.retrieveInstallConfigData()
107102
if err != nil {
108103
return err
109104
}
@@ -113,21 +108,40 @@ func (ci *ClusterInfo) Generate(dependencies asset.Parents) error {
113108
return nil
114109
}
115110

116-
func (ci *ClusterInfo) getRestConfig(kubeconfig string) (*rest.Config, error) {
111+
func (ci *ClusterInfo) initClients(kubeconfig string) error {
112+
if ci.Client != nil && ci.OpenshiftClient != nil {
113+
return nil
114+
}
115+
117116
var err error
118117
var config *rest.Config
119-
120118
if kubeconfig != "" {
121119
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
122120
} else {
123121
config, err = rest.InClusterConfig()
124122
}
123+
if err != nil {
124+
return err
125+
}
126+
ci.Config = config
127+
128+
openshiftClient, err := configclient.NewForConfig(ci.Config)
129+
if err != nil {
130+
return err
131+
}
132+
ci.OpenshiftClient = openshiftClient
133+
134+
k8sclientset, err := kubernetes.NewForConfig(ci.Config)
135+
if err != nil {
136+
return err
137+
}
138+
ci.Client = k8sclientset
125139

126-
return config, err
140+
return err
127141
}
128142

129-
func (ci *ClusterInfo) retrieveClusterData(clientset *configclient.Clientset) error {
130-
cv, err := clientset.ConfigV1().ClusterVersions().Get(context.Background(), "version", metav1.GetOptions{})
143+
func (ci *ClusterInfo) retrieveClusterData() error {
144+
cv, err := ci.OpenshiftClient.ConfigV1().ClusterVersions().Get(context.Background(), "version", metav1.GetOptions{})
131145
if err != nil {
132146
return err
133147
}
@@ -138,8 +152,8 @@ func (ci *ClusterInfo) retrieveClusterData(clientset *configclient.Clientset) er
138152
return nil
139153
}
140154

141-
func (ci *ClusterInfo) retrieveProxy(clientset *configclient.Clientset) error {
142-
proxy, err := clientset.ConfigV1().Proxies().Get(context.Background(), "cluster", metav1.GetOptions{})
155+
func (ci *ClusterInfo) retrieveProxy() error {
156+
proxy, err := ci.OpenshiftClient.ConfigV1().Proxies().Get(context.Background(), "cluster", metav1.GetOptions{})
143157
if err != nil {
144158
return err
145159
}
@@ -152,8 +166,8 @@ func (ci *ClusterInfo) retrieveProxy(clientset *configclient.Clientset) error {
152166
return nil
153167
}
154168

155-
func (ci *ClusterInfo) retrieveAPIDNSName(config *rest.Config) error {
156-
parsedURL, err := url.Parse(config.Host)
169+
func (ci *ClusterInfo) retrieveAPIDNSName() error {
170+
parsedURL, err := url.Parse(ci.Config.Host)
157171
if err != nil {
158172
return err
159173
}
@@ -162,8 +176,8 @@ func (ci *ClusterInfo) retrieveAPIDNSName(config *rest.Config) error {
162176
return nil
163177
}
164178

165-
func (ci *ClusterInfo) retrievePullSecret(clientset *kubernetes.Clientset) error {
166-
pullSecret, err := clientset.CoreV1().Secrets("openshift-config").Get(context.Background(), "pull-secret", metav1.GetOptions{})
179+
func (ci *ClusterInfo) retrievePullSecret() error {
180+
pullSecret, err := ci.Client.CoreV1().Secrets("openshift-config").Get(context.Background(), "pull-secret", metav1.GetOptions{})
167181
if err != nil {
168182
return err
169183
}
@@ -172,8 +186,8 @@ func (ci *ClusterInfo) retrievePullSecret(clientset *kubernetes.Clientset) error
172186
return nil
173187
}
174188

175-
func (ci *ClusterInfo) retrieveUserTrustBundle(clientset *kubernetes.Clientset) error {
176-
userCaBundle, err := clientset.CoreV1().ConfigMaps("openshift-config").Get(context.Background(), "user-ca-bundle", metav1.GetOptions{})
189+
func (ci *ClusterInfo) retrieveUserTrustBundle() error {
190+
userCaBundle, err := ci.Client.CoreV1().ConfigMaps("openshift-config").Get(context.Background(), "user-ca-bundle", metav1.GetOptions{})
177191
if err != nil {
178192
if errors.IsNotFound(err) {
179193
return nil
@@ -185,8 +199,10 @@ func (ci *ClusterInfo) retrieveUserTrustBundle(clientset *kubernetes.Clientset)
185199
return nil
186200
}
187201

188-
func (ci *ClusterInfo) retrieveArchitecture(clientset *kubernetes.Clientset) error {
189-
nodes, err := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
202+
func (ci *ClusterInfo) retrieveArchitecture() error {
203+
nodes, err := ci.Client.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{
204+
LabelSelector: "node-role.kubernetes.io/master",
205+
})
190206
if err != nil {
191207
return err
192208
}
@@ -195,8 +211,8 @@ func (ci *ClusterInfo) retrieveArchitecture(clientset *kubernetes.Clientset) err
195211
return nil
196212
}
197213

198-
func (ci *ClusterInfo) retrieveInstallConfigData(clientset *kubernetes.Clientset) error {
199-
clusterConfig, err := clientset.CoreV1().ConfigMaps("kube-system").Get(context.Background(), "cluster-config-v1", metav1.GetOptions{})
214+
func (ci *ClusterInfo) retrieveInstallConfigData() error {
215+
clusterConfig, err := ci.Client.CoreV1().ConfigMaps("kube-system").Get(context.Background(), "cluster-config-v1", metav1.GetOptions{})
200216
if err != nil {
201217
if errors.IsNotFound(err) {
202218
return nil
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
package joiner
2+
3+
import (
4+
"testing"
5+
6+
"github.com/openshift/assisted-service/api/hiveextension/v1beta1"
7+
fakeclientconfig "github.com/openshift/client-go/config/clientset/versioned/fake"
8+
"gopkg.in/yaml.v2"
9+
corev1 "k8s.io/api/core/v1"
10+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
13+
"k8s.io/client-go/kubernetes/fake"
14+
"k8s.io/client-go/rest"
15+
16+
configv1 "github.com/openshift/api/config/v1"
17+
"github.com/openshift/installer/pkg/asset"
18+
"github.com/openshift/installer/pkg/asset/agent/workflow"
19+
"github.com/openshift/installer/pkg/types"
20+
"github.com/openshift/installer/pkg/types/baremetal"
21+
"github.com/stretchr/testify/assert"
22+
)
23+
24+
func TestClusterInfo_Generate(t *testing.T) {
25+
cases := []struct {
26+
name string
27+
workflow workflow.AgentWorkflowType
28+
objects []runtime.Object
29+
openshiftOjects []runtime.Object
30+
configHost string
31+
expectedClusterInfo ClusterInfo
32+
}{
33+
{
34+
name: "skip if not add-nodes workflow",
35+
workflow: workflow.AgentWorkflowTypeInstall,
36+
expectedClusterInfo: ClusterInfo{},
37+
},
38+
{
39+
name: "default",
40+
workflow: workflow.AgentWorkflowTypeAddNodes,
41+
configHost: "https://api.ostest.test.metalkube.org:6443",
42+
openshiftOjects: []runtime.Object{
43+
&configv1.ClusterVersion{
44+
ObjectMeta: v1.ObjectMeta{
45+
Name: "version",
46+
},
47+
Spec: configv1.ClusterVersionSpec{
48+
ClusterID: "1b5ba46b-7e56-47b1-a326-a9eebddfb38c",
49+
},
50+
Status: configv1.ClusterVersionStatus{
51+
History: []configv1.UpdateHistory{
52+
{
53+
Image: "registry.ci.openshift.org/ocp/release@sha256:65d9b652d0d23084bc45cb66001c22e796d43f5e9e005c2bc2702f94397d596e",
54+
Version: "4.15.0",
55+
},
56+
},
57+
},
58+
},
59+
&configv1.Proxy{
60+
ObjectMeta: v1.ObjectMeta{
61+
Name: "cluster",
62+
},
63+
Spec: configv1.ProxySpec{
64+
HTTPProxy: "http://proxy",
65+
HTTPSProxy: "https://proxy",
66+
NoProxy: "localhost",
67+
},
68+
},
69+
},
70+
objects: []runtime.Object{
71+
&corev1.Secret{
72+
ObjectMeta: v1.ObjectMeta{
73+
Name: "pull-secret",
74+
Namespace: "openshift-config",
75+
},
76+
Data: map[string][]byte{
77+
".dockerconfigjson": []byte("c3VwZXJzZWNyZXQK"),
78+
},
79+
},
80+
&corev1.ConfigMap{
81+
ObjectMeta: v1.ObjectMeta{
82+
Name: "user-ca-bundle",
83+
Namespace: "openshift-config",
84+
},
85+
Data: map[string]string{
86+
"ca-bundle.crt": "--- bundle ---",
87+
},
88+
},
89+
&corev1.Node{
90+
ObjectMeta: v1.ObjectMeta{
91+
Labels: map[string]string{
92+
"node-role.kubernetes.io/master": "",
93+
},
94+
},
95+
Status: corev1.NodeStatus{
96+
NodeInfo: corev1.NodeSystemInfo{
97+
Architecture: "amd64",
98+
},
99+
},
100+
},
101+
&corev1.ConfigMap{
102+
ObjectMeta: v1.ObjectMeta{
103+
Name: "cluster-config-v1",
104+
Namespace: "kube-system",
105+
},
106+
Data: map[string]string{
107+
"install-config": makeInstallConfig(t),
108+
},
109+
},
110+
},
111+
expectedClusterInfo: ClusterInfo{
112+
ClusterID: "1b5ba46b-7e56-47b1-a326-a9eebddfb38c",
113+
ReleaseImage: "registry.ci.openshift.org/ocp/release@sha256:65d9b652d0d23084bc45cb66001c22e796d43f5e9e005c2bc2702f94397d596e",
114+
Version: "4.15.0",
115+
APIDNSName: "api.ostest.test.metalkube.org",
116+
Namespace: "cluster0",
117+
PullSecret: "c3VwZXJzZWNyZXQK",
118+
UserCaBundle: "--- bundle ---",
119+
Architecture: "amd64",
120+
Proxy: &types.Proxy{
121+
HTTPProxy: "http://proxy",
122+
HTTPSProxy: "https://proxy",
123+
NoProxy: "localhost",
124+
},
125+
ImageDigestSources: []types.ImageDigestSource{
126+
{
127+
Source: "quay.io/openshift-release-dev/ocp-v4.0-art-dev",
128+
Mirrors: []string{
129+
"registry.example.com:5000/ocp4/openshift4",
130+
},
131+
},
132+
},
133+
PlatformType: v1beta1.BareMetalPlatformType,
134+
SSHKey: "my-ssh-key",
135+
},
136+
},
137+
}
138+
for _, tc := range cases {
139+
t.Run(tc.name, func(t *testing.T) {
140+
agentWorkflow := &workflow.AgentWorkflow{Workflow: tc.workflow}
141+
addNodesConfig := &AddNodesConfig{}
142+
parents := asset.Parents{}
143+
parents.Add(agentWorkflow)
144+
parents.Add(addNodesConfig)
145+
146+
fakeClient := fake.NewSimpleClientset(tc.objects...)
147+
fakeOCClient := fakeclientconfig.NewSimpleClientset(tc.openshiftOjects...)
148+
fakeConfig := &rest.Config{
149+
Host: tc.configHost,
150+
}
151+
152+
clusterInfo := &ClusterInfo{
153+
Config: fakeConfig,
154+
Client: fakeClient,
155+
OpenshiftClient: fakeOCClient,
156+
}
157+
err := clusterInfo.Generate(parents)
158+
159+
assert.NoError(t, err)
160+
assert.Equal(t, tc.expectedClusterInfo.ClusterID, clusterInfo.ClusterID)
161+
assert.Equal(t, tc.expectedClusterInfo.Version, clusterInfo.Version)
162+
assert.Equal(t, tc.expectedClusterInfo.ReleaseImage, clusterInfo.ReleaseImage)
163+
assert.Equal(t, tc.expectedClusterInfo.APIDNSName, clusterInfo.APIDNSName)
164+
assert.Equal(t, tc.expectedClusterInfo.PullSecret, clusterInfo.PullSecret)
165+
assert.Equal(t, tc.expectedClusterInfo.Namespace, clusterInfo.Namespace)
166+
assert.Equal(t, tc.expectedClusterInfo.UserCaBundle, clusterInfo.UserCaBundle)
167+
assert.Equal(t, tc.expectedClusterInfo.Proxy, clusterInfo.Proxy)
168+
assert.Equal(t, tc.expectedClusterInfo.Architecture, clusterInfo.Architecture)
169+
assert.Equal(t, tc.expectedClusterInfo.ImageDigestSources, clusterInfo.ImageDigestSources)
170+
assert.Equal(t, tc.expectedClusterInfo.DeprecatedImageContentSources, clusterInfo.DeprecatedImageContentSources)
171+
assert.Equal(t, tc.expectedClusterInfo.PlatformType, clusterInfo.PlatformType)
172+
assert.Equal(t, tc.expectedClusterInfo.SSHKey, clusterInfo.SSHKey)
173+
})
174+
}
175+
}
176+
177+
func makeInstallConfig(t *testing.T) string {
178+
ic := &types.InstallConfig{
179+
ImageDigestSources: []types.ImageDigestSource{
180+
{
181+
Source: "quay.io/openshift-release-dev/ocp-v4.0-art-dev",
182+
Mirrors: []string{
183+
"registry.example.com:5000/ocp4/openshift4",
184+
},
185+
},
186+
},
187+
Platform: types.Platform{
188+
BareMetal: &baremetal.Platform{},
189+
},
190+
SSHKey: "my-ssh-key",
191+
}
192+
data, err := yaml.Marshal(ic)
193+
if err != nil {
194+
t.Error(err)
195+
}
196+
return string(data)
197+
}

0 commit comments

Comments
 (0)