diff --git a/INSTALL b/INSTALL index 6b3825d628c68443fbeab78e282f1772dd19d697..636d67bd6836ef987ebbaeb84e002f192748826a 100644 --- a/INSTALL +++ b/INSTALL @@ -133,19 +133,22 @@ deploy Ganeti on production machines). More specifically: `utf8-string <http://hackage.haskell.org/package/utf8-string>`_ libraries; these usually come with the GHC compiler - `deepseq <http://hackage.haskell.org/package/deepseq>`_ +- `curl <http://hackage.haskell.org/package/curl>`_, tested with + versions 1.3.4 and above Some of these are also available as package in Debian/Ubuntu:: $ apt-get install ghc6 libghc6-json-dev libghc6-network-dev \ - libghc6-parallel-dev libghc6-deepseq-dev + libghc6-parallel-dev libghc6-deepseq-dev \ + libghc6-curl-dev Or in newer versions of these distributions (using GHC 7.x):: $ apt-get install ghc libghc-json-dev libghc-network-dev \ - libghc-parallel-dev libghc-deepseq-dev \ - libghc-utf8-string-dev + libghc-parallel-dev libghc-deepseq-dev \ + libghc-utf8-string-dev libghc-curl-dev -In Fedora, they are available via packages as well:: +In Fedora, some of them are available via packages as well:: $ yum install ghc ghc-json-devel ghc-network-devel \ ghc-parallel-devel ghc-deepseq-devel @@ -158,25 +161,16 @@ the Haskell platform. You can also install ``cabal`` manually:: Then install the additional libraries via ``cabal``:: - $ cabal install json network parallel utf8-string - -The compilation of the htools components is automatically enabled when -the compiler and the requisite libraries are found. You can use the -``--enable-htools`` configure flag to force the selection (at which -point ``./configure`` will fail if it doesn't find the prerequisites). - + $ cabal install json network parallel utf8-string curl Haskell optional features ~~~~~~~~~~~~~~~~~~~~~~~~~ Optionally, more functionality can be enabled if your build machine has -a few more Haskell libraries enabled: RAPI access to remote cluster from -htools (``--enable-htools-rapi``), the ``ganeti-confd`` -daemon (``--enable-confd``) and the monitoring agent +a few more Haskell libraries enabled: the ``ganeti-confd`` daemon +(``--enable-confd``) and the monitoring agent (``--enable-monitoring``). The list of extra dependencies for these is: -- `curl <http://hackage.haskell.org/package/curl>`_, tested with - versions 1.3.4 and above - `hslogger <http://software.complete.org/hslogger>`_, version 1.1 and above (note that Debian Squeeze only has version 1.0.9) - `Crypto <http://hackage.haskell.org/package/Crypto>`_, tested with @@ -193,19 +187,19 @@ These libraries are available in Debian Wheezy (but not in Squeeze, with the exception of curl), so you can use either apt:: $ apt-get install libghc-hslogger-dev libghc-crypto-dev libghc-text-dev \ - libghc-hinotify-dev libghc-regex-pcre-dev libghc-curl-dev \ + libghc-hinotify-dev libghc-regex-pcre-dev \ libghc-attoparsec-dev libghc-vector-dev or ``cabal``:: - $ cabal install hslogger Crypto text hinotify regex-pcre curl \ + $ cabal install hslogger Crypto text hinotify regex-pcre \ attoparsec vector to install them. -The most recent Fedora doesn't provide ``curl``, ``crypto``, -``inotify``. So these need to be installed using ``cabal``, if -desired. The other packages can be installed via ``yum``:: +The most recent Fedora doesn't provide ``crypto``, ``inotify``. So these +need to be installed using ``cabal``, if desired. The other packages can +be installed via ``yum``:: $ yum install ghc-hslogger-devel ghc-text-devel \ ghc-regex-pcre-devel diff --git a/Makefile.am b/Makefile.am index d38f1157232c583c38db13ba4800f579fce9ee80..88054a0d340148fad232b0d72fadd4fa0b088f71 100644 --- a/Makefile.am +++ b/Makefile.am @@ -770,7 +770,7 @@ $(HS_ALL_PROGS): %: %.hs $(HS_LIBTEST_SRCS) $(HS_BUILT_SRCS) Makefile @rm -f $(notdir $@).tix $(GHC) --make \ $(HFLAGS) \ - $(HS_NOCURL) $(HS_PARALLEL3) $(HS_REGEX_PCRE) \ + $(HS_PARALLEL3) $(HS_REGEX_PCRE) \ -osuf $(notdir $@).o -hisuf $(notdir $@).hi \ $(HEXTRA) $(HEXTRA_INT) $@ @touch "$@" @@ -1844,10 +1844,7 @@ hs-apidoc: $(HS_BUILT_SRCS) $(LN_S) ../hscolour.css $(APIDOC_HS_DIR)/Ganeti/Confd/hscolour.css set -e ; \ cd src; \ - if [ "$(HS_NOCURL)" ]; \ - then OPTGHC="--optghc=$(HS_NOCURL)"; \ - else OPTGHC=""; \ - fi; \ + OPTGHC=""; \ if [ "$(HS_PARALLEL3)" ]; \ then OPTGHC="$$OPTGHC --optghc=$(HS_PARALLEL3)"; \ fi; \ @@ -1871,7 +1868,7 @@ TAGS: $(GENERATED_FILES) rm -f TAGS $(GHC) -e ":etags" -v0 \ $(filter-out -O -Werror,$(HFLAGS)) \ - $(HS_NOCURL) $(HS_PARALLEL3) $(HS_REGEX_PCRE) \ + $(HS_PARALLEL3) $(HS_REGEX_PCRE) \ $(HS_LIBTEST_SRCS) find . -path './lib/*.py' -o -path './scripts/gnt-*' -o \ -path './daemons/ganeti-*' -o -path './tools/*' -o \ diff --git a/configure.ac b/configure.ac index 0683f5fcb8b6465e1234f628ee11bdd760434391..e00771adc9ca5ce4b3494e8a7dc1ddf7e3e20722 100644 --- a/configure.ac +++ b/configure.ac @@ -467,14 +467,6 @@ then AC_MSG_WARN([qemu-img not found, using ovfconverter will not be possible]) fi -# --enable-htools-rapi -HTOOLS_RAPI= -AC_ARG_ENABLE([htools-rapi], - [AS_HELP_STRING([--enable-htools-rapi], - [enable use of curl in the Haskell code (default: check)])], - [], - [enable_htools_rapi=check]) - # --enable-confd ENABLE_CONFD= AC_ARG_ENABLE([confd], @@ -517,29 +509,13 @@ fi # check for modules, first custom/special checks AC_MSG_NOTICE([checking for required haskell modules]) -HS_NOCURL=-DNO_CURL -if test "$enable_htools_rapi" != no; then - AC_GHC_PKG_CHECK([curl], [HS_NOCURL=], []) - if test -n "$HS_NOCURL"; then - if test "$enable_htools_rapi" = check; then - AC_MSG_WARN(m4_normalize([The curl library was not found, Haskell - code will be compiled without RAPI support])) - else - AC_MSG_FAILURE(m4_normalize([The curl library was not found, but it has - been requested])) - fi - else - AC_MSG_NOTICE([Enabling curl/RAPI/RPC usage in Haskell code]) - fi -fi -AC_SUBST(HS_NOCURL) - HS_PARALLEL3= AC_GHC_PKG_CHECK([parallel-3.*], [HS_PARALLEL3=-DPARALLEL3], [AC_GHC_PKG_REQUIRE(parallel)], t) AC_SUBST(HS_PARALLEL3) # and now standard modules +AC_GHC_PKG_REQUIRE(curl) AC_GHC_PKG_REQUIRE(json) AC_GHC_PKG_REQUIRE(network) AC_GHC_PKG_REQUIRE(mtl) @@ -641,8 +617,8 @@ AC_ARG_ENABLE([split-query], ;; esac ]], - [[case "x${has_confd}x${HS_NOCURL}x" in - xTruexx) + [[case "x${has_confd}x" in + xTruex) enable_split_query=True ;; *) @@ -655,10 +631,6 @@ if test x$enable_split_query = xTrue -a x$has_confd != xTrue; then AC_MSG_ERROR([Split queries require the confd daemon]) fi -if test x$enable_split_query = xTrue -a x$HS_NOCURL != x; then - AC_MSG_ERROR([Split queries require the htools-rapi feature (curl library)]) -fi - if test x$enable_split_query = xTrue; then AC_MSG_NOTICE([Split query functionality enabled]) fi diff --git a/src/Ganeti/HTools/Backend/Rapi.hs b/src/Ganeti/HTools/Backend/Rapi.hs index eaf061c4c81d026a5900c23536ead2f455cce624..5a1cd49349babd5cd6bfc84a394e2a53dd00ab18 100644 --- a/src/Ganeti/HTools/Backend/Rapi.hs +++ b/src/Ganeti/HTools/Backend/Rapi.hs @@ -33,10 +33,8 @@ module Ganeti.HTools.Backend.Rapi import Control.Exception import Data.List (isPrefixOf) import Data.Maybe (fromMaybe) -#ifndef NO_CURL import Network.Curl import Network.Curl.Types () -#endif import Control.Monad import Text.JSON (JSObject, fromJSObject, decodeStrict) import Text.JSON.Types (JSValue(..)) @@ -61,11 +59,6 @@ filePrefix = "file://" -- | Read an URL via curl and return the body if successful. getUrl :: (Monad m) => String -> IO (m String) -#ifdef NO_CURL -getUrl _ = return $ fail "RAPI/curl backend disabled at compile time" - -#else - -- | Connection timeout (when using non-file methods). connTimeout :: Long connTimeout = 15 @@ -88,7 +81,6 @@ getUrl url = do CurlOK -> return body _ -> fail $ printf "Curl error for '%s', error %s" url (show code)) -#endif -- | Helper to convert I/O errors in 'Bad' values. ioErrToResult :: IO a -> IO (Result a) diff --git a/src/Ganeti/Rpc.hs b/src/Ganeti/Rpc.hs index 284bb5ef75667a60da1f7fb11e200ac3c978c69e..2eabd36790e60ad38df3af19577679a130f03f41 100644 --- a/src/Ganeti/Rpc.hs +++ b/src/Ganeti/Rpc.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, CPP, +{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, BangPatterns, TemplateHaskell #-} {-| Implementation of the RPC client. @@ -7,7 +7,7 @@ {- -Copyright (C) 2012 Google Inc. +Copyright (C) 2012, 2013 Google Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -75,10 +75,8 @@ import Data.Maybe (fromMaybe) import qualified Text.JSON as J import Text.JSON.Pretty (pp_value) -#ifndef NO_CURL import Network.Curl import qualified Ganeti.Path as P -#endif import qualified Ganeti.Constants as C import Ganeti.Objects @@ -88,7 +86,6 @@ import Ganeti.Compat -- * Base RPC functionality and types -#ifndef NO_CURL -- | The curl options used for RPC. curlOpts :: [CurlOption] curlOpts = [ CurlFollowLocation False @@ -98,12 +95,10 @@ curlOpts = [ CurlFollowLocation False , CurlSSLKeyType "PEM" , CurlConnectTimeout (fromIntegral C.rpcConnectTimeout) ] -#endif -- | Data type for RPC error reporting. data RpcError - = CurlDisabledError - | CurlLayerError Node String + = CurlLayerError Node String | JsonDecodeError String | RpcResultError String | OfflineNodeError Node @@ -111,8 +106,6 @@ data RpcError -- | Provide explanation to RPC errors. explainRpcError :: RpcError -> String -explainRpcError CurlDisabledError = - "RPC/curl backend disabled at compile time" explainRpcError (CurlLayerError node code) = "Curl error for " ++ nodeName node ++ ", " ++ code explainRpcError (JsonDecodeError msg) = @@ -164,9 +157,6 @@ executeHttpRequest :: Node -> ERpcError HttpClientRequest -> IO (ERpcError String) executeHttpRequest _ (Left rpc_err) = return $ Left rpc_err -#ifdef NO_CURL -executeHttpRequest _ _ = return $ Left CurlDisabledError -#else executeHttpRequest node (Right request) = do cert_file <- P.nodedCertFile let reqOpts = [ CurlTimeout (fromIntegral $ requestTimeout request) @@ -181,7 +171,6 @@ executeHttpRequest node (Right request) = do return $ case code of CurlOK -> Right body _ -> Left $ CurlLayerError node (show code) -#endif -- | Prepare url for the HTTP request. prepareUrl :: (RpcCall a) => Node -> a -> String