AppManager: Implement task status API

Change-Id: I70c895d7461ffe4afc45868ca6bf754d37072a0f
diff --git a/core/installer/tasks/tasks.go b/core/installer/tasks/tasks.go
index 69ddd17..a391e7e 100644
--- a/core/installer/tasks/tasks.go
+++ b/core/installer/tasks/tasks.go
@@ -13,13 +13,33 @@
 	StatusDone           = 3
 )
 
+func StatusString(s Status) string {
+	switch s {
+	case StatusPending:
+		return "pending"
+	case StatusRunning:
+		return "running"
+	case StatusFailed:
+		return "failed"
+	case StatusDone:
+		return "done"
+	}
+	panic("MUST NOT REACH")
+}
+
 type TaskDoneListener func(err error)
 
 type Subtasks interface {
 	Tasks() []Task
 }
 
+type ResourceId struct {
+	Type string
+	Name string
+}
+
 type Task interface {
+	Resource() *ResourceId
 	Title() string
 	Start()
 	Status() Status
@@ -30,6 +50,7 @@
 
 type basicTask struct {
 	title       string
+	rid         *ResourceId
 	status      Status
 	err         error
 	listeners   []TaskDoneListener
@@ -37,8 +58,9 @@
 	afterDone   func()
 }
 
-func newBasicTask(title string) basicTask {
+func newBasicTask(title string, rid *ResourceId) basicTask {
 	return basicTask{
+		rid:       rid,
 		title:     title,
 		status:    StatusPending,
 		err:       nil,
@@ -46,6 +68,10 @@
 	}
 }
 
+func (b *basicTask) Resource() *ResourceId {
+	return b.rid
+}
+
 func (b *basicTask) Title() string {
 	return b.title
 }
@@ -84,7 +110,14 @@
 
 func newLeafTask(title string, start func() error) leafTask {
 	return leafTask{
-		basicTask: newBasicTask(title),
+		basicTask: newBasicTask(title, nil),
+		start:     start,
+	}
+}
+
+func newResourceLeafTask(title string, rid *ResourceId, start func() error) leafTask {
+	return leafTask{
+		basicTask: newBasicTask(title, rid),
 		start:     start,
 	}
 }