1{-# LANGUAGE DeriveFunctor #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE TemplateHaskell #-}
7module Network.Docker.Types where
9import Control.Applicative
14import qualified Data.ByteString.Lazy as BS
16import qualified Data.Map as Map
17import qualified Data.Text as T
19import Network.Docker.Options
20import Network.Wreq.Types (Postable)
21import OpenSSL.Session (SSLContext)
22import Prelude hiding (id)
25type ApiVersion = String
33data SSL = NoSSL | SSL SSLOptions deriving Show
35data DockerClientOpts = DockerClientOpts {
36 apiVersion :: ApiVersion
42data SSLOptions = SSLOptions {
43 optionsKey :: FilePath
44 , optionsCert :: FilePath
48data ResourceId = ResourceId { _id :: String } deriving (Show, Eq)
51data DockerImage = DockerImage
52 { _imageId :: ResourceId
53 , _imageCreatedAt :: Int
54 , _parentId :: Maybe String
61data DockerVersion = DockerVersion
63 , _GitCommit :: String
64 , _GoVersion :: String
66 , _KernelVersion :: String
70-- The JSON looks likes this:
71-- "Ports":[{"IP":"0.0.0.0","PrivatePort":55555,"PublicPort":55555,"Type":"tcp"}]
75 , _privatePort :: Port
80data DeleteOpts = DeleteOpts
81 { removeVolumes :: Bool
85defaultDeleteOpts = DeleteOpts False False
88data DockerContainer = DockerContainer
89 { _containerId :: ResourceId
90 , _containerImageId :: ResourceId
92 , _containerCreatedAt :: Int
95 , _ports :: Maybe [PortMap]
99data CreateContainerOpts = CreateContainerOpts
100 { _hostname :: String
104 , _attachStdin :: Bool
105 , _attachStdout :: Bool
106 , _attachStderr :: Bool
107 , _portSpecs :: Maybe Object
111 , _env :: Maybe Object
114 , _volumes :: Maybe Object
115 , _volumesFrom :: Maybe Object
116 , _workingDir :: String
117 , _disableNetwork :: Bool
118 , _exposedPorts :: Maybe Object
121defaultCreateOpts = CreateContainerOpts {
126 , _attachStdin = False
127 , _attachStdout = False
128 , _attachStderr = False
129 , _portSpecs = Nothing
137 , _volumesFrom = Nothing
139 , _disableNetwork = False
140 , _exposedPorts = Nothing
143instance ToJSON CreateContainerOpts where
144 toJSON (CreateContainerOpts {..}) = object
145 [ "Hostname" .= _hostname
147 , "Memory" .= _memory
148 , "MemorySwap" .= _memorySwap
149 , "AttachStdin" .= _attachStdin
150 , "AttachStdout" .= _attachStdout
151 , "AttachStderr" .= _attachStderr
152 , "PortSpecs" .= _portSpecs
154 , "OpenStdin" .= _openStdin
155 , "StdinOnce" .= _stdinOnce
159 , "Volumes" .= _volumes
160 , "VolumesFrom" .= _volumesFrom
161 , "WrokingDir" .= _workingDir
162 , "DisableNetwork" .= _disableNetwork
163 , "ExposedPorts" .= _exposedPorts
166-- data CreateContainerResponse = CreateContainerResponse
167-- { _createdContainerId :: String
168-- , _warnings :: Maybe [T.Text]
171data StartContainerOpts = StartContainerOpts
174 , _LxcConf :: [(T.Text, T.Text)]
175 , _PortBindings :: [((Int,T.Text),Int)]
176 , _PublishAllPorts :: Bool
177 , _Privileged :: Bool
179 , _VolumesFrom :: [T.Text]
180 , _RestartPolicy :: RestartPolicy
183defaultStartOpts = StartContainerOpts
188 , _PublishAllPorts = False
189 , _Privileged = False
192 , _RestartPolicy = RestartNever
195instance ToJSON StartContainerOpts where
196 toJSON (StartContainerOpts {..}) = object
199 , "LxcConf" .= _LxcConf
200 , "PortBindings" .= object (map (\((h,p),c)->T.concat [T.pack (show h),"/",p] .= [object ["HostPort" .= show c]]) _PortBindings)
201 , "PublishAllPorts" .= _PublishAllPorts
202 , "Privileged" .= _Privileged
204 , "VolumesFrom" .= _VolumesFrom
205 , "RestartPolicy" .= _RestartPolicy
208data RestartPolicy = RestartNever
210 | RestartOnFailure Int
213instance ToJSON RestartPolicy where
214 toJSON RestartNever = object ["Name" .= (""::String), "MaximumRetryCount" .= (0::Int) ]
215 toJSON RestartAlways = object ["Name" .= ("always"::String), "MaximumRetryCount" .= (0::Int) ]
216 toJSON (RestartOnFailure n) = object ["Name" .= ("on-failure"::String), "MaximumRetryCount" .= n ]
218makeClassy ''ResourceId
220-- makeLenses ''CreateContainerResponse
221makeLenses ''DockerImage
222makeLenses ''DockerContainer
223makeLenses ''CreateContainerOpts
225instance HasResourceId DockerImage where
228instance FromJSON DockerImage where
229 parseJSON (Object v) =
230 DockerImage <$> ResourceId <$> (v .: "Id")
232 <*> (v .:? "ParentId")
233 <*> (v .: "RepoTags")
235 <*> (v .: "VirtualSize")
237instance FromJSON PortMap where
238 parseJSON (Object v) =
239 PortMap <$> (v .: "IP")
240 <*> (v .: "PrivatePort")
241 <*> (v .: "PublicPort")
244instance HasResourceId DockerContainer where
245 resourceId = containerId
247instance FromJSON DockerContainer where
248 parseJSON (Object v) =
249 DockerContainer <$> (ResourceId <$> (v .: "Id"))
250 <*> (ResourceId <$> (v .: "Id"))
257-- instance FromJSON CreateContainerResponse where
258-- parseJSON (Object v) =
259-- CreateContainerResponse <$> (v .: "Id")
260-- <*> (v .:? "warnings")
262$(deriveJSON dopts ''DockerVersion)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list