tools/teamcity-generator/main.go (115 lines of code) (raw):
package main
import (
"flag"
"fmt"
"log"
"os"
"strings"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
var GA_VERSION = "ga"
var BETA_VERSION = "beta"
var oPath = flag.String("output", "", "path to output generated files to")
var ver = flag.String("version", "", "version name, value must be `ga` or `beta`")
func main() {
var version string
var outputPath string
flag.Parse()
outputPath = *oPath
version = *ver
if outputPath == "" {
log.Fatalf("missing output flag: provide `--output <path>` to set the path to output generated files to")
}
if version == "" {
log.Fatalf("missing version flag: provide `--version <ga|beta>` to set the path to output generated files to")
}
if version != GA_VERSION && version != BETA_VERSION {
log.Fatalf("invalid version flag value: value must be `%s` or `%s`", GA_VERSION, BETA_VERSION)
}
var terraformResourceDirectory string
switch version {
case GA_VERSION:
terraformResourceDirectory = "google"
case BETA_VERSION:
terraformResourceDirectory = "google-beta"
default:
log.Fatalf("invalid version flag value: value must be `%s` or `%s`", GA_VERSION, BETA_VERSION)
}
log.Printf("Generating TeamCity configuration service package map for `%s` provider", terraformResourceDirectory)
// Get a list of the service packages found in a given directory
servicesDir := fmt.Sprintf("%s/%s/services", outputPath, terraformResourceDirectory)
serviceList, err := readAllServicePackages(servicesDir)
if err != nil {
log.Fatalf("error determining service package list: %s", err)
}
// Create a string of the map that should be created in .teamcity/components/generated/services.kt
relativeServicesDir := fmt.Sprintf("./%s/services", terraformResourceDirectory)
serviceMap, err := createMap(serviceList, relativeServicesDir)
if err != nil {
log.Fatalf("error creating service package map: %s", err)
}
// Ensure .teamcity/components/generated/services.kt exists, create if not present
// "Create creates or truncates the named file. If the file already exists, it is truncated."
servicesKtFilePath := fmt.Sprintf("%s/.teamcity/components/generated/services.kt", outputPath)
log.Printf("Opening %s", servicesKtFilePath)
f, err := os.Create(servicesKtFilePath)
if err != nil {
log.Fatalf("error creating or truncating existing file `.teamcity/components/generated/services.kt` in output directory: %s", err)
}
defer f.Close()
// Save map to .teamcity/components/generated/services.kt
log.Printf("Saving service map to %s", servicesKtFilePath)
_, err = f.Write([]byte(serviceMap))
if err != nil {
log.Fatalf("error writing to file `.teamcity/components/generated/services.kt` in output directory: %s", err)
}
log.Println("Finished")
}
func readAllServicePackages(providerDir string) ([]string, error) {
packages, err := os.ReadDir(providerDir)
if err != nil {
return nil, err
}
var services = make([]string, 0)
for _, p := range packages {
if p.IsDir() {
services = append(services, p.Name())
}
}
if len(services) == 0 {
return nil, fmt.Errorf("found 0 service packages in %s", providerDir)
}
return services, nil
}
func createMap(packageNames []string, servicesDir string) (string, error) {
entryTemplate := ` "%s" to mapOf(
"name" to "%s",
"displayName" to "%s",
"path" to "%s"
),
`
lastEntryTemplate := ` "%s" to mapOf(
"name" to "%s",
"displayName" to "%s",
"path" to "%s"
)` // No trailing comma
caser := cases.Title(language.English)
var b strings.Builder
// Add copyright header
b.WriteString("/*\n")
b.WriteString(" * Copyright (c) HashiCorp, Inc.\n")
b.WriteString(" * SPDX-License-Identifier: MPL-2.0\n")
b.WriteString(" */\n\n")
// Add autogen notice
b.WriteString("// this file is auto-generated by magic-modules/tools/teamcity-generator, any changes made here will be overwritten\n\n")
// Add the map
b.WriteString("var services = mapOf(\n")
for i, p := range packageNames {
path := fmt.Sprintf("%s/%s", servicesDir, p)
var e string
if i < (len(packageNames) - 1) {
e = fmt.Sprintf(entryTemplate, p, p, caser.String(p), path)
} else {
// Final entry in map doesn't have comma
e = fmt.Sprintf(lastEntryTemplate, p, p, caser.String(p), path)
}
_, err := fmt.Fprint(&b, e)
if err != nil {
return "", err
}
}
b.WriteString("\n)\n")
return b.String(), nil
}