on master help sign in
Added log processing
ab58276iko
src/Docker/Client/Api.hs+4−4
@@ -34,7 +34,7 @@ import Control.Monad.Reader (ask, lift)
34import Data.Aeson (FromJSON, eitherDecode')
34import Data.Aeson (FromJSON, eitherDecode')
35import qualified Data.ByteString as BS
35import qualified Data.ByteString as BS
36import qualified Data.ByteString.Lazy as BSL
36import qualified Data.ByteString.Lazy as BSL
37−import Data.Conduit (Sink)
37+import Data.Conduit (Sink, (.|))
38import qualified Data.Conduit.Binary as Conduit
38import qualified Data.Conduit.Binary as Conduit
39import qualified Data.Text as T
39import qualified Data.Text as T
40import qualified Data.Text as Text
40import qualified Data.Text as Text
@@ -172,7 +172,7 @@ inspectContainer cid = requestHelper GET (InspectContainerEndpoint cid) >>= pars
172-- __NOTE__: It's recommended to use one of the other 'LogDriverType's available (like
172-- __NOTE__: It's recommended to use one of the other 'LogDriverType's available (like
173-- syslog) for creating your containers.
173-- syslog) for creating your containers.
174getContainerLogs :: forall m. (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> DockerT m (Either DockerError BSL.ByteString)
174getContainerLogs :: forall m. (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> DockerT m (Either DockerError BSL.ByteString)
175−getContainerLogs logopts cid = requestHelper GET (ContainerLogsEndpoint logopts False cid)
175+getContainerLogs logopts cid = getContainerLogsStream logopts cid Conduit.sinkLbs
176
176
177{-| Continuously gets the container's logs as a stream. Uses conduit.
177{-| Continuously gets the container's logs as a stream. Uses conduit.
178
178
@@ -189,7 +189,8 @@ __Example__:
189
189
190-}
190-}
191getContainerLogsStream :: forall m b . (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> Sink BS.ByteString m b -> DockerT m (Either DockerError b)
191getContainerLogsStream :: forall m b . (MonadIO m, MonadMask m) => LogOpts -> ContainerID -> Sink BS.ByteString m b -> DockerT m (Either DockerError b)
192+getContainerLogsStream logopts cid sink =
192−getContainerLogsStream logopts cid = requestHelper' GET (ContainerLogsEndpoint logopts True cid)
193+ requestHelper' GET (ContainerLogsEndpoint logopts True cid) (processLog .| sink)
193-- JP: Should the second (follow) argument be True? XXX
194-- JP: Should the second (follow) argument be True? XXX
194
195
195-- | Build an Image from a Dockerfile
196-- | Build an Image from a Dockerfile
@@ -224,4 +225,3 @@ createNetwork opts = requestHelper POST (CreateNetworkEndpoint opts) >>= parseR
224-- | Removes a network
225-- | Removes a network
225removeNetwork :: forall m. (MonadIO m, MonadMask m) => NetworkID -> DockerT m (Either DockerError ())
226removeNetwork :: forall m. (MonadIO m, MonadMask m) => NetworkID -> DockerT m (Either DockerError ())
226removeNetwork nid = requestUnit DELETE $ RemoveNetworkEndpoint nid
227removeNetwork nid = requestUnit DELETE $ RemoveNetworkEndpoint nid
227−
src/Docker/Client/Internal.hs−1
@@ -105,4 +105,3 @@ getEndpointRequestBody (RemoveNetworkEndpoint _) = Nothing
105getEndpointContentType :: Endpoint -> BSC.ByteString
105getEndpointContentType :: Endpoint -> BSC.ByteString
106getEndpointContentType (BuildImageEndpoint _ _) = BSC.pack "application/tar"
106getEndpointContentType (BuildImageEndpoint _ _) = BSC.pack "application/tar"
107getEndpointContentType _ = BSC.pack "application/json; charset=utf-8"
107getEndpointContentType _ = BSC.pack "application/json; charset=utf-8"
108−
src/Docker/Client/Utils.hs+17
@@ -9,7 +9,11 @@ import qualified Codec.Archive.Tar as Tar
9import qualified Codec.Compression.GZip as GZip
9import qualified Codec.Compression.GZip as GZip
10import Control.Monad (filterM, liftM, unless)
10import Control.Monad (filterM, liftM, unless)
11import Control.Monad.IO.Class
11import Control.Monad.IO.Class
12+import Data.Bits
12import qualified Data.ByteString.Lazy as BS
13import qualified Data.ByteString.Lazy as BS
14+import qualified Data.ByteString as BSS
15+import Data.Conduit (ConduitT, yield)
16+import qualified Data.Conduit.Binary as CB
13import Data.Monoid ((<>))
17import Data.Monoid ((<>))
14import qualified Data.Text as T
18import qualified Data.Text as T
15import qualified Data.Text.IO as TIO
19import qualified Data.Text.IO as TIO
@@ -129,3 +133,16 @@ exclusionCheck f ps = any id (map (\(ExclusionPattern p) -> f ~~ T.unpack p) ps)
129inclusionCheck :: FilePath -> [InclusionPattern] -> Bool
133inclusionCheck :: FilePath -> [InclusionPattern] -> Bool
130inclusionCheck f ps = any id (map (\(InclusionPattern p) -> f ~~ T.unpack p) ps)
134inclusionCheck f ps = any id (map (\(InclusionPattern p) -> f ~~ T.unpack p) ps)
131
135
136+
137+processLog :: Monad m => ConduitT BSS.ByteString BSS.ByteString m ()
138+processLog = do
139+ -- metadata (is the next string is stdout or stderr)
140+ _ <- CB.take 4
141+ len' <- CB.take 4
142+ let len = BS.foldl (\i w -> shiftL i 8 .&. fromIntegral w) 0 len'
143+ case len of
144+ 0 -> return ()
145+ n -> do
146+ chunk <- CB.take n
147+ yield . BS.toStrict $ chunk
148+ processLog