initial PoC for out binary
This commit is contained in:
		
							
								
								
									
										3
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					module github.com/cioplenu/concourse-nomad-resource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.14
 | 
				
			||||||
							
								
								
									
										93
									
								
								out/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								out/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"text/template"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SourceConfig struct {
 | 
				
			||||||
 | 
						URL   string `json:"url"`
 | 
				
			||||||
 | 
						Name  string `json:"name"`
 | 
				
			||||||
 | 
						Token string `json:"token"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ParamsConfig struct {
 | 
				
			||||||
 | 
						JobPath  string            `json:"job_path"`
 | 
				
			||||||
 | 
						Vars     map[string]string `json:"vars"`
 | 
				
			||||||
 | 
						VarFiles map[string]string `json:"var_files"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type OutConfig struct {
 | 
				
			||||||
 | 
						Source SourceConfig `json:"source"`
 | 
				
			||||||
 | 
						Params ParamsConfig `json:"params"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func check(err error, msg string) {
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Fprintf(os.Stderr, msg+": %s\n", err)
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						if len(os.Args) < 2 {
 | 
				
			||||||
 | 
							fmt.Fprintf(os.Stderr, "usage: %s <sources directory>\n", os.Args[0])
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sourceDir := os.Args[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var config OutConfig
 | 
				
			||||||
 | 
						err := json.NewDecoder(os.Stdin).Decode(&config)
 | 
				
			||||||
 | 
						check(err, "Error parsing configuration")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						templPath := filepath.Join(sourceDir, config.Params.JobPath)
 | 
				
			||||||
 | 
						templFile, err := ioutil.ReadFile(templPath)
 | 
				
			||||||
 | 
						check(err, "Could not read input file "+templPath)
 | 
				
			||||||
 | 
						tmpl, err := template.New("job").Parse(string(templFile))
 | 
				
			||||||
 | 
						check(err, "Error parsing template")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for name, path := range config.Params.VarFiles {
 | 
				
			||||||
 | 
							varPath := filepath.Join(sourceDir, path)
 | 
				
			||||||
 | 
							varFile, err := ioutil.ReadFile(varPath)
 | 
				
			||||||
 | 
							check(err, "Error reading var file")
 | 
				
			||||||
 | 
							config.Params.Vars[name] = strings.TrimSpace(string(varFile))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf := new(bytes.Buffer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = tmpl.Execute(buf, config.Params.Vars)
 | 
				
			||||||
 | 
						check(err, "Error executing template")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						outFile, err := os.Create(templPath)
 | 
				
			||||||
 | 
						check(err, "Error creating output file")
 | 
				
			||||||
 | 
						defer outFile.Close()
 | 
				
			||||||
 | 
						_, err = outFile.Write(buf.Bytes())
 | 
				
			||||||
 | 
						check(err, "Error writing output file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd := exec.Command(
 | 
				
			||||||
 | 
							"nomad",
 | 
				
			||||||
 | 
							"job",
 | 
				
			||||||
 | 
							"run",
 | 
				
			||||||
 | 
							"-address="+config.Source.URL,
 | 
				
			||||||
 | 
							"-token="+config.Source.Token,
 | 
				
			||||||
 | 
							templPath,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						var out bytes.Buffer
 | 
				
			||||||
 | 
						cmd.Stdout = &out
 | 
				
			||||||
 | 
						cmd.Stderr = &out
 | 
				
			||||||
 | 
						err = cmd.Run()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Fprintf(os.Stderr, "Error executing nomad: %s\n", err)
 | 
				
			||||||
 | 
							fmt.Fprint(os.Stderr, out.String())
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Println(out.String())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user