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 +48/−11
- Network/Docker/Types.hs +11/−3
- docker.cabal +5/−1
- tests/tests.hs +14/−14
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/" }