@@ -76,15 +76,6 @@ module Docker.Client.Types (
7676 , HostConfig(..)
7777 , defaultHostConfig
7878 , NetworkingConfig(..)
79− , NetworkScope(..)
80− , CIDR(..)
81− , IPAMDriver(..)
82− , IPAMConfig(..)
83− , IPAM(..)
84− , NetworkContainer(..)
85− , NetworkDetails(..)
86− , NetworkType(..)
87− , NetworkFilter(..)
8879 , EndpointConfig(..)
8980 , Ulimit(..)
9081 , ContainerResources(..)
@@ -123,7 +114,6 @@ import qualified Data.Text as T
123114import Data.Time.Clock (UTCTime)
124115import qualified Data.Vector as V
125116import GHC.Generics (Generic)
126−import Numeric (readDec)
127117import Prelude hiding (all, tail)
128118import Text.Read (readMaybe)
129119
@@ -149,7 +139,6 @@ data Endpoint =
149139 | DeleteImageEndpoint ImageDeleteOpts ImageID
150140 | CreateNetworkEndpoint CreateNetworkOpts
151141 | RemoveNetworkEndpoint NetworkID
152− | ListNetworksEndpoint [NetworkFilter]
153142 deriving (Eq, Show)
154143
155144-- | We should newtype this
@@ -869,153 +858,6 @@ instance ToJSON CreateNetworkOpts where
869858 , "EnableIPv6" .= createNetworkEnableIPv6 opts
870859 ]
871860
872−data NetworkScope = LocalScope | GlobalScope | SwarmScope deriving (Eq, Show)
873−
874−fromNetworkScope :: NetworkScope -> Text
875−fromNetworkScope LocalScope = "local"
876−fromNetworkScope GlobalScope = "global"
877−fromNetworkScope SwarmScope = "swarm"
878−
879−instance ToJSON NetworkScope where
880− toJSON = JSON.String . fromNetworkScope
881−
882−instance FromJSON NetworkScope where
883− parseJSON "local" = return LocalScope
884− parseJSON "global" = return GlobalScope
885− parseJSON "swarm" = return SwarmScope
886− parseJSON _ = fail "Failed to parse NetworkScope"
887−
888−data CIDR = CIDR Text Int deriving (Eq, Show)
889−
890−instance FromJSON CIDR where
891− parseJSON (JSON.String t) = case T.splitOn "/" t of
892− [a,p] -> CIDR a <$> parsePrefixLen p
893− _ -> fail "Failed to parse CIDR"
894− where
895− parsePrefixLen p = case readDec (T.unpack p) of
896− (n,""):_ -> return n
897− _ -> fail "Failed to parse CIDR prefix length"
898− parseJSON _ = fail "Failed to parse CIDR"
899−
900−data IPAMDriver = DefaultIPAMDriver | NamedIPAMDriver Text deriving (Eq, Show)
901−
902−instance FromJSON IPAMDriver where
903− parseJSON (JSON.String "default") = return DefaultIPAMDriver
904− parseJSON (JSON.String t) = return $ NamedIPAMDriver t
905− parseJSON _ = fail "IPAMDriver is not a string"
906−
907−data IPAMConfig = IPAMConfig
908− { ipamConfigSubnet :: CIDR
909− , ipamConfigIPRange :: Maybe CIDR
910− , ipamSubnetGateway :: Maybe Text
911− , ipamConfigAuxAddress :: Maybe Text
912− } deriving (Eq, Show)
913−
914−instance FromJSON IPAMConfig where
915− parseJSON (JSON.Object o) = IPAMConfig
916− <$> o .: "Subnet"
917− <*> o .:? "IPRange"
918− <*> o .:? "Gateway"
919− <*> o .:? "AuxAddress"
920− parseJSON _ = fail "IPAMConfig is not an object"
921−
922−data IPAM = IPAM
923− { ipamDriver :: IPAMDriver
924− , ipamConfig :: [IPAMConfig]
925− , ipamOptions :: HM.HashMap Text Text
926− } deriving (Eq, Show)
927−
928−instance FromJSON IPAM where
929− parseJSON (JSON.Object o) = IPAM
930− <$> o .:? "Driver" .!= DefaultIPAMDriver
931− <*> o .:? "Config" .!= []
932− <*> o .:? "Options" .!= HM.empty
933− parseJSON _ = fail "IPAM is not an object"
934−
935−data NetworkContainer = NetworkContainer
936− { networkContainerName :: Text
937− , networkContainerEndpointID :: Text
938− , networkContainerMacAddress :: Text
939− , networkContainerIPv4Address :: Text
940− , networkContainerIPv6Address :: Text
941− } deriving (Eq, Show)
942−
943−instance FromJSON NetworkContainer where
944− parseJSON (JSON.Object o) = NetworkContainer
945− <$> o .: "Name"
946− <*> o .: "EndpointID"
947− <*> o .: "MacAddress"
948− <*> o .: "IPv4Address"
949− <*> o .: "IPv6Address"
950− parseJSON _ = fail "NetworkContainer is not an object"
951−
952−data NetworkDetails = NetworkDetails
953− { networkDetailsName :: Text
954− , networkDetailsID :: NetworkID
955− , networkDetailsCreated :: UTCTime
956− , networkDetailsScope :: NetworkScope
957− , networkDetailsDriver :: NetworkMode
958− , networkDetailsEnableIPv6 :: Bool
959− , networkDetailsInternal :: Bool
960− , networkDetailsAttachable :: Bool
961− , networkDetailsIngress :: Bool
962− , networkDetailsIPAM :: IPAM
963− , networkDetailsOptions :: HM.HashMap Text Text
964− , networkDetailsLabels :: HM.HashMap Text Text
965− , networkDetailsContainers :: HM.HashMap Text NetworkContainer
966− } deriving (Eq, Show)
967−
968−instance FromJSON NetworkDetails where
969− parseJSON v@(JSON.Object o) = NetworkDetails
970− <$> o .: "Name"
971− <*> parseJSON v
972− <*> o .: "Created"
973− <*> o .: "Scope"
974− <*> o .: "Driver"
975− <*> o .: "EnableIPv6"
976− <*> o .: "Internal"
977− <*> o .: "Attachable"
978− <*> o .: "Ingress"
979− <*> o .: "IPAM"
980− <*> o .:? "Options" .!= HM.empty
981− <*> o .:? "Labels" .!= HM.empty
982− <*> o .:? "Containers" .!= HM.empty
983− parseJSON _ = fail "NetworkDetails is not an object"
984−
985−data NetworkType = BuiltinNetwork | CustomNetwork deriving (Eq, Show)
986−
987−fromNetworkType :: NetworkType -> Text
988−fromNetworkType BuiltinNetwork = "builtin"
989−fromNetworkType CustomNetwork = "custom"
990−
991−instance ToJSON NetworkType where
992− toJSON = JSON.String . fromNetworkType
993−
994−instance FromJSON NetworkType where
995− parseJSON (JSON.String "builtin") = return BuiltinNetwork
996− parseJSON (JSON.String "custom") = return CustomNetwork
997− parseJSON _ = fail "Failed to parse NetworkType"
998−
999−data NetworkFilter
1000− = NetworkFilterName Text
1001− | NetworkFilterID NetworkID
1002− | NetworkFilterLabel Text
1003− | NetworkFilterDriver NetworkMode
1004− | NetworkFilterScope NetworkScope
1005− | NetworkFilterType NetworkType
1006− deriving (Eq, Show)
1007−
1008−
1009−instance {-# OVERLAPPING #-} ToJSON [NetworkFilter] where
1010− toJSON = object . fmap toKV
1011− where
1012− toKV (NetworkFilterName n) = "name" .= [n]
1013− toKV (NetworkFilterID i) = "id" .= [fromNetworkID i]
1014− toKV (NetworkFilterLabel l) = "label" .= [l]
1015− toKV (NetworkFilterDriver d) = "driver" .= [fromNetworkMode d]
1016− toKV (NetworkFilterScope s) = "scope" .= [fromNetworkScope s]
1017− toKV (NetworkFilterType t) = "type" .= [fromNetworkType t]
1018−
1019861-- TOOD: Add support for SELinux Volume labels (eg. "ro,z" or "ro/Z")
1020862-- | Set permissions on volumes that you mount in the container.
1021863data VolumePermission = ReadWrite | ReadOnly deriving (Eq, Show, Generic)
@@ -1185,14 +1027,11 @@ instance FromJSON NetworkMode where
11851027 parseJSON (JSON.String n) = return $ NetworkNamed n
11861028 parseJSON _ = fail "Unknown NetworkMode"
11871029
1188−fromNetworkMode :: NetworkMode -> Text
1189−fromNetworkMode NetworkBridge = "bridge"
1190−fromNetworkMode NetworkHost = "host"
1191−fromNetworkMode NetworkDisabled = "none"
1192−fromNetworkMode (NetworkNamed n) = n
1193−
11941030instance ToJSON NetworkMode where
1195− toJSON = JSON.String . fromNetworkMode
1031+ toJSON NetworkBridge = JSON.String "bridge"
1032+ toJSON NetworkHost = JSON.String "host"
1033+ toJSON NetworkDisabled = JSON.String "none"
1034+ toJSON (NetworkNamed n) = JSON.String n
11961035
11971036newtype NetworkID = NetworkID Text
11981037 deriving (Eq, Show)
@@ -1725,7 +1564,11 @@ instance FromJSON ContainerConfig where
17251564 macAddress labels stopSignal
17261565 parseJSON _ = fail "NetworkSettings is not an object."
17271566
1567+#if MIN_VERSION_base(4,13,0)
1568+parseIntegerText :: (MonadFail m) => Text -> m Integer
1569+#else
17281570parseIntegerText :: (Monad m) => Text -> m Integer
1571+#endif
17291572parseIntegerText t = case readMaybe $ T.unpack t of
17301573 Nothing ->
17311574 fail "Could not parse Integer"