packages feed

docker 0.2.0.2 → 0.2.0.3

raw patch · 4 files changed

+78/−29 lines, 4 filesdep +HsOpenSSLdep +http-client-opensslPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: HsOpenSSL, http-client-openssl

API changes (from Hackage documentation)

- Network.Docker.Types: _Arch :: DockerVersion -> String
- Network.Docker.Types: _Binds :: StartContainerOpts -> [Text]
- Network.Docker.Types: _Dns :: StartContainerOpts -> [Text]
- Network.Docker.Types: _GitCommit :: DockerVersion -> String
- Network.Docker.Types: _GoVersion :: DockerVersion -> String
- Network.Docker.Types: _KernelVersion :: DockerVersion -> String
- Network.Docker.Types: _Links :: StartContainerOpts -> [Text]
- Network.Docker.Types: _LxcConf :: StartContainerOpts -> [(Text, Text)]
- Network.Docker.Types: _PortBindings :: StartContainerOpts -> [((Int, Text), Int)]
- Network.Docker.Types: _Privileged :: StartContainerOpts -> Bool
- Network.Docker.Types: _PublishAllPorts :: StartContainerOpts -> Bool
- Network.Docker.Types: _RestartPolicy :: StartContainerOpts -> RestartPolicy
- Network.Docker.Types: _Version :: DockerVersion -> String
- Network.Docker.Types: _VolumesFrom :: StartContainerOpts -> [Text]
- Network.Docker.Types: _attachStderr :: CreateContainerOpts -> Bool
- Network.Docker.Types: _attachStdin :: CreateContainerOpts -> Bool
- Network.Docker.Types: _attachStdout :: CreateContainerOpts -> Bool
- Network.Docker.Types: _cmd :: CreateContainerOpts -> [String]
- Network.Docker.Types: _command :: DockerContainer -> String
- Network.Docker.Types: _containerCreatedAt :: DockerContainer -> Int
- Network.Docker.Types: _containerId :: DockerContainer -> ResourceId
- Network.Docker.Types: _containerImageId :: DockerContainer -> ResourceId
- Network.Docker.Types: _disableNetwork :: CreateContainerOpts -> Bool
- Network.Docker.Types: _env :: CreateContainerOpts -> Maybe Object
- Network.Docker.Types: _exposedPorts :: CreateContainerOpts -> Maybe Object
- Network.Docker.Types: _hostname :: CreateContainerOpts -> String
- Network.Docker.Types: _id :: ResourceId -> String
- Network.Docker.Types: _image :: CreateContainerOpts -> String
- Network.Docker.Types: _imageCreatedAt :: DockerImage -> Int
- Network.Docker.Types: _imageId :: DockerImage -> ResourceId
- Network.Docker.Types: _ip :: PortMap -> IP
- Network.Docker.Types: _memory :: CreateContainerOpts -> Int
- Network.Docker.Types: _memorySwap :: CreateContainerOpts -> Int
- Network.Docker.Types: _names :: DockerContainer -> [String]
- Network.Docker.Types: _openStdin :: CreateContainerOpts -> Bool
- Network.Docker.Types: _parentId :: DockerImage -> Maybe String
- Network.Docker.Types: _portSpecs :: CreateContainerOpts -> Maybe Object
- Network.Docker.Types: _ports :: DockerContainer -> Maybe [PortMap]
- Network.Docker.Types: _privatePort :: PortMap -> Port
- Network.Docker.Types: _publicPort :: PortMap -> Port
- Network.Docker.Types: _repoTags :: DockerImage -> [Tag]
- Network.Docker.Types: _size :: DockerImage -> Int
- Network.Docker.Types: _status :: DockerContainer -> String
- Network.Docker.Types: _stdinOnce :: CreateContainerOpts -> Bool
- Network.Docker.Types: _tty :: CreateContainerOpts -> Bool
- Network.Docker.Types: _type :: PortMap -> PortType
- Network.Docker.Types: _user :: CreateContainerOpts -> String
- Network.Docker.Types: _virtualSize :: DockerImage -> Int
- Network.Docker.Types: _volumes :: CreateContainerOpts -> Maybe Object
- Network.Docker.Types: _volumesFrom :: CreateContainerOpts -> Maybe Object
- Network.Docker.Types: _workingDir :: CreateContainerOpts -> String
- Network.Docker.Types: apiVersion :: DockerClientOpts -> ApiVersion
- Network.Docker.Types: baseUrl :: DockerClientOpts -> URL
- Network.Docker.Types: force :: DeleteOpts -> Bool
- Network.Docker.Types: instance Eq DockerContainer
- Network.Docker.Types: instance Eq DockerImage
- Network.Docker.Types: instance Eq DockerVersion
- Network.Docker.Types: instance Eq PortMap
- Network.Docker.Types: instance Eq ResourceId
- Network.Docker.Types: instance FromJSON DockerContainer
- Network.Docker.Types: instance FromJSON DockerImage
- Network.Docker.Types: instance FromJSON DockerVersion
- Network.Docker.Types: instance FromJSON PortMap
- Network.Docker.Types: instance HasResourceId DockerContainer
- Network.Docker.Types: instance HasResourceId DockerImage
- Network.Docker.Types: instance HasResourceId ResourceId
- Network.Docker.Types: instance Show CreateContainerOpts
- Network.Docker.Types: instance Show DockerClientOpts
- Network.Docker.Types: instance Show DockerContainer
- Network.Docker.Types: instance Show DockerImage
- Network.Docker.Types: instance Show DockerVersion
- Network.Docker.Types: instance Show PortMap
- Network.Docker.Types: instance Show ResourceId
- Network.Docker.Types: instance Show RestartPolicy
- Network.Docker.Types: instance Show StartContainerOpts
- Network.Docker.Types: instance ToJSON CreateContainerOpts
- Network.Docker.Types: instance ToJSON DockerVersion
- Network.Docker.Types: instance ToJSON RestartPolicy
- Network.Docker.Types: instance ToJSON StartContainerOpts
- Network.Docker.Types: removeVolumes :: DeleteOpts -> Bool
+ Network.Docker: getSSL :: SSLOptions -> String -> IO (Response ByteString)
+ Network.Docker: mkOpts :: IO SSLContext -> Options
+ Network.Docker: postSSL :: ToJSON a => SSLOptions -> String -> a -> IO (Response ByteString)
+ Network.Docker: setupSSLCtx :: SSLOptions -> IO SSLContext
+ Network.Docker.Types: NoSSL :: SSL
+ Network.Docker.Types: SSL :: SSLOptions -> SSL
+ Network.Docker.Types: SSLOptions :: FilePath -> FilePath -> SSLOptions
+ Network.Docker.Types: [_Arch] :: DockerVersion -> String
+ Network.Docker.Types: [_Binds] :: StartContainerOpts -> [Text]
+ Network.Docker.Types: [_Dns] :: StartContainerOpts -> [Text]
+ Network.Docker.Types: [_GitCommit] :: DockerVersion -> String
+ Network.Docker.Types: [_GoVersion] :: DockerVersion -> String
+ Network.Docker.Types: [_KernelVersion] :: DockerVersion -> String
+ Network.Docker.Types: [_Links] :: StartContainerOpts -> [Text]
+ Network.Docker.Types: [_LxcConf] :: StartContainerOpts -> [(Text, Text)]
+ Network.Docker.Types: [_PortBindings] :: StartContainerOpts -> [((Int, Text), Int)]
+ Network.Docker.Types: [_Privileged] :: StartContainerOpts -> Bool
+ Network.Docker.Types: [_PublishAllPorts] :: StartContainerOpts -> Bool
+ Network.Docker.Types: [_RestartPolicy] :: StartContainerOpts -> RestartPolicy
+ Network.Docker.Types: [_Version] :: DockerVersion -> String
+ Network.Docker.Types: [_VolumesFrom] :: StartContainerOpts -> [Text]
+ Network.Docker.Types: [_attachStderr] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_attachStdin] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_attachStdout] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_cmd] :: CreateContainerOpts -> [String]
+ Network.Docker.Types: [_command] :: DockerContainer -> String
+ Network.Docker.Types: [_containerCreatedAt] :: DockerContainer -> Int
+ Network.Docker.Types: [_containerId] :: DockerContainer -> ResourceId
+ Network.Docker.Types: [_containerImageId] :: DockerContainer -> ResourceId
+ Network.Docker.Types: [_disableNetwork] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_env] :: CreateContainerOpts -> Maybe Object
+ Network.Docker.Types: [_exposedPorts] :: CreateContainerOpts -> Maybe Object
+ Network.Docker.Types: [_hostname] :: CreateContainerOpts -> String
+ Network.Docker.Types: [_id] :: ResourceId -> String
+ Network.Docker.Types: [_imageCreatedAt] :: DockerImage -> Int
+ Network.Docker.Types: [_imageId] :: DockerImage -> ResourceId
+ Network.Docker.Types: [_image] :: CreateContainerOpts -> String
+ Network.Docker.Types: [_ip] :: PortMap -> IP
+ Network.Docker.Types: [_memorySwap] :: CreateContainerOpts -> Int
+ Network.Docker.Types: [_memory] :: CreateContainerOpts -> Int
+ Network.Docker.Types: [_names] :: DockerContainer -> [String]
+ Network.Docker.Types: [_openStdin] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_parentId] :: DockerImage -> Maybe String
+ Network.Docker.Types: [_portSpecs] :: CreateContainerOpts -> Maybe Object
+ Network.Docker.Types: [_ports] :: DockerContainer -> Maybe [PortMap]
+ Network.Docker.Types: [_privatePort] :: PortMap -> Port
+ Network.Docker.Types: [_publicPort] :: PortMap -> Port
+ Network.Docker.Types: [_repoTags] :: DockerImage -> [Tag]
+ Network.Docker.Types: [_size] :: DockerImage -> Int
+ Network.Docker.Types: [_status] :: DockerContainer -> String
+ Network.Docker.Types: [_stdinOnce] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_tty] :: CreateContainerOpts -> Bool
+ Network.Docker.Types: [_type] :: PortMap -> PortType
+ Network.Docker.Types: [_user] :: CreateContainerOpts -> String
+ Network.Docker.Types: [_virtualSize] :: DockerImage -> Int
+ Network.Docker.Types: [_volumesFrom] :: CreateContainerOpts -> Maybe Object
+ Network.Docker.Types: [_volumes] :: CreateContainerOpts -> Maybe Object
+ Network.Docker.Types: [_workingDir] :: CreateContainerOpts -> String
+ Network.Docker.Types: [apiVersion] :: DockerClientOpts -> ApiVersion
+ Network.Docker.Types: [baseUrl] :: DockerClientOpts -> URL
+ Network.Docker.Types: [force] :: DeleteOpts -> Bool
+ Network.Docker.Types: [optionsCert] :: SSLOptions -> FilePath
+ Network.Docker.Types: [optionsKey] :: SSLOptions -> FilePath
+ Network.Docker.Types: [removeVolumes] :: DeleteOpts -> Bool
+ Network.Docker.Types: [ssl] :: DockerClientOpts -> SSL
+ Network.Docker.Types: data SSL
+ Network.Docker.Types: data SSLOptions
+ Network.Docker.Types: instance Data.Aeson.Types.Class.FromJSON Network.Docker.Types.DockerContainer
+ Network.Docker.Types: instance Data.Aeson.Types.Class.FromJSON Network.Docker.Types.DockerImage
+ Network.Docker.Types: instance Data.Aeson.Types.Class.FromJSON Network.Docker.Types.DockerVersion
+ Network.Docker.Types: instance Data.Aeson.Types.Class.FromJSON Network.Docker.Types.PortMap
+ Network.Docker.Types: instance Data.Aeson.Types.Class.ToJSON Network.Docker.Types.CreateContainerOpts
+ Network.Docker.Types: instance Data.Aeson.Types.Class.ToJSON Network.Docker.Types.DockerVersion
+ Network.Docker.Types: instance Data.Aeson.Types.Class.ToJSON Network.Docker.Types.RestartPolicy
+ Network.Docker.Types: instance Data.Aeson.Types.Class.ToJSON Network.Docker.Types.StartContainerOpts
+ Network.Docker.Types: instance GHC.Classes.Eq Network.Docker.Types.DockerContainer
+ Network.Docker.Types: instance GHC.Classes.Eq Network.Docker.Types.DockerImage
+ Network.Docker.Types: instance GHC.Classes.Eq Network.Docker.Types.DockerVersion
+ Network.Docker.Types: instance GHC.Classes.Eq Network.Docker.Types.PortMap
+ Network.Docker.Types: instance GHC.Classes.Eq Network.Docker.Types.ResourceId
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.CreateContainerOpts
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.DockerClientOpts
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.DockerContainer
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.DockerImage
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.DockerVersion
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.PortMap
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.ResourceId
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.RestartPolicy
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.SSL
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.SSLOptions
+ Network.Docker.Types: instance GHC.Show.Show Network.Docker.Types.StartContainerOpts
+ Network.Docker.Types: instance Network.Docker.Types.HasResourceId Network.Docker.Types.DockerContainer
+ Network.Docker.Types: instance Network.Docker.Types.HasResourceId Network.Docker.Types.DockerImage
+ Network.Docker.Types: instance Network.Docker.Types.HasResourceId Network.Docker.Types.ResourceId
- Network.Docker: decodeResponse :: (FromJSON a, Functor f) => f (Response ByteString) -> f (Maybe a)
+ Network.Docker: decodeResponse :: (Functor f, FromJSON a) => f (Response ByteString) -> f (Maybe a)
- Network.Docker.Types: DockerClientOpts :: ApiVersion -> URL -> DockerClientOpts
+ Network.Docker.Types: DockerClientOpts :: ApiVersion -> URL -> SSL -> DockerClientOpts
- Network.Docker.Types: class HasResourceId c_acmu where id = (.) resourceId id
+ Network.Docker.Types: class HasResourceId c_ageN where id = (.) resourceId id
- Network.Docker.Types: id :: HasResourceId c_acmu => Lens' c_acmu String
+ Network.Docker.Types: id :: HasResourceId c_ageN => Lens' c_ageN String
- Network.Docker.Types: resourceId :: HasResourceId c_acmu => Lens' c_acmu ResourceId
+ Network.Docker.Types: resourceId :: HasResourceId c_ageN => Lens' c_ageN ResourceId

