feat(docker): error when HTTP requests fail
parent
4c97489f8a
commit
da46b8b4ae
|
@ -56,6 +56,7 @@ pub fn create_build_image(base_image string) ?string {
|
||||||
|
|
||||||
// This loop waits until the container has stopped, so we can remove it after
|
// This loop waits until the container has stopped, so we can remove it after
|
||||||
for {
|
for {
|
||||||
|
println('wot')
|
||||||
data := dd.inspect_container(id)?
|
data := dd.inspect_container(id)?
|
||||||
|
|
||||||
if !data.state.running {
|
if !data.state.running {
|
||||||
|
|
|
@ -5,6 +5,10 @@ import net.urllib
|
||||||
import time
|
import time
|
||||||
import net.http
|
import net.http
|
||||||
|
|
||||||
|
struct DockerError {
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
struct Container {
|
struct Container {
|
||||||
id string [json: Id]
|
id string [json: Id]
|
||||||
names []string [json: Names]
|
names []string [json: Names]
|
||||||
|
@ -12,7 +16,13 @@ struct Container {
|
||||||
|
|
||||||
pub fn (mut d DockerDaemon) containers() ?[]Container {
|
pub fn (mut d DockerDaemon) containers() ?[]Container {
|
||||||
d.send_request('GET', urllib.parse('/v1.41/containers/json')?)?
|
d.send_request('GET', urllib.parse('/v1.41/containers/json')?)?
|
||||||
_, res := d.read_response()?
|
head, res := d.read_response()?
|
||||||
|
|
||||||
|
if head.status_code != 200 {
|
||||||
|
data := json.decode(DockerError, res)?
|
||||||
|
|
||||||
|
return error(data.message)
|
||||||
|
}
|
||||||
|
|
||||||
data := json.decode([]Container, res)?
|
data := json.decode([]Container, res)?
|
||||||
|
|
||||||
|
@ -37,18 +47,28 @@ pub:
|
||||||
|
|
||||||
pub fn (mut d DockerDaemon) create_container(c NewContainer) ?CreatedContainer {
|
pub fn (mut d DockerDaemon) create_container(c NewContainer) ?CreatedContainer {
|
||||||
d.send_request_with_json('POST', urllib.parse('/v1.41/containers/create')?, c)?
|
d.send_request_with_json('POST', urllib.parse('/v1.41/containers/create')?, c)?
|
||||||
_, res := d.read_response()?
|
head, res := d.read_response()?
|
||||||
|
|
||||||
|
if head.status_code != 201 {
|
||||||
|
data := json.decode(DockerError, res)?
|
||||||
|
|
||||||
|
return error(data.message)
|
||||||
|
}
|
||||||
|
|
||||||
data := json.decode(CreatedContainer, res)?
|
data := json.decode(CreatedContainer, res)?
|
||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut d DockerDaemon) start_container(id string) ?bool {
|
pub fn (mut d DockerDaemon) start_container(id string) ? {
|
||||||
d.send_request('POST', urllib.parse('/v1.41/containers/$id/start')?)?
|
d.send_request('POST', urllib.parse('/v1.41/containers/$id/start')?)?
|
||||||
head := d.read_response_head() ?
|
head, body := d.read_response() ?
|
||||||
|
|
||||||
return head.status_code == 204
|
if head.status_code != 204 {
|
||||||
|
data := json.decode(DockerError, body)?
|
||||||
|
|
||||||
|
return error(data.message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// create_container creates a container defined by the given configuration. If
|
// create_container creates a container defined by the given configuration. If
|
||||||
|
@ -94,7 +114,9 @@ pub fn (mut d DockerDaemon) inspect_container(id string) ?ContainerInspect {
|
||||||
head, body := d.read_response()?
|
head, body := d.read_response()?
|
||||||
|
|
||||||
if head.status_code != 200 {
|
if head.status_code != 200 {
|
||||||
return error('Failed to inspect container.')
|
data := json.decode(DockerError, body)?
|
||||||
|
|
||||||
|
return error(data.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
mut data := json.decode(ContainerInspect, body)?
|
mut data := json.decode(ContainerInspect, body)?
|
||||||
|
@ -130,7 +152,13 @@ pub fn inspect_container(id string) ?ContainerInspect {
|
||||||
|
|
||||||
pub fn (mut d DockerDaemon) remove_container(id string) ? {
|
pub fn (mut d DockerDaemon) remove_container(id string) ? {
|
||||||
d.send_request('DELETE', urllib.parse('/v1.41/containers/$id')?)?
|
d.send_request('DELETE', urllib.parse('/v1.41/containers/$id')?)?
|
||||||
head := d.read_response_head() ?
|
head, body := d.read_response() ?
|
||||||
|
|
||||||
|
if head.status_code != 204 {
|
||||||
|
data := json.decode(DockerError, body)?
|
||||||
|
|
||||||
|
return error(data.message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove_container removes a container with a given ID.
|
// remove_container removes a container with a given ID.
|
||||||
|
|
|
@ -50,6 +50,8 @@ pub fn (mut d DockerDaemon) send_request_with_json<T>(method string, url urllib.
|
||||||
|
|
||||||
// read_response_head consumes the socket's contents until it encounters
|
// read_response_head consumes the socket's contents until it encounters
|
||||||
// '\r\n\r\n', after which it parses the response as an HTTP response.
|
// '\r\n\r\n', after which it parses the response as an HTTP response.
|
||||||
|
// Importantly, this function never consumes past the HTTP separator, so the
|
||||||
|
// body can be read fully later on.
|
||||||
pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
||||||
mut c := 0
|
mut c := 0
|
||||||
mut buf := []u8{len: 4}
|
mut buf := []u8{len: 4}
|
||||||
|
@ -88,6 +90,10 @@ pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut d DockerDaemon) read_response_body(length int) ?string {
|
pub fn (mut d DockerDaemon) read_response_body(length int) ?string {
|
||||||
|
if length == 0 {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
mut buf := []u8{len: docker.buf_len}
|
mut buf := []u8{len: docker.buf_len}
|
||||||
mut c := 0
|
mut c := 0
|
||||||
mut builder := strings.new_builder(docker.buf_len)
|
mut builder := strings.new_builder(docker.buf_len)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
module docker
|
||||||
|
|
||||||
|
import io
|
||||||
|
|
||||||
|
struct ChunkedResponseStream {
|
||||||
|
reader io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue