blob: 1076ff8b38e15c4380fe4cc332a0749055a611e5 [file]
package apiGatewayDeploy
import (
"bytes"
"encoding/json"
"fmt"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"io/ioutil"
"net/http"
"net/http/httptest"
"net/url"
"time"
)
var _ = Describe("api", func() {
Context("GET /deployments/current", func() {
It("should get 404 if no deployments", func() {
db := getDB()
_, err := db.Exec("DELETE FROM gateway_deploy_deployment")
Expect(err).ShouldNot(HaveOccurred())
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
Expect(res.StatusCode).Should(Equal(http.StatusNotFound))
})
It("should get current deployment", func() {
deploymentID := "api_get_current"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
var depRes deployment
body, err := ioutil.ReadAll(res.Body)
Expect(err).ShouldNot(HaveOccurred())
json.Unmarshal(body, &depRes)
Expect(depRes.DeploymentID).Should(Equal(deploymentID))
Expect(depRes.Bundles[0].Scope).Should(Equal("some-scope"))
Expect(res.Header.Get("etag")).Should(Equal(deploymentID))
})
It("should get 304 for no change", func() {
deploymentID := "api_no_change"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
req, err := http.NewRequest("GET", uri.String(), nil)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("If-None-Match", res.Header.Get("etag"))
res, err = http.DefaultClient.Do(req)
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
Expect(res.StatusCode).To(Equal(http.StatusNotModified))
})
It("should get 404 after blocking if no deployment", func() {
db := getDB()
_, err := db.Exec("DELETE FROM gateway_deploy_deployment")
Expect(err).ShouldNot(HaveOccurred())
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
query := uri.Query()
query.Add("block", "1")
uri.RawQuery = query.Encode()
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
Expect(res.StatusCode).Should(Equal(http.StatusNotFound))
})
It("should get new deployment after blocking", func(done Done) {
deploymentID := "api_get_current_blocking"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
deploymentID = "api_get_current_blocking2"
go func() {
defer GinkgoRecover()
query := uri.Query()
query.Add("block", "1")
uri.RawQuery = query.Encode()
req, err := http.NewRequest("GET", uri.String(), nil)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("If-None-Match", res.Header.Get("etag"))
res, err := http.DefaultClient.Do(req)
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
Expect(res.StatusCode).To(Equal(http.StatusOK))
var depRes deployment
body, err := ioutil.ReadAll(res.Body)
Expect(err).ShouldNot(HaveOccurred())
json.Unmarshal(body, &depRes)
Expect(depRes.DeploymentID).Should(Equal(deploymentID))
close(done)
}()
time.Sleep(50 * time.Millisecond) // make sure API call is made and blocks
insertTestDeployment(testServer, deploymentID)
incoming <- deploymentID
})
It("should get 304 after blocking if no new deployment", func() {
deploymentID := "api_no_change_blocking"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = "/deployments/current"
res, err := http.Get(uri.String())
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
query := uri.Query()
query.Add("block", "1")
uri.RawQuery = query.Encode()
req, err := http.NewRequest("GET", uri.String(), nil)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("If-None-Match", res.Header.Get("etag"))
res, err = http.DefaultClient.Do(req)
Expect(err).ShouldNot(HaveOccurred())
defer res.Body.Close()
Expect(res.StatusCode).To(Equal(http.StatusNotModified))
})
})
Context("POST /deployments/{ID}", func() {
It("should return a 404 for missing deployment", func() {
deploymentID := "api_missing_deployment"
uri, err := url.Parse(testServer.URL)
uri.Path = fmt.Sprintf("/deployments/%s", deploymentID)
deploymentResult := deploymentResponse{
Status: RESPONSE_STATUS_SUCCESS,
}
payload, err := json.Marshal(deploymentResult)
Expect(err).ShouldNot(HaveOccurred())
req, err := http.NewRequest("POST", uri.String(), bytes.NewReader(payload))
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
defer resp.Body.Close()
Expect(err).ShouldNot(HaveOccurred())
Expect(resp.StatusCode).Should(Equal(http.StatusNotFound))
})
It("should mark a deployment as deployed", func() {
db := getDB()
deploymentID := "api_mark_deployed"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = fmt.Sprintf("/deployments/%s", deploymentID)
deploymentResult := deploymentResponse{
Status: RESPONSE_STATUS_SUCCESS,
}
payload, err := json.Marshal(deploymentResult)
Expect(err).ShouldNot(HaveOccurred())
req, err := http.NewRequest("POST", uri.String(), bytes.NewReader(payload))
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
defer resp.Body.Close()
Expect(err).ShouldNot(HaveOccurred())
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
var deployStatus int
err = db.QueryRow("SELECT status FROM gateway_deploy_deployment WHERE id=?", deploymentID).
Scan(&deployStatus)
Expect(deployStatus).Should(Equal(DEPLOYMENT_STATE_SUCCESS))
rows, err := db.Query("SELECT status from gateway_deploy_bundle WHERE id = ?;", deploymentID)
Expect(err).ShouldNot(HaveOccurred())
defer rows.Close()
for rows.Next() {
rows.Scan(&deployStatus)
Expect(deployStatus).Should(Equal(DEPLOYMENT_STATE_SUCCESS))
}
})
It("should mark a deployment as failed", func() {
db := getDB()
deploymentID := "api_test_3"
insertTestDeployment(testServer, deploymentID)
uri, err := url.Parse(testServer.URL)
uri.Path = fmt.Sprintf("/deployments/%s", deploymentID)
deploymentResult := deploymentResponse{
Status: RESPONSE_STATUS_FAIL,
Error: deploymentErrorResponse{
ErrorCode: 100,
Reason: "bad juju",
//ErrorDetails: []deploymentErrorDetail{ // todo: add tests for bundle errors
// {
// BundleId: "",
// ErrorCode: 100,
// Reason: "Zombies",
// },
//},
},
}
payload, err := json.Marshal(deploymentResult)
Expect(err).ShouldNot(HaveOccurred())
req, err := http.NewRequest("POST", uri.String(), bytes.NewReader(payload))
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
defer resp.Body.Close()
Expect(err).ShouldNot(HaveOccurred())
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
var deployStatus int
err = db.QueryRow("SELECT status from gateway_deploy_deployment WHERE id = ?;",
deploymentID).Scan(&deployStatus)
Expect(err).ShouldNot(HaveOccurred())
Expect(deployStatus).Should(Equal(DEPLOYMENT_STATE_ERR_GWY))
})
})
})
func insertTestDeployment(server *httptest.Server, depID string) {
db := getDB()
uri, err := url.Parse(server.URL)
Expect(err).ShouldNot(HaveOccurred())
uri.Path = "/bundle"
bundleUri := uri.String()
dep := deployment{
System: bundle{
URI: bundleUri,
},
Bundles: []bundle{
{
BundleID: "bun",
URI: bundleUri,
Scope: "some-scope",
Org: "org",
Env: "env",
},
},
}
err = insertDeployment(db, depID, dep)
Expect(err).ShouldNot(HaveOccurred())
err = updateDeploymentStatus(db, depID, DEPLOYMENT_STATE_READY, 0)
Expect(err).ShouldNot(HaveOccurred())
}