@@ -5,7 +5,7 @@ import Control.Monad.Except (ExceptT, runExceptT)
5import Control.Monad.Reader (ReaderT, runReaderT)
5import Control.Monad.Reader (ReaderT, runReaderT)
6import Data.Aeson (FromJSON, ToJSON, decode, encode,
6import Data.Aeson (FromJSON, ToJSON, decode, encode,
7 genericParseJSON, genericToJSON, object,
7 genericParseJSON, genericToJSON, object,
8− parseJSON, toJSON, (.:), (.=))
8+ parseJSON, toJSON, (.:), (.:?), (.=))
9import qualified Data.Aeson as JSON
9import qualified Data.Aeson as JSON
10import Data.Aeson.Types (defaultOptions, fieldLabelModifier)
10import Data.Aeson.Types (defaultOptions, fieldLabelModifier)
11import qualified Data.ByteString.Lazy as BL
11import qualified Data.ByteString.Lazy as BL
@@ -97,8 +97,64 @@ instance FromJSON DockerVersion where
97 parseJSON = genericParseJSON defaultOptions {
97 parseJSON = genericParseJSON defaultOptions {
98 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
98 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
101+data ContainerPortInfo = ContainerPortInfo {
102+ ipAddressInfo :: Maybe Text
103+ , privatePortInfo :: Port
104+ , publicPortInfo :: Maybe Port
105+ , portTypeInfo :: Maybe PortType
106+ } deriving (Eq, Show)
108+instance FromJSON ContainerPortInfo where
109+ parseJSON (JSON.Object v) =
110+ ContainerPortInfo <$> (v .:? "IP")
111+ <*> (v .: "PrivatePort")
112+ <*> (v .:? "PublicPort")
115+-- data NetworkOptions = NetworkOptions {
116+-- ipamConfig :: Maybe Text
117+-- , links :: Maybe Text
118+-- , aliases :: Maybe Text
119+-- , networkId :: Text
120+-- , endpointId :: Text
122+-- , ipAddress :: Text
123+-- , ipPrefixLen :: Text
124+-- , ipV6Gateway :: Maybe Text
125+-- , globalIPv6Address :: Maybe Text
126+-- , globalIPv6PrefixLen :: Maybe Text
127+-- , macAddress :: Text
128+-- } deriving (Eq, Show)
130+-- data Network = Network (M.Map NetworkMode NetworkOptions) deriving (Eq, Show)
132+-- data NetworkSettings = NetworkSettings {
136+-- , linkLocalIPv6Address
137+-- , linkLocalIPv6PrefixLen
140+-- , secondaryIPAddresses
141+-- , secondaryIPv6Addresses
144+-- , globalIPv6Address
145+-- , globalIPv6PrefixLen
150+-- , networks :: [Network]
153+-- data NetworkSettings = NetworkSettings (M.Map Text Text) deriving (Eq, Show, Generic)
155+-- instance FromJSON NetworkSettings
100-- TODO: Add NetworkSettings
157-- TODO: Add NetworkSettings
101−-- TODO: Add PortBindings
102data Container = Container
158data Container = Container
103 { containerId :: ContainerID
159 { containerId :: ContainerID
104 , containerNames :: [Text]
160 , containerNames :: [Text]
@@ -107,9 +163,9 @@ data Container = Container
107 , containerCommand :: Text
163 , containerCommand :: Text
108 , containerCreatedAt :: Int
164 , containerCreatedAt :: Int
109 , containerStatus :: Text
165 , containerStatus :: Text
110− -- , containerPorts :: Text
166+ , containerPorts :: [ContainerPortInfo]
111 , containerLabels :: Labels
167 , containerLabels :: Labels
112− -- , containerNetworkSettings :: Text
168+ -- , containerNetworkSettings :: NetworkSettings
113 } deriving (Show, Eq)
169 } deriving (Show, Eq)
115instance FromJSON Container where
171instance FromJSON Container where
@@ -121,12 +177,10 @@ instance FromJSON Container where
121 <*> (v .: "Command")
177 <*> (v .: "Command")
122 <*> (v .: "Created")
178 <*> (v .: "Created")
123 <*> (v .: "Status")
179 <*> (v .: "Status")
124− -- <*> (v .: "Ports")
180+ <*> (v .: "Ports")
125 <*> (v .: "Labels")
181 <*> (v .: "Labels")
126 -- <*> (v .: "NetworkSettings")
182 -- <*> (v .: "NetworkSettings")
130data Status = Created | Restarting | Running | Paused | Exited | Dead deriving (Eq, Show, Generic)
184data Status = Created | Restarting | Running | Paused | Exited | Dead deriving (Eq, Show, Generic)
132instance FromJSON Status
186instance FromJSON Status
@@ -160,7 +214,11 @@ instance FromJSON Image where
160 parseJSON = genericParseJSON defaultOptions {
214 parseJSON = genericParseJSON defaultOptions {
161 fieldLabelModifier = dropImagePrefix}
215 fieldLabelModifier = dropImagePrefix}
163−data CreateOpts = CreateOpts
217+data CreateOpts = CreateOpts {
218+ containerConfig :: ContainerConfig
219+ , hostConfig :: HostConfig
220+ , containerResources :: ContainerResources
221+ } deriving (Eq, Show)
165-- detachKeys – Override the key sequence for detaching a container.
223-- detachKeys – Override the key sequence for detaching a container.
166-- Format is a single character [a-Z] or ctrl-<value> where <value> is one of: a-z, @, ^, [, , or _.
224-- Format is a single character [a-Z] or ctrl-<value> where <value> is one of: a-z, @, ^, [, , or _.
@@ -224,8 +282,8 @@ data Link = Link Text (Maybe Text) deriving (Eq, Show)
225instance ToJSON Link where
283instance ToJSON Link where
226 toJSON (Link n1 n2) = toJSON $ case n2 of
284 toJSON (Link n1 n2) = toJSON $ case n2 of
227− Nothing -> T.concat[n1, ":", n1]
285+ Nothing -> T.concat[n1, ":", n1] -- use same name in container
228− Just n -> T.concat[n1, ":", n]
286+ Just n -> T.concat[n1, ":", n] -- used specified name in container
230-- { "Type": "<driver_name>", "Config": {"key1": "val1"} }
288-- { "Type": "<driver_name>", "Config": {"key1": "val1"} }
231data LogDriverType = JsonFile | Syslog | Journald | Gelf | AwsLogs | Splunk | LoggingDisabled deriving (Eq, Show)
289data LogDriverType = JsonFile | Syslog | Journald | Gelf | AwsLogs | Splunk | LoggingDisabled deriving (Eq, Show)
@@ -237,13 +295,22 @@ data LogDriverConfig = LogDriverConfig LogDriverType (Maybe LogDriverOptions) de
237-- TODO: Add container:<name|id> mode
295-- TODO: Add container:<name|id> mode
238data NetworkMode = Bridge | Host | NetworkDisabled deriving (Eq, Show)
296data NetworkMode = Bridge | Host | NetworkDisabled deriving (Eq, Show)
240−data PortType = TCP | UDP deriving (Eq, Show)
298+data PortType = TCP | UDP deriving (Eq, Show, Generic)
300+instance ToJSON PortType where
304+instance FromJSON PortType where
305+ parseJSON val = return $ case val of
242newtype NetworkInterface = NetworkInterface Text deriving (Eq, Show)
309newtype NetworkInterface = NetworkInterface Text deriving (Eq, Show)
244-- { <port>/<protocol>: [{ "HostPort": "<port>" }] }
311-- { <port>/<protocol>: [{ "HostPort": "<port>" }] }
245data PortBinding = PortBinding {
312data PortBinding = PortBinding {
246− containerPort :: Integer
313+ containerPort :: Port
247 , portType :: PortType
314 , portType :: PortType
248 , hostPort :: [HostPort]
315 , hostPort :: [HostPort]
249 } deriving (Eq, Show)
316 } deriving (Eq, Show)