2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
29 "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/appmgr"
30 "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/models"
31 "gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/util"
34 var helmSearchOutput = `
35 helm-repo/anr 0.0.1 1.0 Helm Chart for Nokia ANR (Automatic Neighbour Relation) xAPP
36 helm-repo/appmgr 0.0.2 1.0 Helm Chart for xAppManager
37 helm-repo/dualco 0.0.1 1.0 Helm Chart for Nokia dualco xAPP
38 helm-repo/reporter 0.0.1 1.0 Helm Chart for Reporting xAPP
39 helm-repo/uemgr 0.0.1 1.0 Helm Chart for Nokia uemgr xAPP
42 var kubectlConfigmapOutput = `
51 "protPort": "tcp:4560",
54 "txMessages": ["RIC_X2_LOAD_INFORMATION"],
55 "rxMessages": ["RIC_X2_LOAD_INFORMATION"],
56 "policies": [11, 22, 33]
59 "namespace": "ricxapp",
66 type ConfigSample struct {
71 type MockedConfigMapper struct {
74 func (cm *MockedConfigMapper) ReadSchema(name string, c *models.XAppConfig) (err error) {
78 func (cm *MockedConfigMapper) UploadConfig() (cfg []models.XAppConfig) {
82 func (cm *MockedConfigMapper) CreateConfigMap(r models.XAppConfig) (errList models.ConfigValidationErrors, err error) {
86 func (cm *MockedConfigMapper) GetConfigMap(m models.XappDescriptor, c *interface{}) (err error) {
90 func (cm *MockedConfigMapper) UpdateConfigMap(r models.XAppConfig) (errList models.ConfigValidationErrors, err error) {
94 func (cm *MockedConfigMapper) DeleteConfigMap(r models.XAppConfig) (c interface{}, err error) {
98 func (cm *MockedConfigMapper) PurgeConfigMap(m models.XappDescriptor) (c interface{}, err error) {
102 func (cm *MockedConfigMapper) RestoreConfigMap(m models.XappDescriptor, c interface{}) (err error) {
106 func (cm *MockedConfigMapper) ReadConfigMap(name string, ns string, c *interface{}) (err error) {
110 func (cm *MockedConfigMapper) ApplyConfigMap(r models.XAppConfig, action string) (err error) {
114 func (cm *MockedConfigMapper) FetchChart(name string) (err error) {
118 func (cm *MockedConfigMapper) GetRtmData(name string) (msgs appmgr.RtmData) {
122 func (cm *MockedConfigMapper) GetNamespace(ns string) (n string) {
126 func (cm *MockedConfigMapper) GetNamesFromHelmRepo() (names []string) {
131 func TestMain(m *testing.M) {
133 appmgr.Logger.SetLevel(0)
139 func TestGetRtmData(t *testing.T) {
140 expectedMsgs := appmgr.RtmData{
141 TxMessages: []string{"RIC_X2_LOAD_INFORMATION"},
142 RxMessages: []string{"RIC_X2_LOAD_INFORMATION"},
143 Policies: []int64{11, 22, 33},
146 util.KubectlExec = func(args string) (out []byte, err error) {
147 return []byte(kubectlConfigmapOutput), nil
150 result := NewCM().GetRtmData("dummy-xapp")
151 if !reflect.DeepEqual(result, expectedMsgs) {
152 t.Errorf("TestGetRtmData failed: expected: %v, got: %v", expectedMsgs, result)
156 func TestHelmNamespace(t *testing.T) {
157 if NewCM().GetNamespace("pltxapp") != "pltxapp" {
158 t.Errorf("getNamespace failed!")
161 if NewCM().GetNamespace("") != "ricxapp" {
162 t.Errorf("getNamespace failed!")
166 func TestFetchChartFails(t *testing.T) {
167 if NewCM().FetchChart("dummy-xapp") == nil {
168 t.Errorf("TestFetchChart failed!")
172 func TestFetchChartSuccess(t *testing.T) {
173 util.HelmExec = func(args string) (out []byte, err error) {
177 if NewCM().FetchChart("dummy-xapp") != nil {
178 t.Errorf("TestFetchChart failed!")
182 func TestGetNamesFromHelmRepoSuccess(t *testing.T) {
183 expectedResult := []string{"anr", "appmgr", "dualco", "reporter", "uemgr"}
184 util.HelmExec = func(args string) (out []byte, err error) {
185 return []byte(helmSearchOutput), nil
188 names := NewCM().GetNamesFromHelmRepo()
189 if !reflect.DeepEqual(names, expectedResult) {
190 t.Errorf("GetNamesFromHelmRepo failed: expected %v, got %v", expectedResult, names)
194 func TestGetNamesFromHelmRepoFailure(t *testing.T) {
195 expectedResult := []string{}
196 util.HelmExec = func(args string) (out []byte, err error) {
197 return []byte(helmSearchOutput), errors.New("Command failed!")
200 names := NewCM().GetNamesFromHelmRepo()
202 t.Errorf("GetNamesFromHelmRepo failed: expected %v, got %v", expectedResult, names)
206 func TestApplyConfigMapSuccess(t *testing.T) {
208 m := models.ConfigMetadata{Name: &name, Namespace: "ricxapp"}
209 s := ConfigSample{5, "localhost"}
211 util.KubectlExec = func(args string) (out []byte, err error) {
212 return []byte(`{"logger": {"level": 2}}`), nil
215 err := NewCM().ApplyConfigMap(models.XAppConfig{Metadata: &m, Config: s}, "create")
217 t.Errorf("ApplyConfigMap failed: %v", err)
221 func TestRestoreConfigMapSuccess(t *testing.T) {
223 m := models.XappDescriptor{XappName: &name, Namespace: "ricxapp"}
224 s := ConfigSample{5, "localhost"}
226 util.KubectlExec = func(args string) (out []byte, err error) {
227 return []byte(`{"logger": {"level": 2}}`), nil
230 err := NewCM().RestoreConfigMap(m, s)
232 t.Errorf("RestoreConfigMap failed: %v", err)
236 func TestDeleteConfigMapSuccess(t *testing.T) {
237 util.HelmExec = func(args string) (out []byte, err error) {
238 return []byte("ok"), nil
241 util.KubectlExec = func(args string) (out []byte, err error) {
242 return []byte(`{"logger": {"level": 2}}`), nil
245 validationErrors, err := NewCM().DeleteConfigMap(models.ConfigMetadata{})
247 t.Errorf("DeleteConfigMap failed: %v -> %v", err, validationErrors)
251 func TestPurgeConfigMapSuccess(t *testing.T) {
252 util.HelmExec = func(args string) (out []byte, err error) {
253 return []byte("ok"), nil
256 util.KubectlExec = func(args string) (out []byte, err error) {
257 return []byte(`{"logger": {"level": 2}}`), nil
261 validationErrors, err := NewCM().PurgeConfigMap(models.XappDescriptor{XappName: &name})
263 t.Errorf("PurgeConfigMap failed: %v -> %v", err, validationErrors)
267 func TestCreateConfigMapFails(t *testing.T) {
269 validationErrors, err := NewCM().CreateConfigMap(models.XAppConfig{Metadata: &models.ConfigMetadata{Name: &name}})
271 t.Errorf("CreateConfigMap failed: %v -> %v", err, validationErrors)
275 func TestUpdateConfigMapFails(t *testing.T) {
277 validationErrors, err := NewCM().UpdateConfigMap(models.XAppConfig{Metadata: &models.ConfigMetadata{Name: &name}})
279 t.Errorf("CreateConfigMap failed: %v -> %v", err, validationErrors)
283 func TestValidationSuccess(t *testing.T) {
285 var cfg map[string]interface{}
286 err := json.Unmarshal([]byte(`{"local": {"host": ":8080"}, "logger": {"level": 3}}`), &cfg)
288 err = NewCM().ReadFile("../../test/schema.json", &d)
290 t.Errorf("ReadFile failed: %v -> %v", err, d)
293 feedback, err := NewCM().doValidate(d, cfg)
295 t.Errorf("doValidate failed: %v -> %v", err, feedback)
299 func TestValidationFails(t *testing.T) {
301 var cfg map[string]interface{}
302 err := json.Unmarshal([]byte(`{"local": {"host": ":8080"}, "logger": {"level": "INVALID"}}`), &cfg)
304 err = NewCM().ReadFile("../../test/schema.json", &d)
306 t.Errorf("ConfigMetadata failed: %v -> %v", err, d)
309 feedback, err := NewCM().doValidate(d, cfg)
311 t.Errorf("doValidate should faile but didn't: %v -> %v", err, feedback)
313 appmgr.Logger.Debug("Feedbacks: %v", feedback)