woodpecker/yaml/transform/pod.go
2016-08-25 11:35:28 -07:00

94 lines
2.3 KiB
Go

package transform
import (
"encoding/base64"
"fmt"
"github.com/drone/drone/yaml"
"github.com/gorilla/securecookie"
)
type ambassador struct {
image string
entrypoint []string
command []string
}
// default linux amd64 ambassador
var defaultAmbassador = ambassador{
image: "busybox:latest",
entrypoint: []string{"/bin/sleep"},
command: []string{"86400"},
}
// lookup ambassador configuration by architecture and os
var lookupAmbassador = map[string]ambassador{
"linux/amd64": {
image: "busybox:latest",
entrypoint: []string{"/bin/sleep"},
command: []string{"86400"},
},
"linux/arm": {
image: "armhf/alpine:latest",
entrypoint: []string{"/bin/sleep"},
command: []string{"86400"},
},
}
// Pod transforms the containers in the Yaml to use Pod networking, where every
// container shares the localhost connection.
func Pod(c *yaml.Config, platform string) error {
rand := base64.RawURLEncoding.EncodeToString(
securecookie.GenerateRandomKey(8),
)
// choose the ambassador configuration based on os and architecture
conf, ok := lookupAmbassador[platform]
if !ok {
conf = defaultAmbassador
}
ambassador := &yaml.Container{
ID: fmt.Sprintf("drone_ambassador_%s", rand),
Name: "ambassador",
Image: conf.image,
Detached: true,
Entrypoint: conf.entrypoint,
Command: conf.command,
Volumes: []string{c.Workspace.Path, c.Workspace.Base},
Environment: map[string]string{},
}
network := fmt.Sprintf("container:%s", ambassador.ID)
var containers []*yaml.Container
containers = append(containers, c.Pipeline...)
containers = append(containers, c.Services...)
for _, container := range containers {
container.VolumesFrom = append(container.VolumesFrom, ambassador.ID)
if container.Network == "" {
container.Network = network
}
}
c.Services = append([]*yaml.Container{ambassador}, c.Services...)
return nil
}
// func (v *podOp) VisitContainer(node *parse.ContainerNode) error {
// if node.Container.Network == "" {
// parent := fmt.Sprintf("container:%s", v.name)
// node.Container.Network = parent
// }
// node.Container.VolumesFrom = append(node.Container.VolumesFrom, v.name)
// return nil
// }
//
// func (v *podOp) VisitRoot(node *parse.RootNode) error {
//
//
// node.Pod = service
// return nil
// }