Ensure that bundle download failures are reported to the server, define error codes
diff --git a/api.go b/api.go
index ae92a0d..00dc633 100644
--- a/api.go
+++ b/api.go
@@ -13,12 +13,23 @@
"time"
)
+// todo: the full set of states should probably be RECEIVED, READY, FAIL, SUCCESS
const (
RESPONSE_STATUS_SUCCESS = "SUCCESS"
RESPONSE_STATUS_FAIL = "FAIL"
+)
- // todo: add error codes where this is used
- ERROR_CODE_TODO = 0
+const (
+ TRACKER_ERR_BUNDLE_TIMEOUT = iota
+ TRACKER_ERR_PARSE_FAILED
+ TRACKER_ERR_INVALID_CHECKSUM
+)
+
+const (
+ API_ERR_BAD_BLOCK = iota
+ API_ERR_BAD_JSON
+ API_ERR_INVALID_CONTENT
+ API_ERR_INTERNAL
)
var (
@@ -81,7 +92,7 @@
}
func writeDatabaseError(w http.ResponseWriter) {
- writeError(w, http.StatusInternalServerError, ERROR_CODE_TODO, "database error")
+ writeError(w, http.StatusInternalServerError, API_ERR_INTERNAL, "database error")
}
func distributeEvents() {
@@ -143,7 +154,7 @@
var err error
timeout, err = strconv.Atoi(b)
if err != nil {
- writeError(w, http.StatusBadRequest, ERROR_CODE_TODO, "bad block value, must be number of seconds")
+ writeError(w, http.StatusBadRequest, API_ERR_BAD_BLOCK, "bad block value, must be number of seconds")
return
}
}
@@ -235,7 +246,7 @@
err := json.Unmarshal(buf, &results)
if err != nil {
log.Errorf("Resp Handler Json Unmarshal err: ", err)
- writeError(w, http.StatusBadRequest, ERROR_CODE_TODO, "Malformed JSON")
+ writeError(w, http.StatusBadRequest, API_ERR_BAD_JSON, "Malformed JSON")
return
}
@@ -269,12 +280,11 @@
}
if errs.Len() > 0 {
- writeError(w, http.StatusBadRequest, ERROR_CODE_TODO, errs.String())
+ writeError(w, http.StatusBadRequest, API_ERR_INVALID_CONTENT, errs.String())
return
}
if len(validResults) > 0 {
- go transmitDeploymentResultsToServer(validResults)
setDeploymentResults(validResults)
}
diff --git a/bundle.go b/bundle.go
index 1105606..e877ad2 100644
--- a/bundle.go
+++ b/bundle.go
@@ -47,7 +47,7 @@
{
ID: dep.ID,
Status: RESPONSE_STATUS_FAIL,
- ErrorCode: ERROR_CODE_TODO,
+ ErrorCode: TRACKER_ERR_INVALID_CHECKSUM,
Message: msg,
},
})
@@ -132,7 +132,7 @@
{
ID: r.dep.ID,
Status: RESPONSE_STATUS_FAIL,
- ErrorCode: ERROR_CODE_TODO,
+ ErrorCode: TRACKER_ERR_BUNDLE_TIMEOUT,
Message: "bundle download failed",
},
})
diff --git a/bundle_test.go b/bundle_test.go
index 84989ea..15fd8e3 100644
--- a/bundle_test.go
+++ b/bundle_test.go
@@ -8,6 +8,8 @@
"net/http"
"net/http/httptest"
+ "io/ioutil"
+
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -134,6 +136,31 @@
err = tx.Commit()
Expect(err).ShouldNot(HaveOccurred())
+ trackerHit := false
+ tracker := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ defer GinkgoRecover()
+
+ b, err := ioutil.ReadAll(r.Body)
+ Expect(err).ShouldNot(HaveOccurred())
+ var received apiDeploymentResults
+ json.Unmarshal(b, &received)
+
+ expected := apiDeploymentResults{
+ {
+ ID: deploymentID,
+ Status: RESPONSE_STATUS_FAIL,
+ ErrorCode: TRACKER_ERR_BUNDLE_TIMEOUT,
+ Message: "bundle download failed",
+ },
+ }
+ Expect(received).To(Equal(expected))
+ trackerHit = true
+ w.Write([]byte("OK"))
+ }))
+ defer tracker.Close()
+ apiServerBaseURI, err = url.Parse(tracker.URL)
+ Expect(err).ShouldNot(HaveOccurred())
+
queueDownloadRequest(dep)
<-proceed
@@ -147,10 +174,12 @@
Expect(d.ID).To(Equal(deploymentID))
Expect(d.DeployStatus).To(Equal(RESPONSE_STATUS_FAIL))
- Expect(d.DeployErrorCode).To(Equal(ERROR_CODE_TODO))
+ Expect(d.DeployErrorCode).To(Equal(TRACKER_ERR_BUNDLE_TIMEOUT))
Expect(d.DeployErrorMessage).ToNot(BeEmpty())
Expect(d.LocalBundleURI).To(BeEmpty())
+ Expect(trackerHit).To(BeTrue())
+
var listener = make(chan string)
addSubscriber <- listener
<-listener
@@ -165,7 +194,7 @@
Expect(d.ID).To(Equal(deploymentID))
Expect(d.DeployStatus).To(Equal(RESPONSE_STATUS_FAIL))
- Expect(d.DeployErrorCode).To(Equal(ERROR_CODE_TODO))
+ Expect(d.DeployErrorCode).To(Equal(TRACKER_ERR_BUNDLE_TIMEOUT))
Expect(d.DeployErrorMessage).ToNot(BeEmpty())
Expect(d.LocalBundleURI).To(BeAnExistingFile())
})
diff --git a/data.go b/data.go
index d36e745..ad67728 100644
--- a/data.go
+++ b/data.go
@@ -155,7 +155,7 @@
// getUnreadyDeployments() returns array of deployments that are not yet ready to deploy
func getUnreadyDeployments() (deployments []DataDeployment, err error) {
- return getDeployments("WHERE local_bundle_uri = $1 and deploy_status = $2", "", "")
+ return getDeployments("WHERE local_bundle_uri = $1", "")
}
// getDeployments() accepts a "WHERE ..." clause and optional parameters and returns the list of deployments
@@ -207,6 +207,9 @@
func setDeploymentResults(results apiDeploymentResults) error {
+ // also send results to server
+ go transmitDeploymentResultsToServer(results)
+
log.Debugf("setDeploymentResults: %v", results)
tx, err := getDB().Begin()
@@ -265,12 +268,3 @@
return nil
}
-
-func getLocalBundleURI(depID string) (localBundleUri string, err error) {
-
- err = getDB().QueryRow("SELECT local_bundle_uri FROM deployments WHERE id=$1;", depID).Scan(&localBundleUri)
- if err == sql.ErrNoRows {
- err = nil
- }
- return
-}
diff --git a/listener.go b/listener.go
index e4290d5..339213a 100644
--- a/listener.go
+++ b/listener.go
@@ -72,7 +72,7 @@
result := apiDeploymentResult{
ID: dep.ID,
Status: RESPONSE_STATUS_FAIL,
- ErrorCode: ERROR_CODE_TODO,
+ ErrorCode: TRACKER_ERR_PARSE_FAILED,
Message: fmt.Sprintf("unable to parse deployment: %v", err),
}
errResults = append(errResults, result)
@@ -174,7 +174,7 @@
result := apiDeploymentResult{
ID: dep.ID,
Status: RESPONSE_STATUS_FAIL,
- ErrorCode: ERROR_CODE_TODO,
+ ErrorCode: TRACKER_ERR_PARSE_FAILED,
Message: fmt.Sprintf("unable to parse deployment: %v", err),
}
errResults = append(errResults, result)