cmd/alzlibtool/command/generate/architecture.go (62 lines of code) (raw):
package generate
import (
"encoding/json"
"os"
"github.com/Azure/alzlib"
"github.com/Azure/alzlib/deployment"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armpolicy"
"github.com/spf13/cobra"
)
var generateArchitectureBaseCmd = cobra.Command{
Use: "architecture librarypath name",
Short: "Generates deployment JSON for the supplied architecture.",
Long: `Generates deployment JSON for the supplied architecture. This enables deployment with a tool of your choosing.`,
Args: cobra.ExactArgs(2),
Run: func(cmd *cobra.Command, args []string) {
thislib := alzlib.NewCustomLibraryReference(args[0])
alllibs, err := thislib.FetchWithDependencies(cmd.Context())
if err != nil {
cmd.PrintErrf("%s could not fetch all libraries with dependencies: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
az := alzlib.NewAlzLib(nil)
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
cmd.PrintErrf("%s could not get Azure credential: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
cf, err := armpolicy.NewClientFactory("", cred, nil)
if err != nil {
cmd.PrintErrf("%s could not add client to alzlib: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
az.AddPolicyClient(cf)
if err := az.Init(cmd.Context(), alllibs...); err != nil {
cmd.PrintErrf("%s could not initialize alzlib: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
h := deployment.NewHierarchy(az)
rootMg, _ := cmd.Flags().GetString("rootmg")
location, _ := cmd.Flags().GetString("location")
if err := h.FromArchitecture(cmd.Context(), args[1], rootMg, location); err != nil {
cmd.PrintErrf("%s could not generate architecture: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
output := make([]*deployment.HierarchyManagementGroup, len(h.ManagementGroupNames()))
for i, mgName := range h.ManagementGroupNames() {
output[i] = h.ManagementGroup(mgName)
}
outputBytes, err := json.Marshal(output)
if err != nil {
cmd.PrintErrf("%s could not marshal output: %v\n", cmd.ErrPrefix(), err)
os.Exit(1)
}
cmd.SetOut(os.Stdout)
cmd.Println(string(outputBytes))
},
}
func init() {
generateArchitectureBaseCmd.Flags().StringP("rootmg", "r", "00000000-0000-0000-0000-000000000000", "The root management group id to use for the deployment.")
generateArchitectureBaseCmd.Flags().StringP("location", "l", "northeurope", "The location to use for the deployment.")
}