3 // ========================LICENSE_START=================================
6 // Copyright (C) 2024 OpenInfra Foundation Europe. All rights reserved.
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
12 // http://www.apache.org/licenses/LICENSE-2.0
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===================================
31 cp "github.com/otiai10/copy"
35 func replaceStringsInDirectory(directory, stringToFind, stringToReplace string) error {
36 files, err := os.ReadDir(directory)
38 for _, file := range files {
39 filePath := filepath.Join(directory, file.Name())
41 if err := replaceStringsInDirectory(filePath, stringToFind, stringToReplace); err != nil {
45 if err := replaceString(filePath, stringToFind, stringToReplace); err != nil {
53 func replaceString(fileLocation, stringToFind, stringToReplace string) error {
54 fileContent, err := os.ReadFile(fileLocation)
56 if !strings.Contains(string(fileContent), stringToFind) {
59 updatedContent := strings.ReplaceAll(string(fileContent), stringToFind, stringToReplace)
60 err = os.WriteFile(fileLocation, []byte(updatedContent), 0644)
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)
70 err = replaceStringsInDirectory(directory, "UPDATE_THIS_CHART_MUSEUM_GET_CHARTS_URI", CHART_MUSEUM_GET_URI)
75 func generateCsarPackage(directory, fileName string) error {
76 csarFile, err := os.Create(fileName)
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 {
85 relPath, err := filepath.Rel(directory, filePath)
87 relPath = strings.ReplaceAll(relPath, "\\", "/")
88 zipFile, err := csarWriter.Create(relPath)
90 fsFile, err := os.Open(filePath)
92 _, err = io.Copy(zipFile, fsFile)
101 func createCsarAndCopy(directory string, paths ...string) error {
102 packageName := directory + ".csar"
103 err := generateCsarPackage(directory, packageName)
105 for _, path := range paths {
106 fmt.Printf("Copying %s to %s \n", packageName, path)
107 copy(packageName, path+packageName)
109 os.Remove(packageName)
110 os.RemoveAll(directory)
114 func copy(srcFile string, targetFile string) {
115 data, err := os.ReadFile(srcFile)
117 err = os.WriteFile(targetFile, data, 0644)
121 func checkError(err error) error {
128 func removeYamlElement(filePath string, elements ...string) error {
129 fileData, err := os.ReadFile(filePath)
131 var yamlContent map[interface{}]interface{}
132 err = yaml.Unmarshal(fileData, &yamlContent)
134 index := len(elements) - 1
135 dataMap := yamlContent
136 for i := 0; i < index; i++ {
137 resultMap, ok := dataMap[elements[i]].(map[interface{}]interface{})
143 delete(dataMap, elements[index])
144 updatedYamlContent, err := yaml.Marshal(&yamlContent)
146 err = os.WriteFile(filePath, updatedYamlContent, 0644)
151 func addJsonElement(filePath string, element string, index string) error {
152 fileData, err := os.ReadFile(filePath)
154 var jsonContent map[string]interface{}
155 err = json.Unmarshal(fileData, &jsonContent)
157 array, ok := jsonContent[index].([]interface{})
161 jsonContent[index] = append(array, element)
162 updatedJsonContent, err := json.Marshal(&jsonContent)
164 err = os.WriteFile(filePath, updatedJsonContent, 0644)
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
180 if err := os.Chdir("../../../" + SAMPLE_RAPP_GENERATOR); err != nil {
181 fmt.Println("Error changing working directory:", err)
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)
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)
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)
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)
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)
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)
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)
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)
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)