Compare commits
6 Commits
fix-segfau
...
main
Author | SHA1 | Date |
---|---|---|
Jef Roosens | 46fcbd8be0 | |
Jef Roosens | af2512034c | |
Jef Roosens | d47a3c71a1 | |
Jef Roosens | 12d8e5c04d | |
Jef Roosens | 4db13cdd6e | |
Jef Roosens | 7913b271dd |
|
@ -1,3 +1,6 @@
|
|||
variables:
|
||||
- &vlang_image 'git.rustybever.be/chewing_bever/vlang:0.3.3-alpine3.17'
|
||||
|
||||
branches:
|
||||
exclude: [ main ]
|
||||
|
||||
|
@ -5,14 +8,14 @@ platform: 'linux/amd64'
|
|||
|
||||
pipeline:
|
||||
build:
|
||||
image: 'git.rustybever.be/chewing_bever/vlang:0.3.2'
|
||||
image: *vlang_image
|
||||
commands:
|
||||
- make
|
||||
when:
|
||||
event: [ push ]
|
||||
|
||||
lint:
|
||||
image: 'git.rustybever.be/chewing_bever/vlang:0.3.2'
|
||||
image: *vlang_image
|
||||
commands:
|
||||
- make lint
|
||||
when:
|
||||
|
|
|
@ -20,7 +20,7 @@ reference](https://docs.docker.com/engine/api/v1.41/).
|
|||
- [ ] Start a container
|
||||
- [ ] Stop a container
|
||||
- [ ] Restart a container
|
||||
- [ ] Kill a container
|
||||
- [x] Kill a container
|
||||
- [ ] Update a container
|
||||
- [ ] Rename a container
|
||||
- [ ] Pause a container
|
||||
|
|
20
containers.v
20
containers.v
|
@ -16,7 +16,7 @@ pub fn (mut d DockerConn) container_list(c ContainerListConfig) ![]ContainerList
|
|||
d.params(c)
|
||||
d.send()!
|
||||
|
||||
return d.read_json_response<[]ContainerListItem>()
|
||||
return d.read_json_response[[]ContainerListItem]()
|
||||
}
|
||||
|
||||
pub struct NewContainer {
|
||||
|
@ -39,12 +39,12 @@ pub fn (mut d DockerConn) container_create(c NewContainer) !CreatedContainer {
|
|||
d.body_json(c)
|
||||
d.send()!
|
||||
|
||||
return d.read_json_response<CreatedContainer>()
|
||||
return d.read_json_response[CreatedContainer]()
|
||||
}
|
||||
|
||||
// start_container starts the container with the given id.
|
||||
pub fn (mut d DockerConn) container_start(id string) ! {
|
||||
d.request(.post, '/containers/$id/start')
|
||||
d.request(.post, '/containers/${id}/start')
|
||||
d.send()!
|
||||
d.read_response()!
|
||||
}
|
||||
|
@ -68,10 +68,10 @@ pub mut:
|
|||
}
|
||||
|
||||
pub fn (mut d DockerConn) container_inspect(id string) !ContainerInspect {
|
||||
d.request(.get, '/containers/$id/json')
|
||||
d.request(.get, '/containers/${id}/json')
|
||||
d.send()!
|
||||
|
||||
mut data := d.read_json_response<ContainerInspect>()!
|
||||
mut data := d.read_json_response[ContainerInspect]()!
|
||||
|
||||
// The Docker engine API *should* always return UTC time.
|
||||
data.state.start_time = time.parse_rfc3339(data.state.start_time_str)!
|
||||
|
@ -84,13 +84,19 @@ pub fn (mut d DockerConn) container_inspect(id string) !ContainerInspect {
|
|||
}
|
||||
|
||||
pub fn (mut d DockerConn) container_remove(id string) ! {
|
||||
d.request(.delete, '/containers/$id')
|
||||
d.request(.delete, '/containers/${id}')
|
||||
d.send()!
|
||||
d.read_response()!
|
||||
}
|
||||
|
||||
pub fn (mut d DockerConn) container_kill(id string) ! {
|
||||
d.request(.post, '/containers/${id}/kill')
|
||||
d.send()!
|
||||
d.read_response()!
|
||||
}
|
||||
|
||||
pub fn (mut d DockerConn) container_get_logs(id string) !&StreamFormatReader {
|
||||
d.request(.get, '/containers/$id/logs')
|
||||
d.request(.get, '/containers/${id}/logs')
|
||||
d.params({
|
||||
'stdout': 'true'
|
||||
'stderr': 'true'
|
||||
|
|
4
docker.v
4
docker.v
|
@ -111,7 +111,7 @@ fn (mut d DockerConn) read_response() ! {
|
|||
|
||||
// read_json_response<T> is a convenience function that runs read_response
|
||||
// before parsing its contents, which is assumed to be JSON, into a struct.
|
||||
fn (mut d DockerConn) read_json_response<T>() !T {
|
||||
fn (mut d DockerConn) read_json_response[T]() !T {
|
||||
d.read_response()!
|
||||
|
||||
data := json.decode(T, d.body)!
|
||||
|
@ -156,6 +156,6 @@ fn (mut d DockerConn) check_error() ! {
|
|||
d.read_response_body()!
|
||||
d_err := json.decode(DockerError, d.body)!
|
||||
|
||||
return error_with_code('$d.head.status(): $d_err.message', d.head.status_code)
|
||||
return error_with_code('${d.head.status()}: ${d_err.message}', d.head.status_code)
|
||||
}
|
||||
}
|
||||
|
|
11
images.v
11
images.v
|
@ -3,10 +3,10 @@ module docker
|
|||
import types { Image }
|
||||
|
||||
pub fn (mut d DockerConn) image_inspect(image string) !Image {
|
||||
d.request(.get, '/images/$image/json')
|
||||
d.request(.get, '/images/${image}/json')
|
||||
d.send()!
|
||||
|
||||
data := d.read_json_response<Image>()!
|
||||
data := d.read_json_response[Image]()!
|
||||
|
||||
return data
|
||||
}
|
||||
|
@ -40,20 +40,21 @@ pub fn (mut d DockerConn) image_from_container(id string, repo string, tag strin
|
|||
'repo': repo
|
||||
'tag': tag
|
||||
})
|
||||
d.body('application/json', '{}')
|
||||
d.send()!
|
||||
|
||||
return d.read_json_response<Image>()!
|
||||
return d.read_json_response[Image]()!
|
||||
}
|
||||
|
||||
// remove_image removes the image with the given id.
|
||||
pub fn (mut d DockerConn) image_remove(id string) ! {
|
||||
d.request(.delete, '/images/$id')
|
||||
d.request(.delete, '/images/${id}')
|
||||
d.send()!
|
||||
d.read_response()!
|
||||
}
|
||||
|
||||
pub fn (mut d DockerConn) image_tag(name string, repo string, tag string) ! {
|
||||
d.request(.post, '/images/$name/tag')
|
||||
d.request(.post, '/images/${name}/tag')
|
||||
d.params({
|
||||
'repo': repo
|
||||
'tag': tag
|
||||
|
|
20
request.v
20
request.v
|
@ -19,12 +19,12 @@ fn (mut d DockerConn) body(content_type string, body string) {
|
|||
d.body = body
|
||||
}
|
||||
|
||||
fn (mut d DockerConn) body_json<T>(data T) {
|
||||
fn (mut d DockerConn) body_json[T](data T) {
|
||||
d.content_type = 'application/json'
|
||||
d.body = json.encode(data)
|
||||
}
|
||||
|
||||
fn (mut d DockerConn) params<T>(o T) {
|
||||
fn (mut d DockerConn) params[T](o T) {
|
||||
$if T is map[string]string {
|
||||
for key, value in o {
|
||||
d.params[key] = urllib.query_escape(value.replace("'", '"'))
|
||||
|
@ -41,11 +41,17 @@ fn (mut d DockerConn) params<T>(o T) {
|
|||
}
|
||||
|
||||
fn (mut d DockerConn) send() ! {
|
||||
mut full_url := d.url
|
||||
mut full_url := '/${docker.api_version}${d.url}'
|
||||
|
||||
if d.params.len > 0 {
|
||||
params_str := d.params.keys().map('$it=${d.params[it]}').join('&')
|
||||
full_url += '?$params_str'
|
||||
mut fields := []string{cap: d.params.len}
|
||||
|
||||
for key, value in d.params {
|
||||
fields << '${key}=${value}'
|
||||
}
|
||||
params_str := fields.join('&')
|
||||
// params_str := d.params.keys().map('${it}=${d.params[it]}').join('&')
|
||||
full_url += '?${params_str}'
|
||||
}
|
||||
|
||||
// This is to make sure we actually created a valid URL
|
||||
|
@ -53,9 +59,9 @@ fn (mut d DockerConn) send() ! {
|
|||
final_url := parsed_url.request_uri()
|
||||
|
||||
req := if d.body == '' {
|
||||
'$d.method $final_url HTTP/1.1\nHost: localhost\n\n'
|
||||
'${d.method} ${final_url} HTTP/1.1\nHost: localhost\n\n'
|
||||
} else {
|
||||
'$d.method $final_url HTTP/1.1\nHost: localhost\nContent-Type: $d.content_type\nContent-Length: $d.body.len\n\n$d.body\n\n'
|
||||
'${d.method} ${final_url} HTTP/1.1\nHost: localhost\nContent-Type: ${d.content_type}\nContent-Length: ${d.body.len}\n\n${d.body}\n\n'
|
||||
}
|
||||
|
||||
d.socket.write_string(req)!
|
||||
|
|
|
@ -21,7 +21,7 @@ pub fn reader_to_writer(mut reader io.Reader, mut writer io.Writer) ! {
|
|||
// match_array_in_array<T> returns how many elements of a2 overlap with a1. For
|
||||
// example, if a1 = "abcd" & a2 = "cd", the result will be 2. If the match is
|
||||
// not at the end of a1, the result is 0.
|
||||
pub fn match_array_in_array<T>(a1 []T, a2 []T) int {
|
||||
pub fn match_array_in_array[T](a1 []T, a2 []T) int {
|
||||
mut i := 0
|
||||
mut match_len := 0
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ pub fn (mut d DockerConn) volume_list() !VolumeListResponse {
|
|||
d.request(.get, '/volumes')
|
||||
d.send()!
|
||||
|
||||
mut data := d.read_json_response<VolumeListResponse>()!
|
||||
mut data := d.read_json_response[VolumeListResponse]()!
|
||||
|
||||
for mut vol in data.volumes {
|
||||
vol.created_at = time.parse_rfc3339(vol.created_at_str)!
|
||||
|
|
Loading…
Reference in New Issue