| ... | ... |
@@ -5,6 +5,7 @@ import ( |
| 5 | 5 |
"os" |
| 6 | 6 |
"log" |
| 7 | 7 |
"runtime" |
| 8 |
+ "strings" |
|
| 8 | 9 |
"github.com/dotcloud/docker/utils" |
| 9 | 10 |
) |
| 10 | 11 |
|
| ... | ... |
@@ -33,6 +34,11 @@ type Engine struct {
|
| 33 | 33 |
root string |
| 34 | 34 |
handlers map[string]Handler |
| 35 | 35 |
hack Hack // data for temporary hackery (see hack.go) |
| 36 |
+ id string |
|
| 37 |
+} |
|
| 38 |
+ |
|
| 39 |
+func (eng *Engine) Root() string {
|
|
| 40 |
+ return eng.root |
|
| 36 | 41 |
} |
| 37 | 42 |
|
| 38 | 43 |
func (eng *Engine) Register(name string, handler Handler) error {
|
| ... | ... |
@@ -84,6 +90,10 @@ func New(root string) (*Engine, error) {
|
| 84 | 84 |
return eng, nil |
| 85 | 85 |
} |
| 86 | 86 |
|
| 87 |
+func (eng *Engine) String() string {
|
|
| 88 |
+ return fmt.Sprintf("%s|%s", eng.Root(), eng.id[:8])
|
|
| 89 |
+} |
|
| 90 |
+ |
|
| 87 | 91 |
// Job creates a new job which can later be executed. |
| 88 | 92 |
// This function mimics `Command` from the standard os/exec package. |
| 89 | 93 |
func (eng *Engine) Job(name string, args ...string) *Job {
|
| ... | ... |
@@ -102,3 +112,8 @@ func (eng *Engine) Job(name string, args ...string) *Job {
|
| 102 | 102 |
return job |
| 103 | 103 |
} |
| 104 | 104 |
|
| 105 |
+ |
|
| 106 |
+func (eng *Engine) Logf(format string, args ...interface{}) (n int, err error) {
|
|
| 107 |
+ prefixedFormat := fmt.Sprintf("[%s] %s\n", eng, strings.TrimRight(format, "\n"))
|
|
| 108 |
+ return fmt.Printf(prefixedFormat, args...) |
|
| 109 |
+} |
| ... | ... |
@@ -6,7 +6,6 @@ import ( |
| 6 | 6 |
"strings" |
| 7 | 7 |
"fmt" |
| 8 | 8 |
"encoding/json" |
| 9 |
- "github.com/dotcloud/docker/utils" |
|
| 10 | 9 |
) |
| 11 | 10 |
|
| 12 | 11 |
// A job is the fundamental unit of work in the docker engine. |
| ... | ... |
@@ -38,9 +37,10 @@ type Job struct {
|
| 38 | 38 |
// If the job returns a failure status, an error is returned |
| 39 | 39 |
// which includes the status. |
| 40 | 40 |
func (job *Job) Run() error {
|
| 41 |
- randId := utils.RandomString()[:4] |
|
| 42 |
- fmt.Printf("Job #%s: %s\n", randId, job)
|
|
| 43 |
- defer fmt.Printf("Job #%s: %s = '%s'", randId, job, job.status)
|
|
| 41 |
+ job.Logf("{")
|
|
| 42 |
+ defer func() {
|
|
| 43 |
+ job.Logf("}")
|
|
| 44 |
+ }() |
|
| 44 | 45 |
if job.handler == nil {
|
| 45 | 46 |
job.status = "command not found" |
| 46 | 47 |
} else {
|
| ... | ... |
@@ -54,7 +54,20 @@ func (job *Job) Run() error {
|
| 54 | 54 |
|
| 55 | 55 |
// String returns a human-readable description of `job` |
| 56 | 56 |
func (job *Job) String() string {
|
| 57 |
- return strings.Join(append([]string{job.Name}, job.Args...), " ")
|
|
| 57 |
+ s := fmt.Sprintf("%s.%s(%s)", job.Eng, job.Name, strings.Join(job.Args, ", "))
|
|
| 58 |
+ // FIXME: if a job returns the empty string, it will be printed |
|
| 59 |
+ // as not having returned. |
|
| 60 |
+ // (this only affects String which is a convenience function). |
|
| 61 |
+ if job.status != "" {
|
|
| 62 |
+ var okerr string |
|
| 63 |
+ if job.status == "0" {
|
|
| 64 |
+ okerr = "OK" |
|
| 65 |
+ } else {
|
|
| 66 |
+ okerr = "ERR" |
|
| 67 |
+ } |
|
| 68 |
+ s = fmt.Sprintf("%s = %s (%s)", s, okerr, job.status)
|
|
| 69 |
+ } |
|
| 70 |
+ return s |
|
| 58 | 71 |
} |
| 59 | 72 |
|
| 60 | 73 |
func (job *Job) Getenv(key string) (value string) {
|
| ... | ... |
@@ -169,3 +182,8 @@ func (job *Job) Environ() map[string]string {
|
| 169 | 169 |
} |
| 170 | 170 |
return m |
| 171 | 171 |
} |
| 172 |
+ |
|
| 173 |
+func (job *Job) Logf(format string, args ...interface{}) (n int, err error) {
|
|
| 174 |
+ prefixedFormat := fmt.Sprintf("[%s] %s\n", job, strings.TrimRight(format, "\n"))
|
|
| 175 |
+ return fmt.Fprintf(job.Stdout, prefixedFormat, args...) |
|
| 176 |
+} |