on master help sign in
Improve handling of filters in listNetworks
commitaf843a1ffd321dc1e54067d73cbec33e9bd44544 authorBen Hamlin <protob3n@gmail.com> dateTue 9 Jul 2019, 13:35 (7 years ago) parentb550387
4 files changed+31−24
src/Docker/Client/Api.hs+1−1 src/Docker/Client/Internal.hs+1−1 src/Docker/Client/Types.hs+28−21 tests/tests.hs+1−1
src/Docker/Client/Api.hs+1−1
@@ -231,7 +231,7 @@ removeNetwork :: forall m. (MonadIO m, MonadMask m) => NetworkID -> DockerT m (E
231231removeNetwork nid = requestUnit DELETE $ RemoveNetworkEndpoint nid
232232
233233-- | Lists networks optionally matching a list of 'NetworkFilter's.
234−listNetworks :: forall m . (MonadIO m, MonadMask m) => [NetworkFilter] -> DockerT m (Either DockerError [NetworkDetails])
234+listNetworks :: forall m . (MonadIO m, MonadMask m) => NetworkFilter -> DockerT m (Either DockerError [NetworkDetails])
235235listNetworks nfs = requestHelper GET (ListNetworksEndpoint nfs) >>= parseResponse
236236
237237-- | Gets 'NetworkDetails' for a network, given its name or id.
src/Docker/Client/Internal.hs+1−1
@@ -79,7 +79,7 @@ getEndpoint v (CreateImageEndpoint name tag _) = encodeURLWithQuery [v, "images"
7979getEndpoint v (DeleteImageEndpoint _ cid) = encodeURL [v, "images", fromImageID cid]
8080getEndpoint v (CreateNetworkEndpoint _) = encodeURL [v, "networks", "create"]
8181getEndpoint v (RemoveNetworkEndpoint nid) = encodeURL [v, "networks", fromNetworkID nid]
82−getEndpoint v (ListNetworksEndpoint nfs) = encodeURLWithQuery [v, "networks"] [("filters", Just . BSLC.toStrict $ JSON.encode nfs)]
82+getEndpoint v (ListNetworksEndpoint nf) = encodeURLWithQuery [v, "networks"] [("filters", Just . BSLC.toStrict $ JSON.encode nf)]
8383getEndpoint v (InspectNetworkEndpoint nid) = encodeURL [v, "networks", fromNetworkID nid]
8484getEndpoint v (ConnectNetworkEndpoint nid _) = encodeURL [v, "networks", fromNetworkID nid, "connect"]
8585getEndpoint v (DisconnectNetworkEndpoint nid _) = encodeURL [v, "networks", fromNetworkID nid, "disconnect"]
src/Docker/Client/Types.hs+28−21
@@ -86,6 +86,7 @@ module Docker.Client.Types (
8686 , NetworkType(..)
8787 , NetworkName
8888 , NetworkFilter(..)
89+ , defaultNetworkFilter
8990 , ConnectConfig(..)
9091 , defaultConnectConfig
9192 , DisconnectConfig(..)
@@ -163,7 +164,7 @@ data Endpoint =
163164 | DeleteImageEndpoint ImageDeleteOpts ImageID
164165 | CreateNetworkEndpoint CreateNetworkOpts
165166 | RemoveNetworkEndpoint NetworkID
166− | ListNetworksEndpoint [NetworkFilter]
167+ | ListNetworksEndpoint NetworkFilter
167168 | InspectNetworkEndpoint NetworkID
168169 | ConnectNetworkEndpoint NetworkID ConnectConfig
169170 | DisconnectNetworkEndpoint NetworkID DisconnectConfig
@@ -1016,24 +1017,34 @@ instance FromJSON NetworkType where
10161017 parseJSON (JSON.String "custom") = return CustomNetwork
10171018 parseJSON _ = fail "Failed to parse NetworkType"
10181019
1019−data NetworkFilter
1020− = NetworkFilterName Text
1021− | NetworkFilterID NetworkID
1022− | NetworkFilterLabel Text
1023− | NetworkFilterDriver NetworkMode
1024− | NetworkFilterScope NetworkScope
1025− | NetworkFilterType NetworkType
1026− deriving (Eq, Show)
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)
10271028
1028−instance {-# OVERLAPPING #-} ToJSON [NetworkFilter] where
1029− toJSON = object . fmap toKV
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+ ]
10301038 where
1031− toKV (NetworkFilterName n) = "name" .= [n]
1032− toKV (NetworkFilterID i) = "id" .= [fromNetworkID i]
1033− toKV (NetworkFilterLabel l) = "label" .= [l]
1034− toKV (NetworkFilterDriver d) = "driver" .= [fromNetworkMode d]
1035− toKV (NetworkFilterScope s) = "scope" .= [fromNetworkScope s]
1036− toKV (NetworkFilterType t) = "type" .= [fromNetworkType t]
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 [] [] [] [] [] []
10371048
10381049data ConnectConfig = ConnectConfig
10391050 { connectContainer :: Text
@@ -1075,10 +1086,6 @@ instance ToJSON PruneFilter where
10751086 _ .=? [] = Nothing
10761087 k .=? l = Just $ k .= l
10771088
1078−constructLabel :: (Text, Maybe Text) -> Text
1079−constructLabel (k, Just v) = T.concat [k, "=", v]
1080−constructLabel (k, Nothing) = k
1081−
10821089defaultPruneFilter :: PruneFilter
10831090defaultPruneFilter = PruneFilter Nothing [] []
10841091
tests/tests.hs+1−1
@@ -148,7 +148,7 @@ testCreateRemoveNetwork = do
148148testListNetworks :: IO ()
149149testListNetworks =
150150 runDocker $ do
151− res <- listNetworks [NetworkFilterName "bridge"]
151+ res <- listNetworks defaultNetworkFilter {networkFilterNames = ["bridge"]}
152152 lift $ case res of
153153 Left _ -> assertFailure $ "listing networks, unexpected status: " ++ show res
154154 Right (d:_) -> assertBool "listing networks, bridge network missing" $ networkDetailsName d == "bridge"