Files

Network/Docker.hs view
@@ -2,28 +2,33 @@  module Network.Docker where -import           Control.Applicative    ((<$>), (<*>))+import           Control.Applicative         ((<$>), (<*>)) import           Control.Lens-import           Data.Aeson             (FromJSON, ToJSON, decode, eitherDecode,-                                         toJSON)-import           Data.Aeson.Lens        (key, _String)+import           Data.Aeson                  (FromJSON, ToJSON, decode,+                                              eitherDecode, toJSON)+import           Data.Aeson.Lens             (key, _String) import           Data.Aeson.TH-import qualified Data.ByteString.Lazy   as L+import qualified Data.ByteString.Lazy        as L import           Data.Char-import qualified Data.Text              as T+import qualified Data.Text                   as T import           Network.Docker.Options import           Network.Docker.Types+import           Network.HTTP.Client.OpenSSL import           Network.Wreq+import           OpenSSL                     (withOpenSSL)+import           OpenSSL.Session             (SSLContext, context)+import qualified OpenSSL.Session             as SSL import           Pipes-import qualified Pipes.ByteString       as PB-import qualified Pipes.HTTP             as PH-import           Text.Printf            (printf)+import qualified Pipes.ByteString            as PB+import qualified Pipes.HTTP                  as PH+import           Text.Printf                 (printf)   defaultClientOpts :: DockerClientOpts defaultClientOpts = DockerClientOpts                 { apiVersion = "v1.12"                 , baseUrl = "http://127.0.0.1:3128/"+                , ssl = NoSSL                 }  constructUrl :: URL -> ApiVersion -> Endpoint -> URL@@ -40,11 +45,43 @@ fullUrl :: DockerClientOpts -> Endpoint -> URL fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) endpoint +setupSSLCtx :: SSLOptions -> IO SSLContext+setupSSLCtx (SSLOptions key cert) = do+  ctx <- SSL.context+  SSL.contextSetPrivateKeyFile  ctx key+  SSL.contextSetCertificateFile ctx cert+  SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3+  SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2+  return ctx+++mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)++getSSL+  :: SSLOptions+  -> String+  -> IO (Response L.ByteString)+getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url++postSSL+  :: ToJSON a+  => SSLOptions+  -> String+  -> a+  -> IO (Response L.ByteString)+postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON+ _dockerGetQuery :: Endpoint -> DockerClientOpts -> IO(Response L.ByteString)-_dockerGetQuery endpoint clientOpts = get (fullUrl clientOpts endpoint)+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} =+  get (fullUrl clientOpts endpoint)+_dockerGetQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} =+  getSSL sslOpts (fullUrl clientOpts endpoint)  _dockerPostQuery :: ToJSON a => Endpoint -> DockerClientOpts -> a -> IO (Response L.ByteString)-_dockerPostQuery endpoint clientOpts postObject = post (fullUrl clientOpts endpoint) (toJSON postObject)+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = NoSSL} postObject =+  post (fullUrl clientOpts endpoint) (toJSON postObject)+_dockerPostQuery endpoint clientOpts@DockerClientOpts{ssl = SSL sslOpts} postObject =+  postSSL sslOpts (fullUrl clientOpts endpoint) postObject  emptyPost = "" :: String _dockerEmptyPostQuery endpoint clientOpts = post (fullUrl clientOpts endpoint) (toJSON emptyPost)
Network/Docker/Types.hs view
@@ -6,10 +6,8 @@  module Network.Docker.Types where -import           Prelude                hiding(id) import           Control.Applicative import           Control.Lens.TH-import           Control.Lens.TH import           Data.Aeson import           Data.Aeson.TH import           Data.Bool@@ -20,7 +18,8 @@ import           GHC.Generics import           Network.Docker.Options import           Network.Wreq.Types     (Postable)-+import           OpenSSL.Session        (SSLContext)+import           Prelude                hiding (id)  type URL = String type ApiVersion = String@@ -31,10 +30,19 @@ type Port = Int type PortType = String +data SSL = NoSSL | SSL SSLOptions deriving Show+ data DockerClientOpts = DockerClientOpts {       apiVersion :: ApiVersion     , baseUrl    :: URL+    , ssl        :: SSL     } deriving (Show)+++data SSLOptions = SSLOptions {+    optionsKey  :: FilePath+  , optionsCert :: FilePath+  } deriving Show   data ResourceId = ResourceId { _id :: String } deriving (Show, Eq)
docker.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                docker-version:             0.2.0.2+version:             0.2.0.3 synopsis:            Haskell wrapper for Docker Remote API -- description: homepage:            https://github.com/denibertovic/docker-hs@@ -35,6 +35,8 @@                      , pipes >= 4.1.2                      , pipes-text >= 0.0.0.12                      , pipes-bytestring >= 2.1.0+                     , HsOpenSSL+                     , http-client-openssl   -- hs-source-dirs:   default-language:    Haskell2010 @@ -59,6 +61,8 @@                        , tasty-hunit >= 0.8                        , process                        , http-types+                       , HsOpenSSL+                       , http-client-openssl     type:                exitcode-stdio-1.0     main-is:             tests.hs     hs-source-dirs:      tests
tests/tests.hs view
@@ -1,21 +1,21 @@ module Main where -import Network.Docker-import Network.Docker.Types+import           Network.Docker+import           Network.Docker.Types -import Test.Tasty-import Test.Tasty.HUnit-import qualified Test.Tasty.QuickCheck as QC-import qualified Test.QuickCheck.Monadic as QCM+import qualified Test.QuickCheck.Monadic   as QCM+import           Test.Tasty+import           Test.Tasty.HUnit+import qualified Test.Tasty.QuickCheck     as QC -import Data.Maybe (isJust, fromJust)-import System.Process (system)-import Data.Text (unpack)-import Control.Concurrent (threadDelay)-import Network.HTTP.Types.Status-import qualified Data.ByteString.Char8 as C-import qualified Data.ByteString       as B-import qualified Data.ByteString.Lazy  as BL+import           Control.Concurrent        (threadDelay)+import qualified Data.ByteString           as B+import qualified Data.ByteString.Char8     as C+import qualified Data.ByteString.Lazy      as BL+import           Data.Maybe                (fromJust, isJust)+import           Data.Text                 (unpack)+import           Network.HTTP.Types.Status+import           System.Process            (system)  opts = defaultClientOpts { baseUrl = "http://127.0.0.1:2375/" }