Update invalid package test with additional packages
[nonrtric/plt/rappmanager.git] / scripts / init / generate-test-rapp-packages / generatetestrapppackages.go
1 // -
2 //
3 //      ========================LICENSE_START=================================
4 //      O-RAN-SC
5 //      %%
6 //      Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved.
7 //      %%
8 //      Licensed under the Apache License, Version 2.0 (the "License");
9 //      you may not use this file except in compliance with the License.
10 //      You may obtain a copy of the License at
11 //
12 //           http://www.apache.org/licenses/LICENSE-2.0
13 //
14 //      Unless required by applicable law or agreed to in writing, software
15 //      distributed under the License is distributed on an "AS IS" BASIS,
16 //      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 //      See the License for the specific language governing permissions and
18 //      limitations under the License.
19 //      ========================LICENSE_END===================================
20 package main
21
22 import (
23         "archive/zip"
24         "encoding/json"
25         "fmt"
26         "io"
27         "os"
28         "path/filepath"
29         "strings"
30
31         cp "github.com/otiai10/copy"
32         "gopkg.in/yaml.v2"
33 )
34
35 func replaceStringsInDirectory(directory, stringToFind, stringToReplace string) error {
36         files, err := os.ReadDir(directory)
37         checkError(err)
38         for _, file := range files {
39                 filePath := filepath.Join(directory, file.Name())
40                 if file.IsDir() {
41                         if err := replaceStringsInDirectory(filePath, stringToFind, stringToReplace); err != nil {
42                                 return err
43                         }
44                 } else {
45                         if err := replaceString(filePath, stringToFind, stringToReplace); err != nil {
46                                 return err
47                         }
48                 }
49         }
50         return nil
51 }
52
53 func replaceString(fileLocation, stringToFind, stringToReplace string) error {
54         fileContent, err := os.ReadFile(fileLocation)
55         checkError(err)
56         if !strings.Contains(string(fileContent), stringToFind) {
57                 return nil
58         }
59         updatedContent := strings.ReplaceAll(string(fileContent), stringToFind, stringToReplace)
60         err = os.WriteFile(fileLocation, []byte(updatedContent), 0644)
61         checkError(err)
62         return nil
63 }
64
65 func updateChartMuseumUri(directory string) error {
66         CHART_MUSEUM_GET_URI := "http://localhost:8879/charts"
67         CHART_MUSEUM_POST_URI := "http://localhost:8879/charts/api/charts"
68         err := replaceStringsInDirectory(directory, "UPDATE_THIS_CHART_MUSEUM_POST_CHARTS_URI", CHART_MUSEUM_POST_URI)
69         checkError(err)
70         err = replaceStringsInDirectory(directory, "UPDATE_THIS_CHART_MUSEUM_GET_CHARTS_URI", CHART_MUSEUM_GET_URI)
71         checkError(err)
72         return nil
73 }
74
75 func generateCsarPackage(directory, fileName string) error {
76         csarFile, err := os.Create(fileName)
77         checkError(err)
78         defer csarFile.Close()
79         csarWriter := zip.NewWriter(csarFile)
80         defer csarWriter.Close()
81         err = filepath.Walk(directory, func(filePath string, fileInfo os.FileInfo, err error) error {
82                 if fileInfo.IsDir() {
83                         return nil
84                 }
85                 relPath, err := filepath.Rel(directory, filePath)
86                 checkError(err)
87                 relPath = strings.ReplaceAll(relPath, "\\", "/")
88                 zipFile, err := csarWriter.Create(relPath)
89                 checkError(err)
90                 fsFile, err := os.Open(filePath)
91                 checkError(err)
92                 _, err = io.Copy(zipFile, fsFile)
93                 checkError(err)
94                 defer fsFile.Close()
95                 return nil
96         })
97         checkError(err)
98         return nil
99 }
100
101 func createCsarAndCopy(directory string, paths ...string) error {
102         packageName := directory + ".csar"
103         err := generateCsarPackage(directory, packageName)
104         checkError(err)
105         for _, path := range paths {
106                 fmt.Printf("Copying %s to %s \n", packageName, path)
107                 copy(packageName, path+packageName)
108         }
109         os.Remove(packageName)
110         os.RemoveAll(directory)
111         return nil
112 }
113
114 func copy(srcFile string, targetFile string) {
115         data, err := os.ReadFile(srcFile)
116         checkError(err)
117         err = os.WriteFile(targetFile, data, 0644)
118         checkError(err)
119 }
120
121 func checkError(err error) error {
122         if err != nil {
123                 return err
124         }
125         return nil
126 }
127
128 func removeYamlElement(filePath string, elements ...string) error {
129         fileData, err := os.ReadFile(filePath)
130         checkError(err)
131         var yamlContent map[interface{}]interface{}
132         err = yaml.Unmarshal(fileData, &yamlContent)
133         checkError(err)
134         index := len(elements) - 1
135         dataMap := yamlContent
136         for i := 0; i < index; i++ {
137                 resultMap, ok := dataMap[elements[i]].(map[interface{}]interface{})
138                 if !ok {
139                         return nil
140                 }
141                 dataMap = resultMap
142         }
143         delete(dataMap, elements[index])
144         updatedYamlContent, err := yaml.Marshal(&yamlContent)
145         checkError(err)
146         err = os.WriteFile(filePath, updatedYamlContent, 0644)
147         checkError(err)
148         return nil
149 }
150
151 func addJsonElement(filePath string, element string, index string) error {
152         fileData, err := os.ReadFile(filePath)
153         checkError(err)
154         var jsonContent map[string]interface{}
155         err = json.Unmarshal(fileData, &jsonContent)
156         checkError(err)
157         array, ok := jsonContent[index].([]interface{})
158         if !ok {
159                 return nil
160         }
161         jsonContent[index] = append(array, element)
162         updatedJsonContent, err := json.Marshal(&jsonContent)
163         checkError(err)
164         err = os.WriteFile(filePath, updatedJsonContent, 0644)
165         checkError(err)
166         return nil
167 }
168
169 func main() {
170
171         SAMPLE_RAPP_GENERATOR := "sample-rapp-generator"
172         RAPP_BASE_PACKAGE := "rapp-all"
173         TEST_RESOURCES := "/src/test/resources/"
174         ACM_TEST_RESOURCES := "../rapp-manager-acm" + TEST_RESOURCES
175         APPLICATION_TEST_RESOURCES := "../rapp-manager-application" + TEST_RESOURCES
176         MODELS_TEST_RESOURCES := "../rapp-manager-models" + TEST_RESOURCES
177         DME_TEST_RESOURCES := "../rapp-manager-dme" + TEST_RESOURCES
178         SME_TEST_RESOURCES := "../rapp-manager-sme" + TEST_RESOURCES
179
180         if err := os.Chdir("../../../" + SAMPLE_RAPP_GENERATOR); err != nil {
181                 fmt.Println("Error changing working directory:", err)
182                 return
183         }
184
185         fmt.Println("Generating valid rApp package... ")
186         VALID_RAPP_PACKAGE_FOLDER_NAME := "valid-rapp-package"
187         cp.Copy(RAPP_BASE_PACKAGE, VALID_RAPP_PACKAGE_FOLDER_NAME)
188         updateChartMuseumUri(VALID_RAPP_PACKAGE_FOLDER_NAME)
189         createCsarAndCopy(VALID_RAPP_PACKAGE_FOLDER_NAME, ACM_TEST_RESOURCES, DME_TEST_RESOURCES, SME_TEST_RESOURCES, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
190
191         fmt.Println("Generating valid rApp package without artifacts...")
192         VALID_RAPP_PACKAGE_NO_ARTIFACTS_FOLDER_NAME := "valid-rapp-package-no-artifacts"
193         cp.Copy(RAPP_BASE_PACKAGE, VALID_RAPP_PACKAGE_NO_ARTIFACTS_FOLDER_NAME)
194         updateChartMuseumUri(VALID_RAPP_PACKAGE_NO_ARTIFACTS_FOLDER_NAME)
195         removeYamlElement(VALID_RAPP_PACKAGE_NO_ARTIFACTS_FOLDER_NAME+"/Definitions/asd.yaml", "topology_template", "node_templates", "applicationServiceDescriptor", "artifacts")
196         createCsarAndCopy(VALID_RAPP_PACKAGE_NO_ARTIFACTS_FOLDER_NAME, APPLICATION_TEST_RESOURCES)
197
198         fmt.Println("Generating invalid rApp package...")
199         INVALID_RAPP_PACKAGE_FOLDER_NAME := "invalid-rapp-package"
200         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_FOLDER_NAME)
201         os.RemoveAll(INVALID_RAPP_PACKAGE_FOLDER_NAME + "/Files")
202         os.RemoveAll(INVALID_RAPP_PACKAGE_FOLDER_NAME + "/Artifacts")
203         createCsarAndCopy(INVALID_RAPP_PACKAGE_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
204
205         fmt.Println("Generating invalid rApp package without tosca...")
206         INVALID_RAPP_PACKAGE_NO_TOSCA_FOLDER_NAME := "invalid-rapp-package-no-tosca"
207         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_NO_TOSCA_FOLDER_NAME)
208         os.Remove(INVALID_RAPP_PACKAGE_NO_TOSCA_FOLDER_NAME + "/TOSCA-Metadata/TOSCA.meta")
209         createCsarAndCopy(INVALID_RAPP_PACKAGE_NO_TOSCA_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
210
211         fmt.Println("Generating invalid rApp package without asd yaml...")
212         INVALID_RAPP_PACKAGE_NO_ASD_YAML_FOLDER_NAME := "invalid-rapp-package-no-asd-yaml"
213         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_NO_ASD_YAML_FOLDER_NAME)
214         os.Remove(INVALID_RAPP_PACKAGE_NO_ASD_YAML_FOLDER_NAME + "/Definitions/asd.yaml")
215         createCsarAndCopy(INVALID_RAPP_PACKAGE_NO_ASD_YAML_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
216
217         fmt.Println("Generating invalid rApp package without ACM composition...")
218         INVALID_RAPP_PACKAGE_NO_ACM_COMPOSITION_FOLDER_NAME := "invalid-rapp-package-no-acm-composition"
219         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_NO_ACM_COMPOSITION_FOLDER_NAME)
220         os.Remove(INVALID_RAPP_PACKAGE_NO_ACM_COMPOSITION_FOLDER_NAME + "/Files/Acm/definition/compositions.json")
221         createCsarAndCopy(INVALID_RAPP_PACKAGE_NO_ACM_COMPOSITION_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
222
223         fmt.Println("Generating invalid rApp package without Artifacts...")
224         INVALID_RAPP_PACKAGE_MISSING_ARTIFACT_FOLDER_NAME := "invalid-rapp-package-missing-artifact"
225         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_MISSING_ARTIFACT_FOLDER_NAME)
226         os.Remove(INVALID_RAPP_PACKAGE_MISSING_ARTIFACT_FOLDER_NAME + "/Artifacts/Deployment/HELM/orufhrecovery-1.0.0.tgz")
227         createCsarAndCopy(INVALID_RAPP_PACKAGE_MISSING_ARTIFACT_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
228
229         fmt.Println("Generating invalid rApp package with empty asd yaml...")
230         INVALID_RAPP_PACKAGE_EMPTY_ASD_FOLDER_NAME := "invalid-rapp-package-empty-asd-yaml"
231         cp.Copy(RAPP_BASE_PACKAGE, INVALID_RAPP_PACKAGE_EMPTY_ASD_FOLDER_NAME)
232         os.Truncate(INVALID_RAPP_PACKAGE_EMPTY_ASD_FOLDER_NAME+"/Definitions/asd.yaml", 0)
233         createCsarAndCopy(INVALID_RAPP_PACKAGE_EMPTY_ASD_FOLDER_NAME, MODELS_TEST_RESOURCES, APPLICATION_TEST_RESOURCES)
234
235         fmt.Println("Generating valid rApp package with new dme info type...")
236         VALID_RAPP_PACKAGE_NEW_INFO_TYPE_FOLDER_NAME := "valid-rapp-package-new-info-type"
237         DME_PRODUCER_FILE := VALID_RAPP_PACKAGE_NEW_INFO_TYPE_FOLDER_NAME + "/Files/Dme/infoproducers/json-file-data-producer.json"
238         cp.Copy(RAPP_BASE_PACKAGE, VALID_RAPP_PACKAGE_NEW_INFO_TYPE_FOLDER_NAME)
239         addJsonElement(DME_PRODUCER_FILE, "new-info-type-not-available", "supported_info_types")
240         createCsarAndCopy(VALID_RAPP_PACKAGE_NEW_INFO_TYPE_FOLDER_NAME, DME_TEST_RESOURCES)
241
242 }