First commit.
This commit is contained in:
236
main.go
Normal file
236
main.go
Normal file
@@ -0,0 +1,236 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/go-resty/resty/v2"
|
||||
)
|
||||
|
||||
type CodeFirstContainer struct {
|
||||
ID string `json:"Id"`
|
||||
Image string `json:"Image"`
|
||||
Env []string `json:"Env,omitempty"`
|
||||
Private bool `json:"Private,omitempty"`
|
||||
}
|
||||
|
||||
type StringSliceFlag struct {
|
||||
value []string
|
||||
}
|
||||
|
||||
func (s *StringSliceFlag) String() string {
|
||||
return fmt.Sprintf("%s", *s)
|
||||
}
|
||||
|
||||
func (s *StringSliceFlag) Set(v string) error {
|
||||
s.value = append(s.value, v)
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
authUser string
|
||||
|
||||
command string
|
||||
proxyScheme, proxyHost, proxyPath string
|
||||
imageName, containerName string
|
||||
|
||||
private, overwrite, devel bool
|
||||
|
||||
env StringSliceFlag
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
env = StringSliceFlag{}
|
||||
|
||||
flag.StringVar(&command, "command", "list", "list|logs|create|delete|start")
|
||||
flag.BoolVar(&devel, "devel", false, "use fake x-forwarded-user")
|
||||
|
||||
flag.StringVar(&proxyScheme, "proxyscheme", "http", "proxy scheme")
|
||||
flag.StringVar(&proxyHost, "proxyhost", "dockerproxy:8080", "proxy host")
|
||||
flag.StringVar(&proxyPath, "proxypath", "/", "proxy path")
|
||||
|
||||
flag.StringVar(&imageName, "imagename", "", "image name")
|
||||
flag.StringVar(&containerName, "containername", "", "container name")
|
||||
flag.BoolVar(&private, "private", false, "private container")
|
||||
flag.BoolVar(&overwrite, "overwrite", false, "overwrite existing container")
|
||||
flag.Var(&env, "env", "environment variables (separated by spaces)")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
fmt.Println("flags:")
|
||||
fmt.Printf("-imagename: %s\n", imageName)
|
||||
fmt.Printf("-containername: %s\n", containerName)
|
||||
fmt.Printf("-private: %t\n", private)
|
||||
fmt.Printf("-overwrite: %t\n", overwrite)
|
||||
fmt.Printf("-env: %s\n", env)
|
||||
|
||||
if command != "list" && containerName == "" {
|
||||
fmt.Println("Missing containername parameter.")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if command == "create" && imageName == "" {
|
||||
fmt.Println("Missing imagename parameter.")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if devel {
|
||||
authUser = "thbellem"
|
||||
} else {
|
||||
authUser = os.Getenv("CI_COMMIT_AUTHOR")
|
||||
}
|
||||
|
||||
if len(authUser) == 0 {
|
||||
fmt.Println("Not authenticated.")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
switch command {
|
||||
case "list":
|
||||
list()
|
||||
case "logs":
|
||||
logs()
|
||||
case "create":
|
||||
if overwrite {
|
||||
delete(true)
|
||||
}
|
||||
|
||||
if !exist() {
|
||||
create()
|
||||
start()
|
||||
}
|
||||
case "start":
|
||||
start()
|
||||
case "delete":
|
||||
delete(false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func exist() bool {
|
||||
client := resty.New()
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
Get(fmt.Sprintf("%s://%s/containers/%s/json", proxyScheme, proxyHost, containerName))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
return resp.IsSuccess()
|
||||
}
|
||||
|
||||
func list() {
|
||||
client := resty.New()
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
Get(fmt.Sprintf("%s://%s/containers/json", proxyScheme, proxyHost))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
if resp.IsError() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func logs() {
|
||||
client := resty.New()
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
Get(fmt.Sprintf("%s://%s/containers/%s/logs", proxyScheme, proxyHost, containerName))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
if resp.IsError() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func start() {
|
||||
client := resty.New()
|
||||
|
||||
container := CodeFirstContainer{
|
||||
Image: imageName,
|
||||
Env: env.value,
|
||||
Private: private,
|
||||
}
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
SetBody(container).
|
||||
Post(fmt.Sprintf("%s://%s/containers/%s/start", proxyScheme, proxyHost, containerName))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
if resp.IsError() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func create() {
|
||||
client := resty.New()
|
||||
|
||||
container := CodeFirstContainer{
|
||||
Image: imageName,
|
||||
Env: env.value,
|
||||
Private: private,
|
||||
}
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
SetBody(container).
|
||||
Post(fmt.Sprintf("%s://%s/containers/create/%s", proxyScheme, proxyHost, containerName))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
if resp.IsError() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func delete(bypassError bool) {
|
||||
client := resty.New()
|
||||
|
||||
resp, err := client.R().
|
||||
SetHeader("x-forwarded-user", authUser).
|
||||
Delete(fmt.Sprintf("%s://%s/containers/%s", proxyScheme, proxyHost, containerName))
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(string(resp.Body()))
|
||||
|
||||
if !bypassError && resp.IsError() {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user