@@ -76,6 +76,15 @@ module Docker.Client.Types (
76 , HostConfig(..)
76 , HostConfig(..)
77 , defaultHostConfig
77 , defaultHostConfig
78 , NetworkingConfig(..)
78 , NetworkingConfig(..)
84+ , NetworkContainer(..)
79 , EndpointConfig(..)
88 , EndpointConfig(..)
80 , Ulimit(..)
89 , Ulimit(..)
81 , ContainerResources(..)
90 , ContainerResources(..)
@@ -114,6 +123,7 @@ import qualified Data.Text as T
114import Data.Time.Clock (UTCTime)
123import Data.Time.Clock (UTCTime)
115import qualified Data.Vector as V
124import qualified Data.Vector as V
116import GHC.Generics (Generic)
125import GHC.Generics (Generic)
126+import Numeric (readDec)
117import Prelude hiding (all, tail)
127import Prelude hiding (all, tail)
118import Text.Read (readMaybe)
128import Text.Read (readMaybe)
@@ -139,6 +149,7 @@ data Endpoint =
139 | DeleteImageEndpoint ImageDeleteOpts ImageID
149 | DeleteImageEndpoint ImageDeleteOpts ImageID
140 | CreateNetworkEndpoint CreateNetworkOpts
150 | CreateNetworkEndpoint CreateNetworkOpts
141 | RemoveNetworkEndpoint NetworkID
151 | RemoveNetworkEndpoint NetworkID
152+ | ListNetworksEndpoint [NetworkFilter]
142 deriving (Eq, Show)
153 deriving (Eq, Show)
144-- | We should newtype this
155-- | We should newtype this
@@ -858,6 +869,153 @@ instance ToJSON CreateNetworkOpts where
858 , "EnableIPv6" .= createNetworkEnableIPv6 opts
869 , "EnableIPv6" .= createNetworkEnableIPv6 opts
872+data NetworkScope = LocalScope | GlobalScope | SwarmScope deriving (Eq, Show)
874+fromNetworkScope :: NetworkScope -> Text
875+fromNetworkScope LocalScope = "local"
876+fromNetworkScope GlobalScope = "global"
877+fromNetworkScope SwarmScope = "swarm"
879+instance ToJSON NetworkScope where
880+ toJSON = JSON.String . fromNetworkScope
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"
888+data CIDR = CIDR Text Int deriving (Eq, Show)
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"
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"
900+data IPAMDriver = DefaultIPAMDriver | NamedIPAMDriver Text deriving (Eq, Show)
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"
907+data IPAMConfig = IPAMConfig
908+ { ipamConfigSubnet :: CIDR
909+ , ipamConfigIPRange :: Maybe CIDR
910+ , ipamSubnetGateway :: Maybe Text
911+ , ipamConfigAuxAddress :: Maybe Text
912+ } deriving (Eq, Show)
914+instance FromJSON IPAMConfig where
915+ parseJSON (JSON.Object o) = IPAMConfig
919+ <*> o .:? "AuxAddress"
920+ parseJSON _ = fail "IPAMConfig is not an object"
923+ { ipamDriver :: IPAMDriver
924+ , ipamConfig :: [IPAMConfig]
925+ , ipamOptions :: HM.HashMap Text Text
926+ } deriving (Eq, Show)
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"
935+data NetworkContainer = NetworkContainer
936+ { networkContainerName :: Text
937+ , networkContainerEndpointID :: Text
938+ , networkContainerMacAddress :: Text
939+ , networkContainerIPv4Address :: Text
940+ , networkContainerIPv6Address :: Text
941+ } deriving (Eq, Show)
943+instance FromJSON NetworkContainer where
944+ parseJSON (JSON.Object o) = NetworkContainer
946+ <*> o .: "EndpointID"
947+ <*> o .: "MacAddress"
948+ <*> o .: "IPv4Address"
949+ <*> o .: "IPv6Address"
950+ parseJSON _ = fail "NetworkContainer is not an object"
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)
968+instance FromJSON NetworkDetails where
969+ parseJSON v@(JSON.Object o) = NetworkDetails
975+ <*> o .: "EnableIPv6"
977+ <*> o .: "Attachable"
980+ <*> o .:? "Options" .!= HM.empty
981+ <*> o .:? "Labels" .!= HM.empty
982+ <*> o .:? "Containers" .!= HM.empty
983+ parseJSON _ = fail "NetworkDetails is not an object"
985+data NetworkType = BuiltinNetwork | CustomNetwork deriving (Eq, Show)
987+fromNetworkType :: NetworkType -> Text
988+fromNetworkType BuiltinNetwork = "builtin"
989+fromNetworkType CustomNetwork = "custom"
991+instance ToJSON NetworkType where
992+ toJSON = JSON.String . fromNetworkType
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"
1000+ = NetworkFilterName Text
1001+ | NetworkFilterID NetworkID
1002+ | NetworkFilterLabel Text
1003+ | NetworkFilterDriver NetworkMode
1004+ | NetworkFilterScope NetworkScope
1005+ | NetworkFilterType NetworkType
1006+ deriving (Eq, Show)
1009+instance {-# OVERLAPPING #-} ToJSON [NetworkFilter] where
1010+ toJSON = object . fmap toKV
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]
861-- TOOD: Add support for SELinux Volume labels (eg. "ro,z" or "ro/Z")
1019-- TOOD: Add support for SELinux Volume labels (eg. "ro,z" or "ro/Z")
862-- | Set permissions on volumes that you mount in the container.
1020-- | Set permissions on volumes that you mount in the container.
863data VolumePermission = ReadWrite | ReadOnly deriving (Eq, Show, Generic)
1021data VolumePermission = ReadWrite | ReadOnly deriving (Eq, Show, Generic)
@@ -1027,11 +1185,14 @@ instance FromJSON NetworkMode where
1027 parseJSON (JSON.String n) = return $ NetworkNamed n
1185 parseJSON (JSON.String n) = return $ NetworkNamed n
1028 parseJSON _ = fail "Unknown NetworkMode"
1186 parseJSON _ = fail "Unknown NetworkMode"
1188+fromNetworkMode :: NetworkMode -> Text
1189+fromNetworkMode NetworkBridge = "bridge"
1190+fromNetworkMode NetworkHost = "host"
1191+fromNetworkMode NetworkDisabled = "none"
1192+fromNetworkMode (NetworkNamed n) = n
1030instance ToJSON NetworkMode where
1194instance ToJSON NetworkMode where
1031− toJSON NetworkBridge = JSON.String "bridge"
1195+ toJSON = JSON.String . fromNetworkMode
1032− toJSON NetworkHost = JSON.String "host"
1033− toJSON NetworkDisabled = JSON.String "none"
1034− toJSON (NetworkNamed n) = JSON.String n
1036newtype NetworkID = NetworkID Text
1197newtype NetworkID = NetworkID Text
1037 deriving (Eq, Show)
1198 deriving (Eq, Show)
@@ -1564,11 +1725,7 @@ instance FromJSON ContainerConfig where
1564 macAddress labels stopSignal
1725 macAddress labels stopSignal
1565 parseJSON _ = fail "NetworkSettings is not an object."
1726 parseJSON _ = fail "NetworkSettings is not an object."
1567−#if MIN_VERSION_base(4,13,0)
1568−parseIntegerText :: (MonadFail m) => Text -> m Integer
1570parseIntegerText :: (Monad m) => Text -> m Integer
1728parseIntegerText :: (Monad m) => Text -> m Integer
1572parseIntegerText t = case readMaybe $ T.unpack t of
1729parseIntegerText t = case readMaybe $ T.unpack t of
1573 Nothing ->
1730 Nothing ->
1574 fail "Could not parse Integer"
1731 fail "Could not parse Integer"