func readScriptYaml()

in experiments/conductor/cmd/runner/mock_commands.go [178:300]


func readScriptYaml(opts *RunnerOptions, branch Branch) {
	ctx := context.TODO()

	close := setLoggingWriter(opts, branch)
	defer close()
	if branch.Command == "" {
		log.Printf("SKIPPING %s, no gcloud command", branch.Name)
		return
	}

	workDir := filepath.Join(opts.branchRepoDir, "mockgcp")
	checkoutBranch(ctx, branch, workDir)

	// Check to see if the script file already exists
	scriptFile := fmt.Sprintf("mock%s/testdata/%s/crud/script.yaml", branch.Group, branch.Resource)
	scriptFullPath := filepath.Join(opts.branchRepoDir, "mockgcp", scriptFile)
	if _, err := os.Stat(scriptFullPath); errors.Is(err, os.ErrNotExist) {
		log.Printf("SKIPPING %s, %s doesn't exists", branch.Name, scriptFullPath)
		return
	}

	// Read and parse the script file
	data, err := os.ReadFile(scriptFullPath)
	if err != nil {
		log.Printf("Error reading file %s: %v", scriptFullPath, err)
		return
	}

	// Parse YAML content
	var scriptContent []map[string]string
	err = yaml.Unmarshal(data, &scriptContent)
	if err != nil {
		log.Printf("Error parsing YAML from %s: %v", scriptFullPath, err)
		return
	}

	// Check commands and collect warnings
	var warnings []string
	hasCreate := false
	hasDelete := false
	hasList := false

	for _, line := range scriptContent {
		if cmd, ok := line["exec"]; ok && strings.Contains(cmd, "gcloud") {
			if strings.Contains(cmd, " create ") {
				hasCreate = true
			}
			if strings.Contains(cmd, " delete ") {
				hasDelete = true
			}
			if strings.Contains(cmd, " list") {
				hasList = true
			}
		}
	}

	if !hasCreate {
		warning := "No Create found"
		warnings = append(warnings, warning)
		log.Printf("WARNING: %s in %s", warning, scriptFile)
	}
	if !hasDelete {
		warning := "No Delete found"
		warnings = append(warnings, warning)
		log.Printf("WARNING: %s in %s", warning, scriptFile)
	}
	if hasList {
		warning := "List found"
		warnings = append(warnings, warning)
		log.Printf("WARNING: %s in %s", warning, scriptFile)
	}

	// Read existing all_scripts.yaml or create new ScriptData
	allScriptsPath := filepath.Join(opts.loggingDir, "all_scripts.yaml")
	var scriptData ScriptData

	if data, err := os.ReadFile(allScriptsPath); err == nil {
		err = yaml.Unmarshal(data, &scriptData)
		if err != nil {
			log.Printf("Error parsing existing all_scripts.yaml: %v", err)
			return
		}
	}

	// Find and update existing branch or add new one
	newBranchScript := BranchScript{
		Name:        branch.Name,
		LocalBranch: branch.Local,
		Content:     scriptContent,
		Warnings:    warnings,
	}

	found := false
	for i, bs := range scriptData.Branches {
		if bs.Name == branch.Name {
			scriptData.Branches[i] = newBranchScript
			found = true
			break
		}
	}
	if !found {
		scriptData.Branches = append(scriptData.Branches, newBranchScript)
	}

	// Write updated data back to all_scripts.yaml
	yamlData, err := yaml.Marshal(scriptData)
	if err != nil {
		log.Printf("Error marshaling script data: %v", err)
		return
	}

	err = os.MkdirAll(opts.loggingDir, 0755)
	if err != nil {
		log.Printf("Error creating logs directory: %v", err)
		return
	}

	err = os.WriteFile(allScriptsPath, yamlData, 0644)
	if err != nil {
		log.Printf("Error writing all_scripts.yaml: %v", err)
		return
	}
}