on master help sign in
Fixes bad merges

Removes comments, and makes things compile again.

commit95ed15d163963339bb6ee79343e3a3eea0324022 authorDeni Bertovic <deni@denibertovic.com> dateTue 23 Feb 2016, 15:59 (11 years ago) parent363df85
4 files changed+70−111
Network/Docker.hs+14−81 Network/Docker/Internal.hs+51−21 Network/Docker/Types.hs+4−9 docker.cabal+1
Network/Docker.hs+14−81
@@ -4,95 +4,26 @@
44
55module Network.Docker where
66
7−import Control.Applicative ((<$>), (<*>))
7+import Control.Applicative ((<$>), (<*>))
8+import Control.Lens
89import Control.Monad.Free
9−import Data.Aeson (FromJSON, ToJSON, Value, decode,
10− eitherDecode, toJSON)
11−import Data.Aeson.Lens (key, _String)
12−import qualified Data.ByteString.Lazy as L
10+import Data.Aeson (FromJSON, ToJSON, Value, decode,
11+ eitherDecode, toJSON)
12+import Data.Aeson.Lens (key, _String)
13+import qualified Data.ByteString.Lazy as L
1314import Data.Char
14−import qualified Data.Text as T
15−import Network.HTTP.Client.OpenSSL
15+import qualified Data.Text as T
1616import Network.Wreq
17−import OpenSSL (withOpenSSL)
18−import OpenSSL.Session (SSLContext, context)
19−import qualified OpenSSL.Session as SSL
2017import Pipes
2118import Pipes
22−import qualified Pipes.ByteString as PB
23−import qualified Pipes.HTTP as PH
24−import Text.Printf (printf)
19+import qualified Pipes.ByteString as PB
20+import qualified Pipes.HTTP as PH
21+import Text.Printf (printf)
2522
2623import Network.Docker.Internal
2724import Network.Docker.Options
2825import Network.Docker.Types
2926
30−emptyPost = "" :: String
31−
32−defaultClientOpts :: DockerClientOpts
33−defaultClientOpts = DockerClientOpts
34− { apiVersion = "v1.12"
35− , baseUrl = "http://127.0.0.1:3128/"
36− , ssl = NoSSL
37− }
38−run :: HttpRequestM r -> IO (Response L.ByteString)
39−run (Free (Get url)) = get url
40−run (Free (GetSSL sslOpts url)) = getSSL sslOpts url
41−run (Free (Post url body)) = post url body
42−run (Free (PostSSL sslOpts url body)) = postSSL sslOpts url body
43−
44−constructUrl :: URL -> ApiVersion -> String -> URL
45−constructUrl url apiVersion endpoint = printf "%s%s%s" url apiVersion endpoint
46−
47−-- decodeResponse :: Response L.ByteString -> a
48−decodeResponse r = decode (r ^. responseBody)
49−
50−getElemFromResponse k r = (^? responseBody . key k . _String) r
51−
52−getResponseStatusCode r = (^. responseStatus) r
53−
54−
55−setupSSLCtx :: SSLOptions -> IO SSLContext
56−setupSSLCtx (SSLOptions key cert) = do
57− ctx <- SSL.context
58− SSL.contextSetPrivateKeyFile ctx key
59− SSL.contextSetCertificateFile ctx cert
60− SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3
61− SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2
62− return ctx
63−
64−
65−mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
66−
67−getSSL
68− :: SSLOptions
69− -> String
70− -> IO (Response L.ByteString)
71−getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
72−
73−postSSL
74− :: ToJSON a
75− => SSLOptions
76− -> String
77− -> a
78− -> IO (Response L.ByteString)
79−postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
80−
81−_dockerGetQuery :: DockerClientOpts -> Endpoint -> HttpRequestM Endpoint
82−_dockerGetQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Get (fullUrl clientOpts endpoint))
83−_dockerGetQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (GetSSL sslOpts (fullUrl clientOpts endpoint))
84−
85−_dockerPostQuery :: ToJSON a => DockerClientOpts -> Endpoint -> a -> HttpRequestM Endpoint
86−_dockerPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
87−_dockerPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint postObject = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON postObject))
88−
89−_dockerEmptyPostQuery :: DockerClientOpts -> Endpoint -> HttpRequestM Endpoint
90−_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
91−_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON emptyPost))
92−
93−
94−_dockerEmptyDeleteQuery endpoint clientOpts = delete (fullUrl clientOpts endpoint)
95−
9627getDockerVersion :: DockerClientOpts -> IO (Maybe DockerVersion)
9728getDockerVersion clientOpts = decodeResponse <$> runDocker (getDockerVersionM clientOpts SVersionEndpoint)
9829
@@ -131,10 +62,12 @@ deleteContainerWithOpts clientOpts deleteOpts cid = (^. responseStatus) <$>
13162 runDocker (deleteContainerM clientOpts (SDeleteContainerEndpoint cid deleteOpts))
13263
13364getContainerLogsWithOpts :: DockerClientOpts -> LogOpts -> String -> IO (L.ByteString)
134−getContainerLogsWithOpts clientOpts l cid = (^. responseBody) <$> runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid l))
65+getContainerLogsWithOpts clientOpts l cid = (^. responseBody) <$>
66+ runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid l))
13567
13668getContainerLogs :: DockerClientOpts -> String -> IO (L.ByteString)
137−getContainerLogs clientOpts cid = (^. responseBody) <$> runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid defaultLogOpts))
69+getContainerLogs clientOpts cid = (^. responseBody) <$>
70+ runDocker (getContainerLogsM clientOpts (SContainerLogsEndpoint cid defaultLogOpts))
13871
13972getContainerLogsStream :: DockerClientOpts -> String -> IO ()
14073getContainerLogsStream clientOpts cid = do
Network/Docker/Internal.hs+51−21
@@ -5,25 +5,28 @@ module Network.Docker.Internal where
55
66import Control.Lens
77import Control.Monad.Free
8−import Data.Aeson (FromJSON, ToJSON, Value, decode,
9− eitherDecode, toJSON)
10−import Data.Aeson.Lens (key, _String)
11−import qualified Data.ByteString.Lazy as L
8+import Data.Aeson (FromJSON, ToJSON, Value, decode,
9+ eitherDecode, toJSON)
10+import Data.Aeson.Lens (key, _String)
11+import qualified Data.ByteString.Lazy as L
12+import Network.HTTP.Client.OpenSSL
1213import Network.Wreq
13−-- import Pipes
14−-- import qualified Pipes.ByteString as PB
15−-- import qualified Pipes.HTTP as PH
16−import Text.Printf (printf)
14+import OpenSSL (withOpenSSL)
15+import OpenSSL.Session (SSLContext, context)
16+import qualified OpenSSL.Session as SSL
17+import Text.Printf (printf)
1718
1819import Network.Docker.Types
1920
2021emptyPost = "" :: String
2122
22−
2323runDocker :: HttpRequestM r -> IO (Response L.ByteString)
2424runDocker (Free (Get url)) = get url
25+runDocker (Free (GetSSL sslOpts url)) = getSSL sslOpts url
2526runDocker (Free (Post url body)) = post url body
27+runDocker (Free (PostSSL sslOpts url body)) = postSSL sslOpts url body
2628runDocker (Free (Delete url)) = delete url
29+runDocker (Free (DeleteSSL sslOpts url)) = deleteSSL sslOpts url
2730
2831constructUrl :: URL -> ApiVersion -> String -> URL
2932constructUrl url apiVersion endpoint = printf "%s%s%s" url apiVersion endpoint
@@ -51,20 +54,55 @@ getEndpoint (SContainerLogsEndpoint cid (LogOpts stdout stderr follow )) =
5154getEndpoint (SDeleteContainerEndpoint cid (DeleteOpts removeVolumes force)) =
5255 printf "/containers/%s?v=%s;force=%s" cid (show removeVolumes) (show force)
5356
57+setupSSLCtx :: SSLOptions -> IO SSLContext
58+setupSSLCtx (SSLOptions key cert) = do
59+ ctx <- SSL.context
60+ SSL.contextSetPrivateKeyFile ctx key
61+ SSL.contextSetCertificateFile ctx cert
62+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv3
63+ SSL.contextAddOption ctx SSL.SSL_OP_NO_SSLv2
64+ return ctx
65+
66+mkOpts c = defaults & manager .~ Left (opensslManagerSettings c)
67+
68+getSSL
69+ :: SSLOptions
70+ -> String
71+ -> IO (Response L.ByteString)
72+getSSL sopts url = withOpenSSL $ getWith (mkOpts $ setupSSLCtx sopts) url
73+
74+postSSL
75+ :: ToJSON a
76+ => SSLOptions
77+ -> String
78+ -> a
79+ -> IO (Response L.ByteString)
80+postSSL sopts url = withOpenSSL . postWith (mkOpts $ setupSSLCtx sopts) url . toJSON
81+
82+deleteSSL
83+ :: SSLOptions
84+ -> String
85+ -> IO (Response L.ByteString)
86+deleteSSL sopts url = withOpenSSL $ deleteWith (mkOpts $ setupSSLCtx sopts) url
87+
5488fullUrl :: DockerClientOpts -> SEndpoint a -> URL
5589fullUrl clientOpts endpoint = constructUrl (baseUrl clientOpts) (apiVersion clientOpts) (getEndpoint endpoint)
5690
5791_dockerGetQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
58−_dockerGetQuery clientOpts endpoint = Free (Get (fullUrl clientOpts endpoint))
92+_dockerGetQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Get (fullUrl clientOpts endpoint))
93+_dockerGetQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (GetSSL sslOpts (fullUrl clientOpts endpoint))
5994
6095_dockerPostQuery :: ToJSON b => DockerClientOpts -> SEndpoint a -> b -> HttpRequestM (SEndpoint a)
61−_dockerPostQuery clientOpts endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
96+_dockerPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint postObject = Free (Post (fullUrl clientOpts endpoint) (toJSON postObject))
97+_dockerPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint postObject = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON postObject))
6298
6399_dockerEmptyPostQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
64−_dockerEmptyPostQuery clientOpts endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
100+_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Post (fullUrl clientOpts endpoint) (toJSON emptyPost))
101+_dockerEmptyPostQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (PostSSL sslOpts (fullUrl clientOpts endpoint) (toJSON emptyPost))
65102
66103_dockerDeleteQuery :: DockerClientOpts -> SEndpoint a -> HttpRequestM (SEndpoint a)
67−_dockerDeleteQuery clientOpts endpoint = Free $ Delete $ fullUrl clientOpts endpoint
104+_dockerDeleteQuery clientOpts@DockerClientOpts{ssl = NoSSL} endpoint = Free (Delete (fullUrl clientOpts endpoint))
105+_dockerDeleteQuery clientOpts@DockerClientOpts{ssl = SSL sslOpts} endpoint = Free (DeleteSSL sslOpts (fullUrl clientOpts endpoint))
68106
69107getDockerVersionM :: DockerClientOpts -> SEndpoint VersionEndpoint -> HttpRequestM (SEndpoint VersionEndpoint)
70108getDockerVersionM clientOpts e = _dockerGetQuery clientOpts e
@@ -102,11 +140,3 @@ deleteContainerM clientOpts e = _dockerDeleteQuery clientOpts e
102140getContainerLogsM :: DockerClientOpts -> SEndpoint ContainerLogsEndpoint -> HttpRequestM (SEndpoint ContainerLogsEndpoint)
103141getContainerLogsM clientOpts e = _dockerGetQuery clientOpts e
104142
105−-- getContainerLogsM :: DockerClientOpts -> SEndpoint ContainerLogsEndpoint -> Bool -> HttpRequestM (SEndpoint ContainerLogsEndpoint)
106−-- getContainerLogsM clientOpts e f = case f of
107−-- False -> _dockerGetQuery clientOpts e
108−-- True -> do
109−-- req <- PH.parseUrl ((fullUrl clientOpts e) ++ "&follow=1")
110−-- let req' = req {PH.method = "GET"}
111−-- PH.withManager PH.defaultManagerSettings $ \m -> PH.withHTTP req' m $ \resp -> runEffect $ PH.responseBody resp >-> PB.stdout
112−
Network/Docker/Types.hs+4−9
@@ -73,13 +73,17 @@ defaultClientOpts :: DockerClientOpts
7373defaultClientOpts = DockerClientOpts
7474 { apiVersion = "v1.20"
7575 , baseUrl = "http://127.0.0.1:2375/"
76+ , ssl = NoSSL
7677 }
7778
7879
7980data HttpRequestF a =
8081 Get URL
82+ | GetSSL SSLOptions URL
8183 | Post URL Value
84+ | PostSSL SSLOptions URL Value
8285 | Delete URL
86+ | DeleteSSL SSLOptions URL
8387 deriving ( Functor, Show )
8488
8589
@@ -215,11 +219,6 @@ instance ToJSON CreateContainerOpts where
215219 , "ExposedPorts" .= _exposedPorts
216220 ]
217221
218−-- data CreateContainerResponse = CreateContainerResponse
219−-- { _createdContainerId :: String
220−-- , _warnings :: Maybe [T.Text]
221−-- } deriving (Show)
222−
223222data StartContainerOpts = StartContainerOpts
224223 { _Binds :: [T.Text]
225224 , _Links :: [T.Text]
@@ -293,10 +292,6 @@ instance FromJSON DockerContainer where
293292 <*> (v .: "Status")
294293 <*> (v .:? "Ports")
295294
296−-- instance FromJSON CreateContainerResponse where
297−-- parseJSON (Object v) =
298−-- CreateContainerResponse <$> (v .: "Id")
299−-- <*> (v .:? "warnings")
300295
301296instance ToJSON DockerVersion where
302297 toJSON = genericToJSON defaultOptions {
docker.cabal+1
@@ -37,6 +37,7 @@ library
3737 , pipes-bytestring >= 2.1.0
3838 , HsOpenSSL
3939 , http-client-openssl
40+ , free >= 4.9
4041 -- hs-source-dirs:
4142 default-language: Haskell2010
4243