diff --git a/engine/resources/docker_container.go b/engine/resources/docker_container.go index 583770b0..b07f77ca 100644 --- a/engine/resources/docker_container.go +++ b/engine/resources/docker_container.go @@ -400,16 +400,63 @@ func (obj *DockerContainerRes) Cmp(r engine.Res) error { return nil } -// DockerUID is the UID struct for DockerContainerRes. -type DockerUID struct { +// DockerContainerUID is the UID struct for DockerContainerRes. +type DockerContainerUID struct { engine.BaseUID name string } +// DockerContainerResAutoEdges holds the state of the auto edge generator. +type DockerContainerResAutoEdges struct { + UIDs []engine.ResUID + pointer int +} + +// AutoEdges returns edges to any docker:image resource that matches the image +// specified in the docker:container resource definition. +func (obj *DockerContainerRes) AutoEdges() (engine.AutoEdge, error) { + var result []engine.ResUID + var reversed bool + if obj.State != "removed" { + reversed = true + } + result = append(result, &DockerImageUID{ + BaseUID: engine.BaseUID{ + Reversed: &reversed, + }, + image: dockerImageNameTag(obj.Image), + }) + return &DockerContainerResAutoEdges{ + UIDs: result, + pointer: 0, + }, nil +} + +// Next returnes the next automatic edge. +func (obj *DockerContainerResAutoEdges) Next() []engine.ResUID { + if len(obj.UIDs) == 0 { + return nil + } + value := obj.UIDs[obj.pointer] + obj.pointer++ + return []engine.ResUID{value} +} + +// Test gets results of the earlier Next() call, & returns if we should continue. +func (obj *DockerContainerResAutoEdges) Test(input []bool) bool { + if len(obj.UIDs) <= obj.pointer { + return false + } + if len(input) != 1 { // in case we get given bad data + panic(fmt.Sprintf("Expecting a single value!")) + } + return true // keep going +} + // UIDs includes all params to make a unique identification of this object. // Most resources only return one, although some resources can return multiple. func (obj *DockerContainerRes) UIDs() []engine.ResUID { - x := &DockerUID{ + x := &DockerContainerUID{ BaseUID: engine.BaseUID{Name: obj.Name(), Kind: obj.Kind()}, name: obj.Name(), } diff --git a/engine/resources/docker_image.go b/engine/resources/docker_image.go index f52db9e8..8edd2083 100644 --- a/engine/resources/docker_image.go +++ b/engine/resources/docker_image.go @@ -239,11 +239,25 @@ type DockerImageUID struct { func (obj *DockerImageRes) UIDs() []engine.ResUID { x := &DockerImageUID{ BaseUID: engine.BaseUID{Name: obj.Name(), Kind: obj.Kind()}, - name: obj.Name(), + image: dockerImageNameTag(obj.Name()), } return []engine.ResUID{x} } +// AutoEdges returns the AutoEdge interface. +func (obj *DockerImageRes) AutoEdges() (engine.AutoEdge, error) { + return nil, nil +} + +// IFF aka if and only if they are equivalent, return true. If not, false. +func (obj *DockerImageUID) IFF(uid engine.ResUID) bool { + res, ok := uid.(*DockerImageUID) + if !ok { + return false + } + return obj.image == res.image +} + // UnmarshalYAML is the custom unmarshal handler for this struct. // It is primarily useful for setting the defaults. func (obj *DockerImageRes) UnmarshalYAML(unmarshal func(interface{}) error) error { diff --git a/examples/lang/docker0.mcl b/examples/lang/docker0.mcl new file mode 100644 index 00000000..e6bf7ae7 --- /dev/null +++ b/examples/lang/docker0.mcl @@ -0,0 +1,10 @@ +docker:container "mgmt-nginx" { + state => "running", + image => "nginx", + cmd => ["nginx", "-g", "daemon off;",], + ports => {"tcp" => {80 => 8080,},}, +} + +docker:image "nginx" { + state => "exists", +}