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"]
58 "namespace": "ricxapp",
65 type ConfigSample struct {
70 type MockedConfigMapper struct {
73 func (cm *MockedConfigMapper) ReadSchema(name string, c *models.XAppConfig) (err error) {
77 func (cm *MockedConfigMapper) UploadConfig() (cfg []models.XAppConfig) {
81 func (cm *MockedConfigMapper) CreateConfigMap(r models.XAppConfig) (errList models.ConfigValidationErrors, err error) {
85 func (cm *MockedConfigMapper) GetConfigMap(m models.XappDescriptor, c *interface{}) (err error) {
89 func (cm *MockedConfigMapper) UpdateConfigMap(r models.XAppConfig) (errList models.ConfigValidationErrors, err error) {
93 func (cm *MockedConfigMapper) DeleteConfigMap(r models.XAppConfig) (c interface{}, err error) {
97 func (cm *MockedConfigMapper) PurgeConfigMap(m models.XappDescriptor) (c interface{}, err error) {
101 func (cm *MockedConfigMapper) RestoreConfigMap(m models.XappDescriptor, c interface{}) (err error) {
105 func (cm *MockedConfigMapper) ReadConfigMap(name string, ns string, c *interface{}) (err error) {
109 func (cm *MockedConfigMapper) ApplyConfigMap(r models.XAppConfig, action string) (err error) {
113 func (cm *MockedConfigMapper) FetchChart(name string) (err error) {
117 func (cm *MockedConfigMapper) GetMessages(name string) (msgs appmgr.MessageTypes) {
121 func (cm *MockedConfigMapper) GetNamespace(ns string) (n string) {
125 func (cm *MockedConfigMapper) GetNamesFromHelmRepo() (names []string) {
130 func TestMain(m *testing.M) {
132 appmgr.Logger.SetLevel(0)
138 func TestGetMessages(t *testing.T) {
139 expectedMsgs := appmgr.MessageTypes{
140 TxMessages: []string{"RIC_X2_LOAD_INFORMATION"},
141 RxMessages: []string{"RIC_X2_LOAD_INFORMATION"},
144 util.KubectlExec = func(args string) (out []byte, err error) {
145 return []byte(kubectlConfigmapOutput), nil
148 result := NewCM().GetMessages("dummy-xapp")
149 if !reflect.DeepEqual(result, expectedMsgs) {
150 t.Errorf("TestGetMessages failed: expected: %v, got: %v", expectedMsgs, result)
154 func TestHelmNamespace(t *testing.T) {
155 if NewCM().GetNamespace("pltxapp") != "pltxapp" {
156 t.Errorf("getNamespace failed!")
159 if NewCM().GetNamespace("") != "ricxapp" {
160 t.Errorf("getNamespace failed!")
164 func TestFetchChartFails(t *testing.T) {
165 if NewCM().FetchChart("dummy-xapp") == nil {
166 t.Errorf("TestFetchChart failed!")
170 func TestFetchChartSuccess(t *testing.T) {
171 util.HelmExec = func(args string) (out []byte, err error) {
175 if NewCM().FetchChart("dummy-xapp") != nil {
176 t.Errorf("TestFetchChart failed!")
180 func TestGetNamesFromHelmRepoSuccess(t *testing.T) {
181 expectedResult := []string{"anr", "appmgr", "dualco", "reporter", "uemgr"}
182 util.HelmExec = func(args string) (out []byte, err error) {
183 return []byte(helmSearchOutput), nil
186 names := NewCM().GetNamesFromHelmRepo()
187 if !reflect.DeepEqual(names, expectedResult) {
188 t.Errorf("GetNamesFromHelmRepo failed: expected %v, got %v", expectedResult, names)
192 func TestGetNamesFromHelmRepoFailure(t *testing.T) {
193 expectedResult := []string{}
194 util.HelmExec = func(args string) (out []byte, err error) {
195 return []byte(helmSearchOutput), errors.New("Command failed!")
198 names := NewCM().GetNamesFromHelmRepo()
200 t.Errorf("GetNamesFromHelmRepo failed: expected %v, got %v", expectedResult, names)
204 func TestApplyConfigMapSuccess(t *testing.T) {
206 m := models.ConfigMetadata{Name: &name, Namespace: "ricxapp"}
207 s := ConfigSample{5, "localhost"}
209 util.KubectlExec = func(args string) (out []byte, err error) {
210 return []byte(`{"logger": {"level": 2}}`), nil
213 err := NewCM().ApplyConfigMap(models.XAppConfig{Metadata: &m, Config: s}, "create")
215 t.Errorf("ApplyConfigMap failed: %v", err)
219 func TestRestoreConfigMapSuccess(t *testing.T) {
221 m := models.XappDescriptor{XappName: &name, Namespace: "ricxapp"}
222 s := ConfigSample{5, "localhost"}
224 util.KubectlExec = func(args string) (out []byte, err error) {
225 return []byte(`{"logger": {"level": 2}}`), nil
228 err := NewCM().RestoreConfigMap(m, s)
230 t.Errorf("RestoreConfigMap failed: %v", err)
234 func TestDeleteConfigMapSuccess(t *testing.T) {
235 util.HelmExec = func(args string) (out []byte, err error) {
236 return []byte("ok"), nil
239 util.KubectlExec = func(args string) (out []byte, err error) {
240 return []byte(`{"logger": {"level": 2}}`), nil
243 validationErrors, err := NewCM().DeleteConfigMap(models.ConfigMetadata{})
245 t.Errorf("DeleteConfigMap failed: %v -> %v", err, validationErrors)
249 func TestPurgeConfigMapSuccess(t *testing.T) {
250 util.HelmExec = func(args string) (out []byte, err error) {
251 return []byte("ok"), nil
254 util.KubectlExec = func(args string) (out []byte, err error) {
255 return []byte(`{"logger": {"level": 2}}`), nil
259 validationErrors, err := NewCM().PurgeConfigMap(models.XappDescriptor{XappName: &name})
261 t.Errorf("PurgeConfigMap failed: %v -> %v", err, validationErrors)
265 func TestCreateConfigMapFails(t *testing.T) {
267 validationErrors, err := NewCM().CreateConfigMap(models.XAppConfig{Metadata: &models.ConfigMetadata{Name: &name}})
269 t.Errorf("CreateConfigMap failed: %v -> %v", err, validationErrors)
273 func TestUpdateConfigMapFails(t *testing.T) {
275 validationErrors, err := NewCM().UpdateConfigMap(models.XAppConfig{Metadata: &models.ConfigMetadata{Name: &name}})
277 t.Errorf("CreateConfigMap failed: %v -> %v", err, validationErrors)
281 func TestValidationSuccess(t *testing.T) {
283 var cfg map[string]interface{}
284 err := json.Unmarshal([]byte(`{"local": {"host": ":8080"}, "logger": {"level": 3}}`), &cfg)
286 err = NewCM().ReadFile("../../test/schema.json", &d)
288 t.Errorf("ReadFile failed: %v -> %v", err, d)
291 feedback, err := NewCM().doValidate(d, cfg)
293 t.Errorf("doValidate failed: %v -> %v", err, feedback)
297 func TestValidationFails(t *testing.T) {
299 var cfg map[string]interface{}
300 err := json.Unmarshal([]byte(`{"local": {"host": ":8080"}, "logger": {"level": "INVALID"}}`), &cfg)
302 err = NewCM().ReadFile("../../test/schema.json", &d)
304 t.Errorf("ConfigMetadata failed: %v -> %v", err, d)
307 feedback, err := NewCM().doValidate(d, cfg)
309 t.Errorf("doValidate should faile but didn't: %v -> %v", err, feedback)
311 appmgr.Logger.Debug("Feedbacks: %v", feedback)