initialise repo
[debian/orchestra.git] / src / conductor / resp_state.go
1 // resp_state.go
2
3 package main
4
5 import (
6         "os"
7         "json"
8 )
9
10 type ResponseState int
11
12 const (
13         // Response states
14         RESP_INVALID                    = ResponseState(iota)
15         RESP_PENDING                    // internal state, not wire.
16         RESP_RUNNING
17         RESP_FINISHED
18         RESP_FAILED
19         RESP_FAILED_UNKNOWN_SCORE
20         RESP_FAILED_HOST_ERROR
21         RESP_FAILED_UNKNOWN
22 )
23
24 func (rs ResponseState) String() (strout string) {
25         switch rs {
26         case RESP_RUNNING:
27                 return "PENDING"
28         case RESP_FINISHED:
29                 return "OK"
30         case RESP_FAILED:
31                 return "FAIL"
32         case RESP_FAILED_UNKNOWN_SCORE:
33                 return "UNK_SCORE"
34         case RESP_FAILED_HOST_ERROR:
35                 return "HOST_ERROR"
36         case RESP_FAILED_UNKNOWN:
37                 return "UNKNOWN_FAILURE"
38         }
39         return ""
40 }
41
42 func (rs ResponseState) MarshalJSON() (out []byte, err os.Error) {
43         strout := rs.String()
44         if strout != "" {
45                 return json.Marshal(strout)
46         }
47         return nil, InvalidValueError
48 }
49
50 func (rs *ResponseState) UnmarshalJSON(in []byte) (err os.Error) {
51         var statestr string
52         err = json.Unmarshal(in, &statestr)
53         if err != nil {
54                 return err
55         }
56         switch statestr {
57         case "PENDING":
58                 *rs = RESP_PENDING
59         case "OK":
60                 *rs = RESP_FINISHED
61         case "FAIL":
62                 *rs = RESP_FAILED
63         case "UNK_SCORE":
64                 *rs = RESP_FAILED_UNKNOWN_SCORE
65         case "HOST_ERROR":
66                 *rs = RESP_FAILED_HOST_ERROR
67         case "UNKNOWN_FAILURE":
68                 *rs = RESP_FAILED_UNKNOWN
69         default:
70                 return InvalidValueError
71         }
72         return nil
73 }
74
75 func (rs ResponseState) Finished() bool {
76         switch rs {
77         case RESP_FINISHED:
78                 fallthrough
79         case RESP_FAILED:
80                 fallthrough
81         case RESP_FAILED_UNKNOWN_SCORE:
82                 fallthrough
83         case RESP_FAILED_HOST_ERROR:
84                 fallthrough
85         case RESP_FAILED_UNKNOWN:
86                 return true
87         }
88         return false
89 }
90
91 // true if the response says the task failed.  false otherwise.
92 func (rs ResponseState) Failed() bool {
93         switch rs {
94         case RESP_RUNNING:
95                 fallthrough
96         case RESP_FINISHED:
97                 return false
98         }
99         return true
100 }
101
102 // true if the task can be tried.
103 // precond:  DidFail is true, job is a ONE_OF job.
104 // must return false otherwise.
105 func (rs ResponseState) CanRetry() bool {
106         switch rs {
107         case RESP_FAILED_UNKNOWN_SCORE:
108                 fallthrough
109         case RESP_FAILED_HOST_ERROR:
110                 return true
111         }
112         return false
113 }