@@ -1,306 +0,0 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE DeriveFunctor #-}
3−{-# LANGUAGE DeriveGeneric #-}
4−{-# LANGUAGE FlexibleContexts #-}
6−{-# LANGUAGE OverloadedStrings #-}
7−{-# LANGUAGE RankNTypes #-}
8−{-# LANGUAGE RecordWildCards #-}
9−{-# LANGUAGE TypeFamilies #-}
11−module Network.Docker.Types where
13−import Control.Applicative
14−import Control.Monad.Free
15−import Control.Monad.Reader (ReaderT)
17−import Data.Aeson.Types
19−import qualified Data.ByteString.Lazy as L
21−import qualified Data.Map as Map
22−import qualified Data.Text as T
23−import GHC.Generics (Generic)
24−import Network.Wreq.Types (Postable)
25−import OpenSSL.Session (SSLContext)
27−type DockerM m a = ReaderT DockerClientOpts m a
29−type ContainerID = String
33−type ApiVersion = String
38−type PortType = String
40−data SSL = NoSSL | SSL SSLOptions deriving Show
42−data DockerClientOpts = DockerClientOpts {
43− apiVersion :: ApiVersion
50− | ListContainersEndpoint
52− | CreateContainerEndpoint
53− | StartContainerEndpoint
54− | StopContainerEndpoint
55− | KillContainerEndpoint
56− | RestartContainerEndpoint
57− | PauseContainerEndpoint
58− | UnpauseContainerEndpoint
59− | ContainerLogsEndpoint
60− | DeleteContainerEndpoint
63−data SEndpoint (a :: Endpoint) where
64− SVersionEndpoint :: SEndpoint VersionEndpoint
65− SListContainersEndpoint :: SEndpoint ListContainersEndpoint
66− SListImagesEndpoint :: SEndpoint ListImagesEndpoint
67− SCreateContainerEndpoint :: SEndpoint CreateContainerEndpoint
68− SStartContainerEndpoint :: ContainerID -> SEndpoint StartContainerEndpoint
69− SStopContainerEndpoint :: ContainerID -> SEndpoint StopContainerEndpoint
70− SKillContainerEndpoint :: ContainerID -> SEndpoint KillContainerEndpoint
71− SRestartContainerEndpoint :: ContainerID -> SEndpoint RestartContainerEndpoint
72− SPauseContainerEndpoint :: ContainerID -> SEndpoint PauseContainerEndpoint
73− SUnpauseContainerEndpoint :: ContainerID -> SEndpoint UnpauseContainerEndpoint
74− SContainerLogsEndpoint :: ContainerID -> LogOpts-> SEndpoint ContainerLogsEndpoint
75− SDeleteContainerEndpoint :: ContainerID -> DeleteOpts -> SEndpoint DeleteContainerEndpoint
77−defaultClientOpts :: DockerClientOpts
78−defaultClientOpts = DockerClientOpts
79− { apiVersion = "v1.22"
80− , baseUrl = "http://127.0.0.1:2375/"
87− | GetSSL SSLOptions URL
89− | PostSSL SSLOptions URL Value
91− | DeleteSSL SSLOptions URL
92− deriving ( Functor, Show )
95−type HttpRequestM = Free HttpRequestF
97−data SSLOptions = SSLOptions {
98− optionsKey :: FilePath
99− , optionsCert :: FilePath
103−data DockerImage = DockerImage
104− { _imageId :: ImageID
105− , _imageCreatedAt :: Int
106− , _parentId :: Maybe String
107− , _repoTags :: [Tag]
109− , _virtualSize :: Int
110− } deriving (Show, Eq)
112−data DockerVersion = DockerVersion
113− { _Version :: String
114− , _GitCommit :: String
115− , _GoVersion :: String
117− , _KernelVersion :: String
118− } deriving (Show, Eq, Generic)
121−-- The JSON looks likes this:
122−-- "Ports":[{"IP":"0.0.0.0","PrivatePort":55555,"PublicPort":55555,"Type":"tcp"}]
124−data PortMap = PortMap
126− , _privatePort :: Port
127− , _publicPort :: Port
129− } deriving (Show, Eq)
131−data DeleteOpts = DeleteOpts
132− { removeVolumes :: Bool
136−defaultDeleteOpts = DeleteOpts False False
138−data LogOpts = LogOpts
142− } deriving (Eq, Show)
145−defaultLogOpts = LogOpts True True False
147−data DockerContainer = DockerContainer
148− { _containerId :: ContainerID
149− , _containerImageId :: ImageID
150− , _command :: String
151− , _containerCreatedAt :: Int
152− , _names :: [String]
154− , _ports :: Maybe [PortMap]
155− } deriving (Show, Eq)
158−data CreateContainerOpts = CreateContainerOpts
159− { _hostname :: String
162− , _memorySwap :: Int
163− , _attachStdin :: Bool
164− , _attachStdout :: Bool
165− , _attachStderr :: Bool
166− , _portSpecs :: Maybe Object
168− , _openStdin :: Bool
169− , _stdinOnce :: Bool
170− , _env :: Maybe Object
173− , _volumes :: Maybe Object
174− , _volumesFrom :: Maybe Object
175− , _workingDir :: String
176− , _disableNetwork :: Bool
177− , _exposedPorts :: Maybe Object
180−defaultCreateOpts = CreateContainerOpts {
185− , _attachStdin = False
186− , _attachStdout = False
187− , _attachStderr = False
188− , _portSpecs = Nothing
190− , _openStdin = False
191− , _stdinOnce = False
195− , _volumes = Nothing
196− , _volumesFrom = Nothing
198− , _disableNetwork = False
199− , _exposedPorts = Nothing
202−instance ToJSON CreateContainerOpts where
203− toJSON (CreateContainerOpts {..}) = object
204− [ "Hostname" .= _hostname
206− , "Memory" .= _memory
207− , "MemorySwap" .= _memorySwap
208− , "AttachStdin" .= _attachStdin
209− , "AttachStdout" .= _attachStdout
210− , "AttachStderr" .= _attachStderr
211− , "PortSpecs" .= _portSpecs
213− , "OpenStdin" .= _openStdin
214− , "StdinOnce" .= _stdinOnce
218− , "Volumes" .= _volumes
219− , "VolumesFrom" .= _volumesFrom
220− , "WrokingDir" .= _workingDir
221− , "DisableNetwork" .= _disableNetwork
222− , "ExposedPorts" .= _exposedPorts
225−data StartContainerOpts = StartContainerOpts
226− { _Binds :: [T.Text]
227− , _Links :: [T.Text]
228− , _LxcConf :: [(T.Text, T.Text)]
229− , _PortBindings :: [((Int,T.Text),Int)]
230− , _PublishAllPorts :: Bool
231− , _Privileged :: Bool
233− , _VolumesFrom :: [T.Text]
234− , _RestartPolicy :: RestartPolicy
237−defaultStartOpts = StartContainerOpts
241− , _PortBindings = []
242− , _PublishAllPorts = False
243− , _Privileged = False
246− , _RestartPolicy = RestartNever
249−instance ToJSON StartContainerOpts where
250− toJSON (StartContainerOpts {..}) = object
253− , "LxcConf" .= _LxcConf
254− , "PortBindings" .= object (map (\((h,p),c)->T.concat [T.pack (show h),"/",p] .= [object ["HostPort" .= show c]]) _PortBindings)
255− , "PublishAllPorts" .= _PublishAllPorts
256− , "Privileged" .= _Privileged
258− , "VolumesFrom" .= _VolumesFrom
259− , "RestartPolicy" .= _RestartPolicy
262−data RestartPolicy = RestartNever
264− | RestartOnFailure Int
267−instance ToJSON RestartPolicy where
268− toJSON RestartNever = object ["Name" .= (""::String), "MaximumRetryCount" .= (0::Int) ]
269− toJSON RestartAlways = object ["Name" .= ("always"::String), "MaximumRetryCount" .= (0::Int) ]
270− toJSON (RestartOnFailure n) = object ["Name" .= ("on-failure"::String), "MaximumRetryCount" .= n ]
272−instance FromJSON DockerImage where
273− parseJSON (Object v) =
274− DockerImage <$> (v .: "Id")
275− <*> (v .: "Created")
276− <*> (v .:? "ParentId")
277− <*> (v .: "RepoTags")
279− <*> (v .: "VirtualSize")
281−instance FromJSON PortMap where
282− parseJSON (Object v) =
283− PortMap <$> (v .: "IP")
284− <*> (v .: "PrivatePort")
285− <*> (v .: "PublicPort")
288−instance FromJSON DockerContainer where
289− parseJSON (Object v) =
290− DockerContainer <$> (v .: "Id")
292− <*> (v .: "Command")
293− <*> (v .: "Created")
299−instance ToJSON DockerVersion where
300− toJSON = genericToJSON defaultOptions {
301− fieldLabelModifier = drop 1 }
303−instance FromJSON DockerVersion where
304− parseJSON = genericParseJSON defaultOptions {
305− fieldLabelModifier = drop 1 }