@@ -1,7 +1,7 @@
1{-# LANGUAGE RecordWildCards #-}
1{-# LANGUAGE RecordWildCards #-}
2{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
4−module Docker.Types (
4+module Docker.Client.Types (
5 Endpoint(..)
5 Endpoint(..)
7 , ApiVersion
7 , ApiVersion
@@ -34,6 +34,7 @@ module Docker.Types (
34 , StartOpts(..)
34 , StartOpts(..)
35 , defaultStartOpts
35 , defaultStartOpts
36 , DeleteOpts(..)
36 , DeleteOpts(..)
37 , Timestamp
38 , Timestamp
38 , TailLogOpt(..)
39 , TailLogOpt(..)
39 , LogOpts(..)
40 , LogOpts(..)
@@ -49,7 +50,7 @@ module Docker.Types (
49 , LogDriverConfig(..)
50 , LogDriverConfig(..)
50 , NetworkMode(..)
51 , NetworkMode(..)
51 , PortType(..)
52 , PortType(..)
52− , NetworkInterface(..)
53+-- , NetworkInterface(..)
53 , Networks(..)
54 , Networks(..)
54 , NetworkSettings(..)
55 , NetworkSettings(..)
55 , NetworkOptions(..)
56 , NetworkOptions(..)
@@ -73,6 +74,8 @@ module Docker.Types (
73 , ContainerConfig(..)
74 , ContainerConfig(..)
74 , defaultContainerConfig
75 , defaultContainerConfig
75 , ExposedPorts(..)
76 , ExposedPorts(..)
78import Data.Aeson (FromJSON, ToJSON, genericParseJSON,
81import Data.Aeson (FromJSON, ToJSON, genericParseJSON,
@@ -102,7 +105,8 @@ data Endpoint =
102 | RestartContainerEndpoint Timeout ContainerID
105 | RestartContainerEndpoint Timeout ContainerID
103 | PauseContainerEndpoint ContainerID
106 | PauseContainerEndpoint ContainerID
104 | UnpauseContainerEndpoint ContainerID
107 | UnpauseContainerEndpoint ContainerID
105− | ContainerLogsEndpoint LogOpts Bool ContainerID -- Second argument (Bool) is whether to follow.
108+ | ContainerLogsEndpoint LogOpts Bool ContainerID -- ^ Second argument (Bool) is whether to follow which is currently hardcoded to False.
109+ -- See note in 'Docker.Client.Api.getContainerLogs' for explanation why.
106 | DeleteContainerEndpoint DeleteOpts ContainerID
110 | DeleteContainerEndpoint DeleteOpts ContainerID
107 | InspectContainerEndpoint ContainerID
111 | InspectContainerEndpoint ContainerID
108 deriving (Eq, Show)
112 deriving (Eq, Show)
@@ -253,7 +257,7 @@ data DockerClientOpts = DockerClientOpts {
254defaultClientOpts :: DockerClientOpts
258defaultClientOpts :: DockerClientOpts
255defaultClientOpts = DockerClientOpts {
259defaultClientOpts = DockerClientOpts {
256− apiVer = "v1.23"
260+ apiVer = "v1.24"
257 , baseUrl = "http://127.0.0.1:2375"
261 , baseUrl = "http://127.0.0.1:2375"
@@ -282,11 +286,8 @@ instance FromJSON DockerVersion where
282 parseJSON = genericParseJSON defaultOptions {
286 parseJSON = genericParseJSON defaultOptions {
283 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
287 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
285−-- instance ToJSON ContainerDetails where
286−-- toJSON = error "TODO"
288instance FromJSON ContainerDetails where
289instance FromJSON ContainerDetails where
289− parseJSON (JSON.Object o) = do
290+ parseJSON v@(JSON.Object o) = do
290 appArmor <- o .: "AppArmorProfile"
291 appArmor <- o .: "AppArmorProfile"
291 args <- o .: "Args"
292 args <- o .: "Args"
292 config <- o .: "Config"
293 config <- o .: "Config"
@@ -296,7 +297,7 @@ instance FromJSON ContainerDetails where
296 hostnamePath <- o .: "HostnamePath"
297 hostnamePath <- o .: "HostnamePath"
297 hostsPath <- o .: "HostsPath"
298 hostsPath <- o .: "HostsPath"
298 logPath <- o .: "LogPath"
299 logPath <- o .: "LogPath"
299− id <- o .: "Id"
300+ id <- parseJSON v
300 image <- o .: "Image"
301 image <- o .: "Image"
301 mountLabel <- o .: "MountLabel"
302 mountLabel <- o .: "MountLabel"
302 name <- o .: "Name"
303 name <- o .: "Name"
@@ -396,24 +397,24 @@ instance FromJSON Networks where
396 parseJSON _ = fail "Networks is not an object"
397 parseJSON _ = fail "Networks is not an object"
398data NetworkSettings = NetworkSettings {
399data NetworkSettings = NetworkSettings {
399− networkSettingsBridge :: Text
400+ networkSettingsBridge :: Text
400− , networkSettingsSandboxId :: Text
401+ , networkSettingsSandboxId :: Text
401− , networkSettingsHairpinMode :: Bool
402+ , networkSettingsHairpinMode :: Bool
402− , networkSettingsLinkLocalIPv6Address :: Text
403+ , networkSettingsLinkLocalIPv6Address :: Text
403 , networkSettingsLinkLocalIPv6PrefixLen :: Int
404 , networkSettingsLinkLocalIPv6PrefixLen :: Int
404− , networkSettingsPorts :: [Port] -- TODO: 1.24 spec is unclear
405+ , networkSettingsPorts :: PortBindings
405− , networkSettingsSandboxKey :: Text
406+ , networkSettingsSandboxKey :: Text
406− , networkSettingsSecondaryIPAddresses :: Maybe [Text] -- TODO: 1.24 spec is unclear
407+ , networkSettingsSecondaryIPAddresses :: Maybe [Text] -- TODO: 1.24 spec is unclear
407 , networkSettingsSecondaryIPv6Addresses :: Maybe [Text] -- TODO: 1.24 spec is unclear
408 , networkSettingsSecondaryIPv6Addresses :: Maybe [Text] -- TODO: 1.24 spec is unclear
408− , networkSettingsEndpointID :: Text
409+ , networkSettingsEndpointID :: Text
409− , networkSettingsGateway :: Text
410+ , networkSettingsGateway :: Text
410− , networkSettingsGlobalIPv6Address :: Text
411+ , networkSettingsGlobalIPv6Address :: Text
411− , networkSettingsGlobalIPv6PrefixLen :: Int
412+ , networkSettingsGlobalIPv6PrefixLen :: Int
412− , networkSettingsIpAddress :: Text
413+ , networkSettingsIpAddress :: Text
413− , networkSettingsIpPrefixLen :: Int
414+ , networkSettingsIpPrefixLen :: Int
414− , networkSettingsIpv6Gateway
415+ , networkSettingsIpv6Gateway :: Text
415− , networkSettingsMacAddress
416+ , networkSettingsMacAddress :: Text
416− , networkSettingsNetworks :: Networks
417+ , networkSettingsNetworks :: Networks
418 deriving (Eq, Show)
419 deriving (Eq, Show)
@@ -424,7 +425,7 @@ instance FromJSON NetworkSettings where
424 hairpin <- o .: "HairpinMode"
425 hairpin <- o .: "HairpinMode"
425 localIP6 <- o .: "LinkLocalIPv6Address"
426 localIP6 <- o .: "LinkLocalIPv6Address"
426 localIP6Len <- o .: "LinkLocalIPv6PrefixLen"
427 localIP6Len <- o .: "LinkLocalIPv6PrefixLen"
427− ports <- o .:? "Ports" .!= []
428+ ports <- o .: "Ports" -- .!= []
428 sandboxKey <- o .: "SandboxKey"
429 sandboxKey <- o .: "SandboxKey"
429 secondaryIP <- o .: "SecondaryIPAddresses"
430 secondaryIP <- o .: "SecondaryIPAddresses"
430 secondayIP6 <- o .: "SecondaryIPv6Addresses"
431 secondayIP6 <- o .: "SecondaryIPv6Addresses"
@@ -438,7 +439,7 @@ instance FromJSON NetworkSettings where
438 mac <- o .: "MacAddress"
439 mac <- o .: "MacAddress"
439 networks <- o .: "Networks"
440 networks <- o .: "Networks"
440 return $ NetworkSettings bridge sandbox hairpin localIP6 localIP6Len ports sandboxKey secondaryIP secondayIP6 endpointID gateway globalIP6 globalIP6Len ip ipLen ip6Gateway mac networks
441 return $ NetworkSettings bridge sandbox hairpin localIP6 localIP6Len ports sandboxKey secondaryIP secondayIP6 endpointID gateway globalIP6 globalIP6Len ip ipLen ip6Gateway mac networks
441− parseJSON _ = fail "NetworkSettings is not an Object"
442+ parseJSON _ = fail "NetworkSettings is not an object."
443data Container = Container
444data Container = Container
444 { containerId :: ContainerID
445 { containerId :: ContainerID
@@ -539,7 +540,7 @@ defaultContainerConfig imageName = ContainerConfig {
539 , attachStdout=False
540 , attachStdout=False
540 , image=imageName
541 , image=imageName
541 , attachStderr=False
542 , attachStderr=False
542− , exposedPorts=ExposedPorts M.empty
543+ , exposedPorts=Nothing -- ExposedPorts M.empty
543 , tty=False
544 , tty=False
544 , openStdin=False
545 , openStdin=False
545 , stdinOnce=False
546 , stdinOnce=False
@@ -548,7 +549,7 @@ defaultContainerConfig imageName = ContainerConfig {
548 , volumes=Nothing
549 , volumes=Nothing
549 , workingDir=Nothing
550 , workingDir=Nothing
550 , entrypoint=Nothing
551 , entrypoint=Nothing
551− , networkDisabled=False
552+ , networkDisabled=Nothing
552 , macAddress=Nothing
553 , macAddress=Nothing
553 , labels=Nothing
554 , labels=Nothing
554 , stopSignal=SIGTERM
555 , stopSignal=SIGTERM
@@ -575,7 +576,7 @@ defaultHostConfig = HostConfig {
575 , oomScoreAdj=Nothing
576 , oomScoreAdj=Nothing
576 , privileged=False
577 , privileged=False
577 , publishAllPorts=False
578 , publishAllPorts=False
578− , readOnlyRootfs=False
579+ , readonlyRootfs=False
579 , securityOpt=[]
580 , securityOpt=[]
580 , shmSize=Nothing
581 , shmSize=Nothing
581 , resources=defaultContainerResources
582 , resources=defaultContainerResources
@@ -616,10 +617,13 @@ defaultStartOpts :: StartOpts
616defaultStartOpts = StartOpts { detachKeys = DefaultDetachKey }
617defaultStartOpts = StartOpts { detachKeys = DefaultDetachKey }
618data DeleteOpts = DeleteOpts {
619data DeleteOpts = DeleteOpts {
619− deleteVolumes :: Bool
620+ deleteVolumes :: Bool -- ^ Automatically cleanup volumes that the container created as well.
620− , force :: Bool
621+ , force :: Bool -- ^ If the container is still running force deletion anyway.
621 } deriving (Eq, Show)
622 } deriving (Eq, Show)
624+defaultDeleteOpts :: DeleteOpts
625+defaultDeleteOpts = DeleteOpts { deleteVolumes = False, force = False }
623type Timestamp = Integer
627type Timestamp = Integer
624data TailLogOpt = Tail Integer | All deriving (Eq, Show)
628data TailLogOpt = Tail Integer | All deriving (Eq, Show)
@@ -804,14 +808,14 @@ instance FromJSON PortType where
804 "udp" -> return UDP
808 "udp" -> return UDP
805 _ -> fail "PortType: Invalid port type."
809 _ -> fail "PortType: Invalid port type."
807−newtype NetworkInterface = NetworkInterface Text deriving (Eq, Show)
811+-- newtype NetworkInterface = NetworkInterface Text deriving (Eq, Show)
809−instance FromJSON NetworkInterface where
813+-- instance FromJSON NetworkInterface where
810− parseJSON (JSON.String v) = return $ NetworkInterface v
814+-- parseJSON (JSON.String v) = return $ NetworkInterface v
811− parseJSON _ = fail "Network interface is not a string."
815+-- parseJSON _ = fail "Network interface is not a string."
813−instance ToJSON NetworkInterface where
817+-- instance ToJSON NetworkInterface where
814− toJSON (NetworkInterface i) = JSON.String i
818+-- toJSON (NetworkInterface i) = JSON.String i
816-- | This datastructure models mapping a Port from the container onto the
820-- | This datastructure models mapping a Port from the container onto the
817-- host system s that the service running in the container can be accessed from
821-- host system s that the service running in the container can be accessed from
@@ -824,7 +828,7 @@ newtype PortBindings = PortBindings [PortBinding]
824data PortBinding = PortBinding {
828data PortBinding = PortBinding {
825 containerPort :: Port
829 containerPort :: Port
826 , portType :: PortType
830 , portType :: PortType
827− , hostPorts :: HostPorts
831+ , hostPorts :: [HostPort]
828 } deriving (Eq, Show)
832 } deriving (Eq, Show)
@@ -854,37 +858,39 @@ instance ToJSON PortBindings where
854 toJSON (PortBindings []) = JSON.Object HM.empty
858 toJSON (PortBindings []) = JSON.Object HM.empty
855 toJSON (PortBindings (p:ps)) = toJSON (p:ps)
859 toJSON (PortBindings (p:ps)) = toJSON (p:ps)
857−data HostPort = HostPort NetworkInterface Port
861+data HostPort = HostPort {
858 deriving (Eq, Show)
865 deriving (Eq, Show)
860instance ToJSON HostPort where
867instance ToJSON HostPort where
861− toJSON (HostPort i p) = object ["HostPort" .= p, "HostIP" .= i]
868+ toJSON (HostPort i p) = object ["HostPort" .= show p, "HostIp" .= i]
863instance FromJSON HostPort where
870instance FromJSON HostPort where
864 parseJSON (JSON.Object o) = do
871 parseJSON (JSON.Object o) = do
865− p <- o .: "HostPort"
872+ p <- o .: "HostPort" >>= parseIntegerText
866− i <- o .: "HostIP"
873+ i <- o .: "HostIp"
867 return $ HostPort i p
874 return $ HostPort i p
868 parseJSON _ = fail "HostPort is not an object."
875 parseJSON _ = fail "HostPort is not an object."
870−newtype HostPorts = HostPorts [HostPort]
877+-- newtype HostPorts = HostPorts [HostPort]
871− deriving (Eq, Show)
878+-- deriving (Eq, Show)
874−instance ToJSON HostPorts where
880+-- instance ToJSON HostPorts where
875− toJSON (HostPorts hps) = toJSON hps
881+-- toJSON (HostPorts hps) = toJSON hps
877−instance FromJSON HostPorts where
883+-- instance FromJSON HostPorts where
878− parseJSON (JSON.Object o) = do
884+-- parseJSON (JSON.Object o) = do
879− HostPorts <$> HM.foldlWithKey' f (return []) o
885+-- HostPorts <$> HM.foldlWithKey' f (return []) o
882− f accM k v = do
888+-- f accM k v = do
883− acc <- accM
889+-- acc <- accM
884− p' <- parseJSON v
890+-- p' <- parseJSON v
885− p <- parseIntegerText p'
891+-- p <- parseIntegerText p'
886− return $ (HostPort (NetworkInterface k) p):acc
892+-- return $ (HostPort (NetworkInterface k) p):acc
887− parseJSON _ = fail "HostPorts is not an object"
893+-- parseJSON _ = fail $ "HostPorts is not an object"
889-- { "Name": "on-failure" , "MaximumRetryCount": 2}
895-- { "Name": "on-failure" , "MaximumRetryCount": 2}
890type RetryCount = Integer
896type RetryCount = Integer
@@ -899,7 +905,7 @@ instance FromJSON RestartPolicy where
899 "on-failure" -> do
905 "on-failure" -> do
900 retry <- o .: "MaximumRetryCount"
906 retry <- o .: "MaximumRetryCount"
901 return $ RestartOnFailure retry
907 return $ RestartOnFailure retry
902− "" -> return RestartOff -- Note: Is this correct? 1.24 spec is unclear.
908+ "off" -> return RestartOff
903 _ -> fail "Could not parse RestartPolicy"
909 _ -> fail "Could not parse RestartPolicy"
904 parseJSON _ = fail "RestartPolicy is not an object"
910 parseJSON _ = fail "RestartPolicy is not an object"
@@ -938,7 +944,7 @@ data HostConfig = HostConfig
938 -- , pidMode :: Text -- 1.24: Don't see pidMode, just pidsLimit
944 -- , pidMode :: Text -- 1.24: Don't see pidMode, just pidsLimit
939 , privileged :: Bool
945 , privileged :: Bool
940 , publishAllPorts :: Bool
946 , publishAllPorts :: Bool
941− , readOnlyRootfs :: Bool
947+ , readonlyRootfs :: Bool
942 , securityOpt :: [Text]
948 , securityOpt :: [Text]
943 -- , utsMode :: UTSMode -- 1.24: Don't see this
949 -- , utsMode :: UTSMode -- 1.24: Don't see this
944 , shmSize :: Maybe Integer
950 , shmSize :: Maybe Integer
@@ -948,12 +954,84 @@ data HostConfig = HostConfig
948 } deriving (Eq, Show, Generic)
954 } deriving (Eq, Show, Generic)
950instance FromJSON HostConfig where
956instance FromJSON HostConfig where
951− parseJSON = genericParseJSON defaultOptions {
957+ parseJSON v@(JSON.Object o) = HostConfig
952− fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
958+ <$> o .: "Binds"
959+ <*> o .: "ContainerIDFile"
960+ <*> o .: "LogConfig"
961+ <*> o .: "NetworkMode"
962+ <*> o .: "PortBindings"
963+ <*> o .: "RestartPolicy"
964+ <*> o .: "VolumeDriver"
965+ <*> o .: "VolumesFrom"
969+ <*> o .: "DnsOptions"
970+ <*> o .: "DnsSearch"
971+ <*> o .: "ExtraHosts"
973+ <*> o .:? "Links" .!= []
974+ <*> o .: "OomScoreAdj"
975+ <*> o .: "Privileged"
976+ <*> o .: "PublishAllPorts"
977+ <*> o .: "ReadonlyRootfs"
978+ <*> o .: "SecurityOpt"
981+ parseJSON _ = fail "HostConfig is not an object."
954instance ToJSON HostConfig where
983instance ToJSON HostConfig where
955− toJSON = genericToJSON defaultOptions {
984+ toJSON HostConfig{..} =
956− fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
985+ let arr = [
987+ , "ContainerIDFile" .= containerIDFile
988+ , "LogConfig" .= logConfig
989+ , "NetworkMode" .= networkMode
990+ , "PortBindings" .= portBindings
991+ , "RestartPolicy" .= restartPolicy
992+ , "VolumeDriver" .= volumeDriver
993+ , "VolumesFrom" .= volumesFrom
994+ , "CapAdd" .= capAdd
995+ , "CapDrop" .= capDrop
997+ , "DnsOptions" .= dnsOptions
998+ , "DnsSearch" .= dnsSearch
999+ , "ExtraHosts" .= extraHosts
1000+ , "IpcMode" .= ipcMode
1002+ , "OomScoreAdj" .= oomScoreAdj
1003+ , "Privileged" .= privileged
1004+ , "PublishAllPorts" .= publishAllPorts
1005+ , "ReadonlyRootfs" .= readonlyRootfs
1006+ , "SecurityOpt" .= securityOpt
1007+ , "ShmSize" .= shmSize
1010+ object $ arr <> ( resourcesArr resources)
1013+ -- JP: Not sure if this is better than a separate ToJSON instance with a bunch of `HM.insert`s.
1014+ resourcesArr ContainerResources{..} = [
1015+ "CpuShares" .= cpuShares
1016+ , "BlkioWeight" .= blkioWeight
1017+ , "BlkioWeightDevice" .= blkioWeightDevice
1018+ , "BlkioDeviceReadBps" .= blkioDeviceReadBps
1019+ , "BlkioDeviceWriteBps" .= blkioDeviceWriteBps
1020+ , "BlkioDeviceReadIOps" .= blkioDeviceReadIOps
1021+ , "BlkioDeviceWriteIOps" .= blkioDeviceWriteIOps
1022+ , "CpuPeriod" .= cpuPeriod
1023+ , "CpusetCpus" .= cpusetCpus
1024+ , "CpusetMems" .= cpusetMems
1025+ , "Devices" .= devices
1026+ , "KernelMemory" .= kernelMemory
1027+ , "Memory" .= memory
1028+ , "MemoryReservation" .= memoryReservation
1029+ , "MemorySwap" .= memorySwap
1030+ , "OomKillDisable" .= oomKillDisable
1031+ , "Ulimits" .= ulimits
959-- { "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> }
1037-- { "Name": <name>, "Soft": <soft limit>, "Hard": <hard limit> }
@@ -972,18 +1050,54 @@ instance ToJSON Ulimit where
972 toJSON = genericToJSON defaultOptions {
1050 toJSON = genericToJSON defaultOptions {
973 fieldLabelModifier = drop 5}
1051 fieldLabelModifier = drop 5}
1053+data DeviceWeight = DeviceWeight {
1054+ deviceWeightPath :: FilePath
1055+ , deviceWeightWeight :: Text
1057+ deriving (Show, Eq)
1059+instance FromJSON DeviceWeight where
1060+ parseJSON (JSON.Object o) = DeviceWeight
1063+ parseJSON _ = fail "DeviceWeight is not an object."
1065+instance ToJSON DeviceWeight where
1066+ toJSON (DeviceWeight p w) = object [
1071+data DeviceRate = DeviceRate {
1072+ deviceRatePath :: FilePath
1073+ , deviceRateRate :: Text
1075+ deriving (Show, Eq)
1077+instance FromJSON DeviceRate where
1078+ parseJSON (JSON.Object o) = DeviceRate
1081+ parseJSON _ = fail "DeviceRate is not an object."
1083+instance ToJSON DeviceRate where
1084+ toJSON (DeviceRate p r) = object [
975data ContainerResources = ContainerResources {
1089data ContainerResources = ContainerResources {
976 cpuShares :: Maybe Integer
1090 cpuShares :: Maybe Integer
977 -- , cgroupParent :: Text -- 1.24: Missing from inspecting container details... Going to omit for now.
1091 -- , cgroupParent :: Text -- 1.24: Missing from inspecting container details... Going to omit for now.
978− , blkioWeight :: Maybe Text
1092+ , blkioWeight :: Maybe Integer
979− , blkioWeightDevice :: Maybe Text
1093+ , blkioWeightDevice :: Maybe [DeviceWeight]
980− , blkioDeviceReadBps :: Maybe Text
1094+ , blkioDeviceReadBps :: Maybe [DeviceRate] -- TODO: Not Text
981− , blkioDeviceWriteBps :: Maybe Text
1095+ , blkioDeviceWriteBps :: Maybe [DeviceRate] -- TODO: Not Text
982− , blkioDeviceReadIOps :: Maybe Text
1096+ , blkioDeviceReadIOps :: Maybe [DeviceRate] -- TODO: Not Text
983− , blkioDeviceWriteIOps :: Maybe Text
1097+ , blkioDeviceWriteIOps :: Maybe [DeviceRate] -- TODO: Not Text
984 , cpuPeriod :: Maybe Integer
1098 , cpuPeriod :: Maybe Integer
985 -- , cpuQuota :: Integer -- 1.24: Missing from inspecting container details... Going to omit for now.
1099 -- , cpuQuota :: Integer -- 1.24: Missing from inspecting container details... Going to omit for now.
986− , cpusetCpus :: Maybe Integer
1100+ , cpusetCpus :: Maybe Text
987 , cpusetMems :: Maybe Text
1101 , cpusetMems :: Maybe Text
988 , devices :: [Device]
1102 , devices :: [Device]
989 -- , diskQuota :: Integer -- Don't see this ins 1.24.
1103 -- , diskQuota :: Integer -- Don't see this ins 1.24.
@@ -1006,13 +1120,13 @@ data ContainerResources = ContainerResources {
1006 -- LxcConf :: [??] +
1120 -- LxcConf :: [??] +
1007 } deriving (Eq, Show, Generic)
1121 } deriving (Eq, Show, Generic)
1009−instance ToJSON ContainerResources where
1123+-- instance ToJSON ContainerResources where
1010− toJSON = genericToJSON defaultOptions {
1124+-- toJSON = genericToJSON defaultOptions {
1011− fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1125+-- fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1013instance FromJSON ContainerResources where
1127instance FromJSON ContainerResources where
1014 parseJSON = genericParseJSON defaultOptions {
1128 parseJSON = genericParseJSON defaultOptions {
1015− fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1129+ fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1017type Port = Integer
1131type Port = Integer
@@ -1074,7 +1188,7 @@ data ContainerConfig = ContainerConfig {
1074 , attachStdin :: Bool
1188 , attachStdin :: Bool
1075 , attachStdout :: Bool
1189 , attachStdout :: Bool
1076 , attachStderr :: Bool
1190 , attachStderr :: Bool
1077− , exposedPorts :: ExposedPorts
1191+ , exposedPorts :: Maybe ExposedPorts -- Note: Should we expand the JSON instance and take away the Maybe?
1078 -- , publishService :: Text -- Don't see this in 1.24
1192 -- , publishService :: Text -- Don't see this in 1.24
1079 , tty :: Bool
1193 , tty :: Bool
1080 , openStdin :: Bool
1194 , openStdin :: Bool
@@ -1086,9 +1200,9 @@ data ContainerConfig = ContainerConfig {
1086 , volumes :: Maybe Volumes
1200 , volumes :: Maybe Volumes
1087 , workingDir :: Maybe FilePath
1201 , workingDir :: Maybe FilePath
1088 , entrypoint :: Maybe Text -- Can be null?
1202 , entrypoint :: Maybe Text -- Can be null?
1089− , networkDisabled :: Bool
1203+ , networkDisabled :: Maybe Bool -- Note: Should we expand the JSON instance and take away the Maybe? Null is False?
1090 , macAddress :: Maybe Text
1204 , macAddress :: Maybe Text
1091− -- , onBuild :: Text -- For 1.24, only see this in the inspect response.
1205+ -- , onBuild :: Maybe Text -- For 1.24, only see this in the inspect response.
1092 , labels :: Maybe Labels
1206 , labels :: Maybe Labels
1093 , stopSignal :: Signal
1207 , stopSignal :: Signal
1094 } deriving (Eq, Show, Generic)
1208 } deriving (Eq, Show, Generic)
@@ -1101,7 +1215,7 @@ instance FromJSON ContainerConfig where
1101 parseJSON = genericParseJSON defaultOptions {
1215 parseJSON = genericParseJSON defaultOptions {
1102 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1216 fieldLabelModifier = (\(x:xs) -> toUpper x : xs)}
1104−parseIntegerText :: (Monad m) =>Text -> m Integer
1218+parseIntegerText :: (Monad m) => Text -> m Integer
1105parseIntegerText t = case readMaybe $ T.unpack t of
1219parseIntegerText t = case readMaybe $ T.unpack t of
1106 Nothing ->
1220 Nothing ->
1107 fail "Could not parse Integer"
1221 fail "Could not parse Integer"