@@ -76,28 +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− , NetworkName
88− , NetworkFilter(..)
89− , defaultNetworkFilter
90− , ConnectConfig(..)
91− , defaultConnectConfig
92− , DisconnectConfig(..)
93− , defaultDisconnectConfig
94− , PruneFilter(..)
95− , defaultPruneFilter
96− , NetworksDeleted(..)
97− , EndpointSettings(..)
98− , defaultEndpointSettings
99− , IPAMSettings(..)
100− , defaultIPAMSettings
10179 , EndpointConfig(..)
10280 , Ulimit(..)
10381 , ContainerResources(..)
@@ -122,7 +100,6 @@ module Docker.Client.Types (
122100 , MemoryConstraintSize(..)
123101 ) where
124102
125−import Control.Monad (join)
126103import Data.Aeson (FromJSON, ToJSON, genericParseJSON,
127104 genericToJSON, object, parseJSON, toJSON,
128105 (.!=), (.:), (.:?), (.=))
@@ -130,7 +107,6 @@ import qualified Data.Aeson as JSON
130107import Data.Aeson.Types (defaultOptions, fieldLabelModifier)
131108import Data.Char (isAlphaNum, toUpper)
132109import qualified Data.HashMap.Strict as HM
133−import Data.Maybe (maybeToList, catMaybes)
134110import Data.Monoid ((<>))
135111import Data.Scientific (floatingOrInteger)
136112import Data.Text (Text)
@@ -138,7 +114,6 @@ import qualified Data.Text as T
138114import Data.Time.Clock (UTCTime)
139115import qualified Data.Vector as V
140116import GHC.Generics (Generic)
141−import Numeric (readDec)
142117import Prelude hiding (all, tail)
143118import Text.Read (readMaybe)
144119
@@ -164,11 +139,6 @@ data Endpoint =
164139 | DeleteImageEndpoint ImageDeleteOpts ImageID
165140 | CreateNetworkEndpoint CreateNetworkOpts
166141 | RemoveNetworkEndpoint NetworkID
167− | ListNetworksEndpoint NetworkFilter
168− | InspectNetworkEndpoint NetworkID
169− | ConnectNetworkEndpoint NetworkID ConnectConfig
170− | DisconnectNetworkEndpoint NetworkID DisconnectConfig
171− | PruneNetworksEndpoint PruneFilter
172142 deriving (Eq, Show)
173143
174144-- | We should newtype this
@@ -888,248 +858,6 @@ instance ToJSON CreateNetworkOpts where
888858 , "EnableIPv6" .= createNetworkEnableIPv6 opts
889859 ]
890860
891−data NetworkScope = LocalScope | GlobalScope | SwarmScope deriving (Eq, Show)
892−
893−fromNetworkScope :: NetworkScope -> Text
894−fromNetworkScope LocalScope = "local"
895−fromNetworkScope GlobalScope = "global"
896−fromNetworkScope SwarmScope = "swarm"
897−
898−instance ToJSON NetworkScope where
899− toJSON = JSON.String . fromNetworkScope
900−
901−instance FromJSON NetworkScope where
902− parseJSON "local" = return LocalScope
903− parseJSON "global" = return GlobalScope
904− parseJSON "swarm" = return SwarmScope
905− parseJSON _ = fail "Failed to parse NetworkScope"
906−
907−data CIDR = CIDR Text Int deriving (Eq, Show)
908−
909−instance FromJSON CIDR where
910− parseJSON (JSON.String t) = case T.splitOn "/" t of
911− [a,p] -> CIDR a <$> parsePrefixLen p
912− _ -> fail "Failed to parse CIDR"
913− where
914− parsePrefixLen p = case readDec (T.unpack p) of
915− (n,""):_ -> return n
916− _ -> fail "Failed to parse CIDR prefix length"
917− parseJSON _ = fail "Failed to parse CIDR"
918−
919−data IPAMDriver = DefaultIPAMDriver | NamedIPAMDriver Text deriving (Eq, Show)
920−
921−instance FromJSON IPAMDriver where
922− parseJSON (JSON.String "default") = return DefaultIPAMDriver
923− parseJSON (JSON.String t) = return $ NamedIPAMDriver t
924− parseJSON _ = fail "IPAMDriver is not a string"
925−
926−data IPAMConfig = IPAMConfig
927− { ipamConfigSubnet :: CIDR
928− , ipamConfigIPRange :: Maybe CIDR
929− , ipamSubnetGateway :: Maybe Text
930− , ipamConfigAuxAddress :: Maybe Text
931− } deriving (Eq, Show)
932−
933−instance FromJSON IPAMConfig where
934− parseJSON (JSON.Object o) = IPAMConfig
935− <$> o .: "Subnet"
936− <*> o .:? "IPRange"
937− <*> o .:? "Gateway"
938− <*> o .:? "AuxAddress"
939− parseJSON _ = fail "IPAMConfig is not an object"
940−
941−data IPAM = IPAM
942− { ipamDriver :: IPAMDriver
943− , ipamConfig :: [IPAMConfig]
944− , ipamOptions :: HM.HashMap Text Text
945− } deriving (Eq, Show)
946−
947−instance FromJSON IPAM where
948− parseJSON (JSON.Object o) = IPAM
949− <$> o .:? "Driver" .!= DefaultIPAMDriver
950− <*> o .:? "Config" .!= []
951− <*> o .:? "Options" .!= HM.empty
952− parseJSON _ = fail "IPAM is not an object"
953−
954−data NetworkContainer = NetworkContainer
955− { networkContainerName :: ContainerName
956− , networkContainerEndpointID :: Text
957− , networkContainerMacAddress :: Text
958− , networkContainerIPv4Address :: Text
959− , networkContainerIPv6Address :: Text
960− } deriving (Eq, Show)
961−
962−instance FromJSON NetworkContainer where
963− parseJSON (JSON.Object o) = NetworkContainer
964− <$> o .: "Name"
965− <*> o .: "EndpointID"
966− <*> o .: "MacAddress"
967− <*> o .: "IPv4Address"
968− <*> o .: "IPv6Address"
969− parseJSON _ = fail "NetworkContainer is not an object"
970−
971−data NetworkDetails = NetworkDetails
972− { networkDetailsName :: Text
973− , networkDetailsID :: NetworkID
974− , networkDetailsCreated :: UTCTime
975− , networkDetailsScope :: NetworkScope
976− , networkDetailsDriver :: NetworkMode
977− , networkDetailsEnableIPv6 :: Bool
978− , networkDetailsInternal :: Bool
979− , networkDetailsAttachable :: Bool
980− , networkDetailsIngress :: Bool
981− , networkDetailsIPAM :: IPAM
982− , networkDetailsOptions :: HM.HashMap Text Text
983− , networkDetailsLabels :: HM.HashMap Text Text
984− , networkDetailsContainers :: HM.HashMap Text NetworkContainer
985− } deriving (Eq, Show)
986−
987−instance FromJSON NetworkDetails where
988− parseJSON v@(JSON.Object o) = NetworkDetails
989− <$> o .: "Name"
990− <*> parseJSON v
991− <*> o .: "Created"
992− <*> o .: "Scope"
993− <*> o .: "Driver"
994− <*> o .: "EnableIPv6"
995− <*> o .: "Internal"
996− <*> o .: "Attachable"
997− <*> o .: "Ingress"
998− <*> o .: "IPAM"
999− <*> o .:? "Options" .!= HM.empty
1000− <*> o .:? "Labels" .!= HM.empty
1001− <*> o .:? "Containers" .!= HM.empty
1002− parseJSON _ = fail "NetworkDetails is not an object"
1003−
1004−data NetworkType = BuiltinNetwork | CustomNetwork deriving (Eq, Show)
1005−
1006−fromNetworkType :: NetworkType -> Text
1007−fromNetworkType BuiltinNetwork = "builtin"
1008−fromNetworkType CustomNetwork = "custom"
1009−
1010−type NetworkName = Text
1011−
1012−instance ToJSON NetworkType where
1013− toJSON = JSON.String . fromNetworkType
1014−
1015−instance FromJSON NetworkType where
1016− parseJSON (JSON.String "builtin") = return BuiltinNetwork
1017− parseJSON (JSON.String "custom") = return CustomNetwork
1018− parseJSON _ = fail "Failed to parse NetworkType"
1019−
1020−data NetworkFilter = NetworkFilter
1021− { networkFilterNames :: [Text]
1022− , networkFilterIDs :: [NetworkID]
1023− , networkFilterDrivers :: [NetworkMode]
1024− , networkFilterScopes :: [NetworkScope]
1025− , networkFilterTypes :: [NetworkType]
1026− , networkFilterLabels :: [(Text, (Maybe Text))]
1027− } deriving (Eq, Show)
1028−
1029−instance ToJSON NetworkFilter where
1030− toJSON nf = object . catMaybes $
1031− [ "name" .=? networkFilterNames nf
1032− , "id" .=? (fromNetworkID <$> networkFilterIDs nf)
1033− , "driver" .=? (fromNetworkMode <$> networkFilterDrivers nf)
1034− , "scope" .=? (fromNetworkScope <$> networkFilterScopes nf)
1035− , "type" .=? (fromNetworkType <$> networkFilterTypes nf)
1036− , "label" .=? (constructLabel <$> networkFilterLabels nf)
1037− ]
1038− where
1039− _ .=? [] = Nothing
1040− k .=? l = Just $ k .= l
1041−
1042−constructLabel :: (Text, Maybe Text) -> Text
1043−constructLabel (k, Just v) = T.concat [k, "=", v]
1044−constructLabel (k, Nothing) = k
1045−
1046−defaultNetworkFilter :: NetworkFilter
1047−defaultNetworkFilter = NetworkFilter [] [] [] [] [] []
1048−
1049−data ConnectConfig = ConnectConfig
1050− { connectContainer :: Text
1051− , connectEndpointConfig :: EndpointSettings
1052− } deriving (Eq, Show, Generic)
1053−
1054−instance ToJSON ConnectConfig where
1055− toJSON = genericToJSON defaultOptions { fieldLabelModifier = drop 7 }
1056−
1057−defaultConnectConfig :: Text -> ConnectConfig
1058−defaultConnectConfig = flip ConnectConfig defaultEndpointSettings
1059−
1060−data DisconnectConfig = DisconnectConfig
1061− { disconnectContainer :: Text
1062− , disconnectForce :: Bool
1063− } deriving (Eq, Show, Generic)
1064−
1065−instance ToJSON DisconnectConfig where
1066− toJSON = genericToJSON defaultOptions { fieldLabelModifier = drop 10 }
1067−
1068−defaultDisconnectConfig :: Text -> DisconnectConfig
1069−defaultDisconnectConfig = flip DisconnectConfig False
1070−
1071−data PruneFilter = PruneFilter
1072− { pruneFilterUntil :: Maybe Text
1073− -- ^ Can be a Unix timestamp, a date-formatted timestamp, or a duration,
1074− -- such as @10m@ or @1h30m@.
1075− , pruneFilterIncludeLabels :: [(Text, (Maybe Text))]
1076− , pruneFilterExcludeLabels :: [(Text, (Maybe Text))]
1077− } deriving (Eq, Show)
1078−
1079−instance ToJSON PruneFilter where
1080− toJSON pf = object . catMaybes $
1081− [ "until" .=? maybeToList (pruneFilterUntil pf)
1082− , "label" .=? (constructLabel <$> pruneFilterIncludeLabels pf)
1083− , "label!" .=? (constructLabel <$> pruneFilterExcludeLabels pf)
1084− ]
1085− where
1086− _ .=? [] = Nothing
1087− k .=? l = Just $ k .= l
1088−
1089−defaultPruneFilter :: PruneFilter
1090−defaultPruneFilter = PruneFilter Nothing [] []
1091−
1092−newtype NetworksDeleted = NetworksDeleted [Text]
1093− deriving (Eq, Show)
1094−
1095−instance FromJSON NetworksDeleted where
1096− parseJSON (JSON.Object o) =
1097− NetworksDeleted . join . maybeToList <$> o .: "NetworksDeleted"
1098− parseJSON _ = fail $ "NetworksDeleted is not an object"
1099−
1100−data EndpointSettings = EndpointSettings
1101− { endpointIPAMConfig :: IPAMSettings
1102− , endpointLinks :: [Text]
1103− , endpointAliases :: [Text]
1104− , endpointNetworkID :: Maybe Text
1105− , endpointEndpointID :: Maybe Text
1106− , endpointGateway :: Maybe Text
1107− , endpointIPAddress :: Maybe Text
1108− , endpointIPPrefixLen :: Maybe Int
1109− , endpointIPv6Gateway :: Maybe Text
1110− , endpointGlobalIPv6Address :: Maybe Text
1111− , endpointGlobalIPv6PrefixLen :: Maybe Int
1112− , endpointMacAddress :: Maybe Text
1113− } deriving (Eq, Show, Generic)
1114−
1115−instance ToJSON EndpointSettings where
1116− toJSON = genericToJSON defaultOptions { fieldLabelModifier = drop 8 }
1117−
1118−defaultEndpointSettings :: EndpointSettings
1119−defaultEndpointSettings = EndpointSettings defaultIPAMSettings [] [] Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
1120−
1121−data IPAMSettings = IPAMSettings
1122− { ipamIPv4Address :: Maybe Text
1123− , ipamIPv6Address :: Maybe Text
1124− , ipamLinkLocalIPs :: [Text]
1125− } deriving (Eq, Show, Generic)
1126−
1127−instance ToJSON IPAMSettings where
1128− toJSON = genericToJSON defaultOptions { fieldLabelModifier = drop 4 }
1129−
1130−defaultIPAMSettings :: IPAMSettings
1131−defaultIPAMSettings = IPAMSettings Nothing Nothing []
1132−
1133861-- TOOD: Add support for SELinux Volume labels (eg. "ro,z" or "ro/Z")
1134862-- | Set permissions on volumes that you mount in the container.
1135863data VolumePermission = ReadWrite | ReadOnly deriving (Eq, Show, Generic)
@@ -1299,14 +1027,11 @@ instance FromJSON NetworkMode where
12991027 parseJSON (JSON.String n) = return $ NetworkNamed n
13001028 parseJSON _ = fail "Unknown NetworkMode"
13011029
1302−fromNetworkMode :: NetworkMode -> Text
1303−fromNetworkMode NetworkBridge = "bridge"
1304−fromNetworkMode NetworkHost = "host"
1305−fromNetworkMode NetworkDisabled = "none"
1306−fromNetworkMode (NetworkNamed n) = n
1307−
13081030instance ToJSON NetworkMode where
1309− 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
13101035
13111036newtype NetworkID = NetworkID Text
13121037 deriving (Eq, Show)
@@ -1839,7 +1564,11 @@ instance FromJSON ContainerConfig where
18391564 macAddress labels stopSignal
18401565 parseJSON _ = fail "NetworkSettings is not an object."
18411566
1567+#if MIN_VERSION_base(4,13,0)
1568+parseIntegerText :: (MonadFail m) => Text -> m Integer
1569+#else
18421570parseIntegerText :: (Monad m) => Text -> m Integer
1571+#endif
18431572parseIntegerText t = case readMaybe $ T.unpack t of
18441573 Nothing ->
18451574 fail "Could not parse Integer"