Skip to content

Commit

Permalink
Handle error properly when pulling or building images
Browse files Browse the repository at this point in the history
  • Loading branch information
BitK committed Jul 20, 2021
1 parent edd65c2 commit 8fc8336
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 47 deletions.
25 changes: 19 additions & 6 deletions dockers/manager/back/app/docker/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import re
from app.exception import PMException
from .streams import StreamFollower

DockerImage = createType("DockerImage")

# A tag name must be valid ASCII and may contain lowercase and uppercase letters, digits, underscores, periods and dashes.
Expand Down Expand Up @@ -201,6 +202,7 @@ def resolve_prune_images(*_, onlyDangling):
"spaceReclaimed": pruned.get("SpaceReclaimed", None),
}


@registerMutation("tagDockerImage")
def resolve_tag_image(*_, id, repository, tag=None):
try:
Expand All @@ -211,17 +213,28 @@ def resolve_tag_image(*_, id, repository, tag=None):
raise PMException(str(e))



@registerMutation("buildDockerImage")
def build_docker_image(*_, input):
url = input["url"]
tag = input["tag"]
stream = docker_client.api.build(url, tag, decode=True, rm=True, forcerm=True)
return StreamFollower.create(stream, {"name": tag, "type": "BUILD"})

try:
stream = docker_client.api.build(url, tag, decode=True, rm=True, forcerm=True)
return StreamFollower.create(stream, {"name": tag, "type": "BUILD"})
except APIError as e:
raise PMException(e.explanation)
except Exception as e:
raise PMException(str(e))


@registerMutation("pullDockerImage")
async def mutation_pull_image(*_, name):
name = name if ":" in name else f"{name}:latest"
stream = docker_client.api.pull(name, stream=True, decode=True)
return StreamFollower.create(stream, {"name": name, "type": "PULL"})
name = name if ":" in name else f"{name}:latest"
try:
stream = docker_client.api.pull(name, stream=True, decode=True)
return StreamFollower.create(stream, {"name": name, "type": "PULL"})
except APIError as e:
raise PMException(e.explanation)
except Exception as e:
raise PMException(str(e))

17 changes: 11 additions & 6 deletions dockers/manager/back/app/docker/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,19 @@ def create(cls, stream, meta):
cls.runners[id] = runner

async def start():
for message in stream:
runner.messages.append(message)
for queue in runner.queues:
await queue.put(message)
await asyncio.sleep(0) # release loop
try:
for message in stream:
runner.messages.append(message)
for queue in runner.queues:
await queue.put(message)
await asyncio.sleep(0) # release loop
except docker.errors.APIError as e:
runner.messages.append({"error": e.explanation})
except Exception as e:
runner.messages.append({"error": str(e)})
runner.done = True

await asyncio.sleep(10) # Keep the task 10s
await asyncio.sleep(10) # Keep the task 10s
cls.runners.pop(id)

for sub in cls.subscribers:
Expand Down
4 changes: 0 additions & 4 deletions dockers/manager/back/schema/docker/image.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@ type DockerSearchImageTagResult {
lastUpdated: DateTime!
}

type DockerImagePullProgressDetail {
current: Int
total: Int
}

input BuildDockerImageInput {
url: String!
Expand Down
23 changes: 14 additions & 9 deletions dockers/manager/back/schema/docker/stream.graphql
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
type DockerImagePullProgressDetail {
current: Int
total: Int
}

type DockerStreamPullLogEntry {
done: Boolean!
error: String
status: String
id: String
progressDetail: DockerImagePullProgressDetail
progress: String
}

type DockerSteamBuildLogEntry {
done: Boolean!
stream: String
error: String
done: Boolean!
stream: String
}


type DockerStream {
id: ID!
type: String!
name: String!
id: ID!
type: String!
name: String!
}


extend type Query {
dockerStreams: [DockerStream!]!
dockerStreams: [DockerStream!]!
}

extend type Subscription {
dockerStreamStart: DockerStream!
dockerStreamPull(id: ID!): DockerStreamPullLogEntry
dockerStreamBuild(id: ID!): DockerSteamBuildLogEntry
}
}
9 changes: 0 additions & 9 deletions dockers/manager/front/src/api/docker/images/queries.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,3 @@ export const SEARCH_IMAGE_TAG = gql`
}
}
`;

export const LIST_IMAGE_PULLS = gql`
query dockerImagePulls {
dockerImagePulls {
id
name
}
}
`;
2 changes: 2 additions & 0 deletions dockers/manager/front/src/api/docker/streams/subscriptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { STREAM_FRAGMENT } from "./fragments";
export const STREAM_PULL = gql`
subscription dockerStreamPull($id: ID!) {
dockerStreamPull(id: $id) {
error
done
status
id
Expand All @@ -18,6 +19,7 @@ export const STREAM_PULL = gql`
export const STREAM_BUILD = gql`
subscription dockerStreamBuild($id: ID!) {
dockerStreamBuild(id: $id) {
error
done
stream
}
Expand Down
4 changes: 0 additions & 4 deletions dockers/manager/front/src/components/Docker/Image/Table.vue
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,6 @@ export default {
component: ImageDialog,
parent: this
})
.onOk(tag => {
this.$refs.select.add(tag);
this.form = tag;
});
},
pruneImages () {
this.$q
Expand Down
35 changes: 28 additions & 7 deletions dockers/manager/front/src/components/Docker/Streams/BuildEntry.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
<div class="row q-gutter-md items-center">
<div class="col col-auto text-h6">Building {{ name }}</div>
<div class="col">
<q-badge
:label="done ? 'done' : 'running'"
:color="done ? 'positive' : 'warning'"
/>
<q-badge :label="badgeLabel" :color="badgeColor" />
</div>
</div>
<div class="row">
Expand All @@ -22,10 +19,30 @@ import api from "src/api";
export default {
props: {
id: {type: String, required: true},
name: {type: String, required: true},
id: { type: String, required: true },
name: { type: String, required: true },
},
data: () => ({ logText: "", done: false, error: false }),
computed: {
badgeColor () {
if (this.error) {
return "negative"
}
if (this.done) {
return "positive"
}
return "warning"
},
badgeLabel () {
if (this.error) {
return "error"
}
if (this.done) {
return "done"
}
return "running"
}
},
data: () => ({ logText: "", done: false }),
apollo: {
$subscribe: {
dockerProgresBuild: {
Expand All @@ -35,6 +52,10 @@ export default {
},
result ({ data }) {
const log = data.dockerStreamBuild;
if (log.error) {
this.error = true
this.logText += `\n\n${log.error}`
}
if (log.stream) {
this.logText += log.stream
this.$nextTick(() => {
Expand Down
2 changes: 0 additions & 2 deletions dockers/manager/front/src/eventBus.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Vue from "vue";

export const DownloaderBus = new Vue();
export const UploaderBus = new Vue();
export const GlobalBus = new Vue();

0 comments on commit 8fc8336

Please sign in to comment.