// - // ========================LICENSE_START================================= // O-RAN-SC // %% // Copyright (C) 2022: Nordix Foundation // %% // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ========================LICENSE_END=================================== // package main import ( "bufio" "flag" "io/ioutil" "log" "os" "strings" "gopkg.in/yaml.v2" ) var apiDir *string var common = map[interface{}]interface{}{ "openapi": "3.0.0", "info": map[interface{}]interface{}{ "title": "Common", "version": "1.0.0", }, "components": map[interface{}]interface{}{ "schemas": map[interface{}]interface{}{}, }, } func main() { apiDir = flag.String("apidir", "", "Directory containing API definitions to fix") flag.Parse() file, err := os.Open("definitions.txt") if err != nil { log.Fatalf("Error opening file: %v", err) } defer func(file *os.File) { _ = file.Close() }(file) scanner := bufio.NewScanner(file) components := common["components"] cMap := components.(map[interface{}]interface{}) schemas := cMap["schemas"].(map[interface{}]interface{}) for scanner.Scan() { name, data := getDependency(scanner.Text()) if name == "EthFlowDescription" { changeToLocalReference("fDir", "FlowDirection", data) } if name == "ReportingInformation" { changeToLocalReference("notifMethod", "NotificationMethod", data) } if name == "RelativeCartesianLocation" { properties := data["properties"].(map[interface{}]interface{}) delete(properties, true) data["required"] = remove(data["required"].([]interface{}), 1) } schemas[name] = data } if err := scanner.Err(); err != nil { log.Fatal(err) } modCommon, err := yaml.Marshal(common) if err != nil { log.Fatalf("Marshal: #%v ", err) } err = ioutil.WriteFile(*apiDir+"/"+"CommonData.yaml", modCommon, 0644) if err != nil { log.Fatalf("Error writing yamlFile. #%v ", err) } } func changeToLocalReference(attrname, refName string, data map[interface{}]interface{}) { properties := data["properties"].(map[interface{}]interface{}) ref := properties[attrname].(map[interface{}]interface{}) ref["$ref"] = "#/components/schemas/" + refName } func getDependency(s string) (string, map[interface{}]interface{}) { info := strings.Split(s, "#") yamlFile, err := ioutil.ReadFile(*apiDir + "/" + info[0]) if err != nil { log.Fatalf("Error reading yamlFile. #%v ", err) } m := make(map[string]interface{}) err = yaml.Unmarshal(yamlFile, m) if err != nil { log.Fatalf("Unmarshal: %v", err) } components := m["components"] cMap := components.(map[interface{}]interface{}) schemas := cMap["schemas"].(map[interface{}]interface{}) component := strings.Split(info[1], "/") dep := schemas[component[3]].(map[interface{}]interface{}) return component[3], dep } func remove(slice []interface{}, s int) []interface{} { return append(slice[:s], slice[s+1:]...) }