diff --git a/engine/queue.go b/engine/queue.go index 5fbc37e..f7d0075 100644 --- a/engine/queue.go +++ b/engine/queue.go @@ -3,7 +3,10 @@ package engine import ( "crypto/sha256" "fmt" + "log" "strings" + + "github.com/nemunaire/minifaas/jobs" ) const CTR_NAME_PREFIX = "minifaas" @@ -13,7 +16,7 @@ func GenContainerPrefix(jobtype string) string { } func ParseContainerName(name string) (jobtype, id string, err error) { - if !strings.HasPrefix(name, "/"+CTR_NAME_PREFIX+"-") { + if !strings.HasPrefix(strings.TrimPrefix(name, "/"), CTR_NAME_PREFIX+"-") { return "", "", fmt.Errorf("This is not a %s job: starting with %q", CTR_NAME_PREFIX, name) } @@ -22,7 +25,14 @@ func ParseContainerName(name string) (jobtype, id string, err error) { return "", "", fmt.Errorf("This is not a %s job: %q didn't has at least 3 args", CTR_NAME_PREFIX, name) } - return tmp[1], strings.Join(tmp[2:], "-"), nil + jobtype = jobs.GetJobType(tmp[1]) + if jobtype == "" { + return "", "", fmt.Errorf("This is not a %s job: unknown job type %q", CTR_NAME_PREFIX, tmp[1]) + } + + id = strings.Join(tmp[2:], "-") + + return } func FilterRunningContainers(jobtype string, ctrs map[string]string) (ret []string) { @@ -40,7 +50,10 @@ func FilterRunningContainers(jobtype string, ctrs map[string]string) (ret []stri func CountRunningContainers(jobtype string, ctrs map[string]string) (n int) { prefix := GenContainerPrefix(jobtype) + log.Println(ctrs) + for cname, _ := range ctrs { + log.Println(strings.TrimPrefix(cname, "/"), prefix) if jobtype == "" || strings.HasPrefix(strings.TrimPrefix(cname, "/"), prefix) { n += 1 } diff --git a/jobs.go b/jobs.go index e9d9066..2738e2c 100644 --- a/jobs.go +++ b/jobs.go @@ -4,25 +4,14 @@ import ( "github.com/docker/docker/api/types/mount" "github.com/nemunaire/minifaas/engine/docker" + "github.com/nemunaire/minifaas/jobs" ) -type Job struct { - Image string - Cmd []string - DataMount bool -} - -var jobs = map[string]Job{ - "counter": { - Image: "alpine", - Cmd: []string{"sh", "-c", "touch /data/work_done; for i in `seq 10`; do echo $i; sleep 0.5; done"}, - DataMount: true, - }, -} - func RunJob(jobtype string) (string, error) { + job := jobs.GetJob(jobtype) + var mnts []mount.Mount - if jobs[jobtype].DataMount { + if job.DataMount { myVolume, err := docker.CreateVolumeDir("/data", false) if err != nil { return "", err @@ -31,12 +20,12 @@ func RunJob(jobtype string) (string, error) { } // Check if the image is here - hasimg, err := docker.HasImage(jobs[jobtype].Image) + hasimg, err := docker.HasImage(job.Image) if err != nil { return "", err } if !hasimg { - err = docker.PullImage(jobs[jobtype].Image) + err = docker.PullImage(job.Image) if err != nil { return "", err } @@ -44,8 +33,8 @@ func RunJob(jobtype string) (string, error) { return docker.Create( jobtype, - jobs[jobtype].Image, - jobs[jobtype].Cmd, + job.Image, + job.Cmd, mnts, ) } diff --git a/jobs/jobs.go b/jobs/jobs.go new file mode 100644 index 0000000..767e406 --- /dev/null +++ b/jobs/jobs.go @@ -0,0 +1,41 @@ +package jobs + +import ( + "crypto/sha256" + "fmt" +) + +type Job struct { + Image string + Cmd []string + DataMount bool +} + +var jobs = map[string]Job{ + "counter": { + Image: "alpine", + Cmd: []string{"sh", "-c", "touch /data/work_done; for i in `seq 10`; do echo $i; sleep 0.5; done"}, + DataMount: true, + }, +} + +var revJobs = map[string]string{} + +func init() { + for jobtype := range jobs { + revJobs[fmt.Sprintf("%x", sha256.Sum224([]byte(jobtype)))] = jobtype + } +} + +func GetJobType(hashJobType string) (jobtype string) { + var ok bool + if jobtype, ok = revJobs[hashJobType]; !ok { + jobtype = "" + } + + return +} + +func GetJob(jobtype string) (job Job) { + return jobs[jobtype] +}