@@ -0,0 +1,234 @@
1+{-# LANGUAGE DeriveFunctor #-}
2+{-# LANGUAGE FlexibleContexts #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE RecordWildCards #-}
5+{-# LANGUAGE TemplateHaskell #-}
6+
7+module Network.Docker.Types where
8+
9+import Control.Applicative
10+import Control.Lens.TH
11+import Control.Lens.TH
12+import Data.Aeson
13+import Data.Aeson.TH
14+import Data.Bool
15+import qualified Data.ByteString.Lazy as BS
16+import Data.Default
17+import qualified Data.Map as Map
18+import qualified Data.Text as T
19+import GHC.Generics
20+import Network.Docker.Options
21+import Network.Wreq.Types (Postable)
22+
23+
24+type URL = String
25+type ApiVersion = String
26+type Endpoint = String
27+
28+type Tag = String
29+type IP = String
30+type Port = Int
31+type PortType = String
32+
33+data DockerClientOpts = DockerClientOpts {
34+ apiVersion :: ApiVersion
35+ , baseUrl :: URL
36+ } deriving (Show)
37+
38+
39+data ResourceId = ResourceId { _id :: String } deriving (Show, Eq)
40+
41+
42+data DockerImage = DockerImage
43+ { _imageId :: ResourceId
44+ , _imageCreatedAt :: Int
45+ , _parentId :: Maybe String
46+ , _repoTags :: [Tag]
47+ , _size :: Int
48+ , _virtualSize :: Int
49+ } deriving (Show, Eq)
50+
51+
52+data DockerVersion = DockerVersion
53+ { _Version :: String
54+ , _GitCommit :: String
55+ , _GoVersion :: String
56+ , _Arch :: String
57+ , _KernelVersion :: String
58+ } deriving (Show, Eq)
59+
60+
61+-- The JSON looks likes this:
62+-- "Ports":[{"IP":"0.0.0.0","PrivatePort":55555,"PublicPort":55555,"Type":"tcp"}]
63+
64+data PortMap = PortMap
65+ { _ip :: IP
66+ , _privatePort :: Port
67+ , _publicPort :: Port
68+ , _type :: PortType
69+ } deriving (Show, Eq)
70+
71+
72+data DockerContainer = DockerContainer
73+ { _containerId :: ResourceId
74+ , _containerImageId :: ResourceId
75+ , _command :: String
76+ , _containerCreatedAt :: Int
77+ , _names :: [String]
78+ , _status :: String
79+ , _ports :: Maybe [PortMap]
80+ } deriving (Show, Eq)
81+
82+
83+data CreateContainerOpts = CreateContainerOpts
84+ { _hostname :: String
85+ , _user :: String
86+ , _memory :: Int
87+ , _memorySwap :: Int
88+ , _attachStdin :: Bool
89+ , _attachStdout :: Bool
90+ , _attachStderr :: Bool
91+ , _portSpecs :: Maybe Object
92+ , _tty :: Bool
93+ , _openStdin :: Bool
94+ , _stdinOnce :: Bool
95+ , _env :: Maybe Object
96+ , _cmd :: [String]
97+ , _image :: String
98+ , _volumes :: Maybe Object
99+ , _volumesFrom :: Maybe Object
100+ , _workingDir :: String
101+ , _disableNetwork :: Bool
102+ , _exposedPorts :: Maybe Object
103+ } deriving (Show)
104+
105+defaultCreateOpts = CreateContainerOpts {
106+ _hostname = ""
107+ , _user = ""
108+ , _memory = 0
109+ , _memorySwap = 0
110+ , _attachStdin = False
111+ , _attachStdout = False
112+ , _attachStderr = False
113+ , _portSpecs = Nothing
114+ , _tty = False
115+ , _openStdin = False
116+ , _stdinOnce = False
117+ , _env = Nothing
118+ , _cmd = []
119+ , _image = "debian"
120+ , _volumes = Nothing
121+ , _volumesFrom = Nothing
122+ , _workingDir = ""
123+ , _disableNetwork = False
124+ , _exposedPorts = Nothing
125+ }
126+
127+instance ToJSON CreateContainerOpts where
128+ toJSON (CreateContainerOpts {..}) = object
129+ [ "Hostname" .= _hostname
130+ , "User" .= _user
131+ , "Memory" .= _memory
132+ , "MemorySwap" .= _memorySwap
133+ , "AttachStdin" .= _attachStdin
134+ , "AttachStdout" .= _attachStdout
135+ , "AttachStderr" .= _attachStderr
136+ , "PortSpecs" .= _portSpecs
137+ , "Tty" .= _tty
138+ , "OpenStdin" .= _openStdin
139+ , "StdinOnce" .= _stdinOnce
140+ , "Env" .= _env
141+ , "Cmd" .= _cmd
142+ , "Image" .= _image
143+ , "Volumes" .= _volumes
144+ , "VolumesFrom" .= _volumesFrom
145+ , "WrokingDir" .= _workingDir
146+ , "DisableNetwork" .= _disableNetwork
147+ , "ExposedPorts" .= _exposedPorts
148+ ]
149+
150+-- data CreateContainerResponse = CreateContainerResponse
151+-- { _createdContainerId :: String
152+-- , _warnings :: Maybe [T.Text]
153+-- } deriving (Show)
154+
155+data StartContainerOpts = StartContainerOpts
156+ { _Binds :: [T.Text]
157+ , _Links :: [T.Text]
158+ , _LxcConf :: [(T.Text, T.Text)]
159+ , _PortBindings :: [(T.Text, [(T.Text, T.Text)])]
160+ , _PublishAllPorts :: Bool
161+ , _Privileged :: Bool
162+ , _Dns :: [T.Text]
163+ , _VolumesFrom :: [T.Text]
164+ } deriving (Show)
165+
166+defaultStartOpts = StartContainerOpts
167+ { _Binds = []
168+ , _Links = []
169+ , _LxcConf = []
170+ , _PortBindings = []
171+ , _PublishAllPorts = False
172+ , _Privileged = False
173+ , _Dns = []
174+ , _VolumesFrom = []
175+ }
176+
177+instance ToJSON StartContainerOpts where
178+ toJSON (StartContainerOpts {..}) = object
179+ [ "Binds" .= _Binds
180+ , "Links" .= _Links
181+ , "LxcConf" .= _LxcConf
182+ , "PortBindings" .= _PortBindings
183+ , "PublishAllPorts" .= _PublishAllPorts
184+ , "Privileged" .= _Privileged
185+ , "Dns" .= _Dns
186+ , "VolumesFrom" .= _VolumesFrom
187+ ]
188+
189+makeClassy ''ResourceId
190+
191+-- makeLenses ''CreateContainerResponse
192+makeLenses ''DockerImage
193+makeLenses ''DockerContainer
194+makeLenses ''CreateContainerOpts
195+
196+instance HasResourceId DockerImage where
197+ resourceId = imageId
198+
199+instance FromJSON DockerImage where
200+ parseJSON (Object v) =
201+ DockerImage <$> ResourceId <$> (v .: "Id")
202+ <*> (v .: "Created")
203+ <*> (v .:? "ParentId")
204+ <*> (v .: "RepoTags")
205+ <*> (v .: "Size")
206+ <*> (v .: "VirtualSize")
207+
208+instance FromJSON PortMap where
209+ parseJSON (Object v) =
210+ PortMap <$> (v .: "IP")
211+ <*> (v .: "PrivatePort")
212+ <*> (v .: "PublicPort")
213+ <*> (v .: "Type")
214+
215+instance HasResourceId DockerContainer where
216+ resourceId = containerId
217+
218+instance FromJSON DockerContainer where
219+ parseJSON (Object v) =
220+ DockerContainer <$> (ResourceId <$> (v .: "Id"))
221+ <*> (ResourceId <$> (v .: "Id"))
222+ <*> (v .: "Command")
223+ <*> (v .: "Created")
224+ <*> (v .: "Names")
225+ <*> (v .: "Status")
226+ <*> (v .:? "Ports")
227+
228+-- instance FromJSON CreateContainerResponse where
229+-- parseJSON (Object v) =
230+-- CreateContainerResponse <$> (v .: "Id")
231+-- <*> (v .:? "warnings")
232+
233+$(deriveJSON dopts ''DockerVersion)
234+