forked from mohsenasm/swarm-dashboard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDocker.elm
105 lines (80 loc) · 3.13 KB
/
Docker.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
module Docker exposing (..)
import Dict exposing (Dict)
import Date exposing (Date)
import Docker.Types exposing (..)
import Docker.Json exposing (parse)
import Util exposing (..)
isFailed : TaskStatus -> Bool
isFailed { state } =
(state == "failed")
isCompleted : TaskStatus -> Bool
isCompleted { state } =
(state == "rejected") || (state == "shutdown")
withoutFailedTaskHistory : List AssignedTask -> List AssignedTask
withoutFailedTaskHistory =
let
key { serviceId, slot } =
( serviceId, (Maybe.withDefault 0 slot) )
latestRunning =
List.sortBy (.status >> .timestamp >> Date.toTime)
>> List.filter (\t -> t.status.state /= "failed")
>> List.reverse
>> List.head
latest =
List.sortBy (.status >> .timestamp >> Date.toTime)
>> List.reverse
>> (List.take 1)
failedOlderThan running task =
isFailed task.status && Date.toTime task.status.timestamp < Date.toTime running.status.timestamp
filterPreviouslyFailed tasks =
case latestRunning tasks of
-- remove older failed tasks
Just runningTask ->
List.filter (complement (failedOlderThan runningTask)) tasks
-- Keep only the latest failed task
Nothing ->
latest tasks
in
(groupBy key) >> (Dict.map (\_ -> filterPreviouslyFailed)) >> Dict.values >> List.concat
process : DockerApiData -> Docker
process { nodes, networks, services, tasks } =
let
emptyNetwork =
{ id = "", ingress = False, name = "" }
networkIndex =
indexBy (.id) networks
resolveNetworks : List NetworkId -> List Network
resolveNetworks networks =
networks |> List.map (\id -> Maybe.withDefault emptyNetwork (Dict.get id networkIndex))
linkNetworks : List RawService -> List Service
linkNetworks =
List.map (\service -> { service | networks = resolveNetworks service.networks })
allNetworks : List RawService -> List Network
allNetworks =
List.concatMap .networks
>> unique
>> resolveNetworks
>> (List.sortBy .name)
>> (List.sortBy (.ingress >> \ingress -> iff ingress 0 1))
( assignedTasks, plannedTasks ) =
tasks
|> (List.partition (.nodeId >> isJust))
>> (Tuple.mapFirst (List.map assignedTask))
>> (Tuple.mapSecond (List.map plannedTask))
notCompleted =
List.filter (.status >> complement isCompleted)
filterTasks =
notCompleted >> withoutFailedTaskHistory
in
{ nodes = (List.sortBy .name nodes)
, networks = (allNetworks services)
, services = (List.sortBy .name (linkNetworks services))
, plannedTasks = plannedTasks
, assignedTasks = (filterTasks assignedTasks)
}
empty : Docker
empty =
Docker [] [] [] [] []
fromJson : String -> Result String Docker
fromJson =
parse >> Result.map process