cmd/ie/commands/interactive.go (85 lines of code) (raw):
package commands
import (
"fmt"
"os"
"strings"
"github.com/Azure/InnovationEngine/internal/engine"
"github.com/Azure/InnovationEngine/internal/engine/common"
"github.com/Azure/InnovationEngine/internal/logging"
"github.com/spf13/cobra"
)
// Register the command with our command runner.
func init() {
rootCommand.AddCommand(interactiveCommand)
// String flags
interactiveCommand.PersistentFlags().
String("correlation-id", "", "Adds a correlation ID to the user agent used by a scenarios azure-cli commands.")
interactiveCommand.PersistentFlags().
String("subscription", "", "Sets the subscription ID used by a scenarios azure-cli commands. Will rely on the default subscription if not set.")
interactiveCommand.PersistentFlags().
String("working-directory", ".", "Sets the working directory for innovation engine to operate out of. Restores the current working directory when finished.")
// StringArray flags
interactiveCommand.PersistentFlags().
StringArray("var", []string{}, "Sets an environment variable for the scenario. Format: --var <key>=<value>")
}
var interactiveCommand = &cobra.Command{
Use: "interactive",
Short: "Execute a document in interactive mode.",
Run: func(cmd *cobra.Command, args []string) {
markdownFile := args[0]
if markdownFile == "" {
logging.GlobalLogger.Errorf("Error: No markdown file specified.")
cmd.Help()
os.Exit(1)
}
verbose, _ := cmd.Flags().GetBool("verbose")
doNotDelete, _ := cmd.Flags().GetBool("do-not-delete")
subscription, _ := cmd.Flags().GetString("subscription")
correlationId, _ := cmd.Flags().GetString("correlation-id")
environment, _ := cmd.Flags().GetString("environment")
workingDirectory, _ := cmd.Flags().GetString("working-directory")
environmentVariables, _ := cmd.Flags().GetStringArray("var")
// features, _ := cmd.Flags().GetStringArray("feature")
// Known features
renderValues := false
// Parse the environment variables from the command line into a map
cliEnvironmentVariables := make(map[string]string)
for _, environmentVariable := range environmentVariables {
keyValuePair := strings.SplitN(environmentVariable, "=", 2)
if len(keyValuePair) != 2 {
logging.GlobalLogger.Errorf(
"Error: Invalid environment variable format: %s",
environmentVariable,
)
fmt.Printf("Error: Invalid environment variable format: %s", environmentVariable)
cmd.Help()
os.Exit(1)
}
cliEnvironmentVariables[keyValuePair[0]] = keyValuePair[1]
}
// Parse the markdown file and create a scenario
scenario, err := common.CreateScenarioFromMarkdown(
markdownFile,
[]string{"bash", "azurecli", "azurecli-interactive", "terraform"},
cliEnvironmentVariables,
)
if err != nil {
logging.GlobalLogger.Errorf("Error creating scenario: %s", err)
fmt.Printf("Error creating scenario: %s", err)
os.Exit(1)
}
innovationEngine, err := engine.NewEngine(engine.EngineConfiguration{
Verbose: verbose,
DoNotDelete: doNotDelete,
Subscription: subscription,
CorrelationId: correlationId,
Environment: environment,
WorkingDirectory: workingDirectory,
RenderValues: renderValues,
})
if err != nil {
logging.GlobalLogger.Errorf("Error creating engine: %s", err)
fmt.Printf("Error creating engine: %s", err)
os.Exit(1)
}
// Execute the scenario
err = innovationEngine.InteractWithScenario(scenario)
if err != nil {
logging.GlobalLogger.Errorf("Error executing scenario: %s", err)
fmt.Printf("Error executing scenario: %s", err)
os.Exit(1)
}
},
}