| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you 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. | |
| package config | |
| import ( | |
| "bufio" | |
| "fmt" | |
| "net/url" | |
| "os" | |
| "strings" | |
| log "github.com/sirupsen/logrus" | |
| ) | |
| type Profile struct { | |
| Name string | |
| ApiKey string | |
| SecretKey string | |
| Expires int `default:"600"` | |
| SignatureVersion int `default:"3"` | |
| } | |
| var URL = "http://localhost:8080/client/api/" | |
| var Iterations = 1 | |
| var Page = 0 | |
| var PageSize = 0 | |
| var Host = "" | |
| var ZoneId = "" | |
| var NetworkOfferingId = "" | |
| var ServiceOfferingId = "" | |
| var DiskOfferingId = "" | |
| var TemplateId = "" | |
| var ParentDomainId = "" | |
| var NumDomains = 0 | |
| var NumNetworks = 0 | |
| var Subnet = "10.0.0.0" | |
| var Submask = 22 | |
| var VlanStart = 80 | |
| var VlanEnd = 1000 | |
| var StartVM = true | |
| var NumVms = 1 | |
| var NumVolumes = 1 | |
| func ReadProfiles(filePath string) (map[int]*Profile, error) { | |
| file, err := os.Open(filePath) | |
| if err != nil { | |
| return nil, fmt.Errorf("error opening file: %w", err) | |
| } | |
| defer file.Close() | |
| scanner := bufio.NewScanner(file) | |
| profiles := make(map[int]*Profile) | |
| var currentProfile string | |
| i := 0 | |
| for scanner.Scan() { | |
| line := scanner.Text() | |
| line = strings.TrimSpace(line) | |
| if line == "" || strings.HasPrefix(line, ";") { | |
| continue | |
| } | |
| if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { | |
| currentProfile = line[1 : len(line)-1] | |
| i++ | |
| profiles[i] = &Profile{} | |
| profiles[i].Name = currentProfile | |
| } else { | |
| // Parse key-value pairs within the profile | |
| parts := strings.SplitN(line, "=", 2) | |
| if len(parts) == 2 { | |
| key := strings.TrimSpace(parts[0]) | |
| value := strings.TrimSpace(parts[1]) | |
| switch strings.ToLower(key) { | |
| case "apikey": | |
| profiles[i].ApiKey = value | |
| case "secretkey": | |
| profiles[i].SecretKey = value | |
| case "url": | |
| URL = value | |
| case "iterations": | |
| var iterations int | |
| _, err := fmt.Sscanf(value, "%d", &iterations) | |
| if err == nil { | |
| Iterations = iterations | |
| } | |
| case "page": | |
| var page int | |
| _, err := fmt.Sscanf(value, "%d", &page) | |
| if err == nil { | |
| Page = page | |
| } | |
| case "pagesize": | |
| var pagesize int | |
| _, err := fmt.Sscanf(value, "%d", &pagesize) | |
| if err == nil { | |
| PageSize = pagesize | |
| } | |
| case "expires": | |
| var expires int | |
| _, err := fmt.Sscanf(value, "%d", &expires) | |
| if err == nil { | |
| profiles[i].Expires = expires | |
| } | |
| case "signatureversion": | |
| var signatureVersion int | |
| _, err := fmt.Sscanf(value, "%d", &signatureVersion) | |
| if err == nil { | |
| profiles[i].SignatureVersion = signatureVersion | |
| } | |
| case "zoneid": | |
| ZoneId = value | |
| case "networkofferingid": | |
| NetworkOfferingId = value | |
| case "serviceofferingid": | |
| ServiceOfferingId = value | |
| case "diskofferingid": | |
| DiskOfferingId = value | |
| case "templateid": | |
| TemplateId = value | |
| case "parentdomainid": | |
| ParentDomainId = value | |
| case "numdomains": | |
| var numDomains int | |
| _, err := fmt.Sscanf(value, "%d", &numDomains) | |
| if err == nil { | |
| NumDomains = numDomains | |
| } | |
| case "numnetworks": | |
| var numNetworks int | |
| _, err := fmt.Sscanf(value, "%d", &numNetworks) | |
| if err == nil { | |
| NumNetworks = numNetworks | |
| } | |
| case "subnet": | |
| var subnet string | |
| _, err := fmt.Sscanf(value, "%s", &subnet) | |
| if err == nil { | |
| Subnet = subnet | |
| } | |
| case "submask": | |
| var submask int | |
| _, err := fmt.Sscanf(value, "%d", &submask) | |
| if err == nil { | |
| Submask = submask | |
| } | |
| case "vlanrange": | |
| var vlanStart, vlanEnd int | |
| _, err := fmt.Sscanf(value, "%d-%d", &vlanStart, &vlanEnd) | |
| if err == nil { | |
| VlanStart = vlanStart | |
| VlanEnd = vlanEnd | |
| } | |
| case "numvms": | |
| var numVms int | |
| _, err := fmt.Sscanf(value, "%d", &numVms) | |
| if err == nil { | |
| NumVms = numVms | |
| } | |
| case "startvm": | |
| var startvm bool | |
| _, err := fmt.Sscanf(value, "%t", &startvm) | |
| if err == nil { | |
| StartVM = startvm | |
| } | |
| case "numvolumes": | |
| var numVolumes int | |
| _, err := fmt.Sscanf(value, "%d", &numVolumes) | |
| if err == nil { | |
| NumVolumes = numVolumes | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if err := scanner.Err(); err != nil { | |
| return nil, fmt.Errorf("error scanning file: %w", err) | |
| } | |
| if len(profiles) == 0 { | |
| fmt.Println("No roles are defined in the configuration file") | |
| return nil, fmt.Errorf("no roles are defined in the configuration file: %w", err) | |
| } | |
| if URL == "" { | |
| log.Fatalln("URL not found in the configuration, please verify") | |
| } | |
| parsedURL, err := url.Parse(URL) | |
| if err != nil { | |
| log.Errorf("Error parsing URL : %s with error : %s", URL, err) | |
| return nil, fmt.Errorf("error parsing url : %s with error : %s", URL, err) | |
| } | |
| Host = parsedURL.Hostname() | |
| validateConfig(profiles) | |
| return profiles, nil | |
| } | |
| func validateConfig(profiles map[int]*Profile) bool { | |
| result := true | |
| for i, profile := range profiles { | |
| if profile.ApiKey == "" || profile.SecretKey == "" { | |
| message := "Please check ApiKey, SecretKey of the profile. They should not be empty" | |
| fmt.Printf("Skipping profile [%s] : %s\n", profile.Name, message) | |
| delete(profiles, i) | |
| result = false | |
| } | |
| } | |
| return result | |
| } |