root / src / Ganeti / Metad.hs @ 13d26b66
History | View | Annotate | Download (3.2 kB)
1 | 3af1359f | Jose A. Lopes | {-| Metadata daemon |
---|---|---|---|
2 | 3af1359f | Jose A. Lopes | |
3 | 3af1359f | Jose A. Lopes | -} |
4 | 3af1359f | Jose A. Lopes | |
5 | 3af1359f | Jose A. Lopes | {- |
6 | 3af1359f | Jose A. Lopes | |
7 | 3af1359f | Jose A. Lopes | Copyright (C) 2014 Google Inc. |
8 | 3af1359f | Jose A. Lopes | |
9 | 3af1359f | Jose A. Lopes | This program is free software; you can redistribute it and/or modify |
10 | 3af1359f | Jose A. Lopes | it under the terms of the GNU General Public License as published by |
11 | 3af1359f | Jose A. Lopes | the Free Software Foundation; either version 2 of the License, or |
12 | 3af1359f | Jose A. Lopes | (at your option) any later version. |
13 | 3af1359f | Jose A. Lopes | |
14 | 3af1359f | Jose A. Lopes | This program is distributed in the hope that it will be useful, but |
15 | 3af1359f | Jose A. Lopes | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | 3af1359f | Jose A. Lopes | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | 3af1359f | Jose A. Lopes | General Public License for more details. |
18 | 3af1359f | Jose A. Lopes | |
19 | 3af1359f | Jose A. Lopes | You should have received a copy of the GNU General Public License |
20 | 3af1359f | Jose A. Lopes | along with this program; if not, write to the Free Software |
21 | 3af1359f | Jose A. Lopes | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
22 | 3af1359f | Jose A. Lopes | 02110-1301, USA. |
23 | 3af1359f | Jose A. Lopes | |
24 | 3af1359f | Jose A. Lopes | -} |
25 | 3af1359f | Jose A. Lopes | |
26 | 3af1359f | Jose A. Lopes | module Ganeti.Metad (start) where |
27 | 3af1359f | Jose A. Lopes | |
28 | 3af1359f | Jose A. Lopes | import Control.Applicative |
29 | 3af1359f | Jose A. Lopes | import Control.Monad.IO.Class (liftIO) |
30 | 3af1359f | Jose A. Lopes | import qualified Data.ByteString.Char8 as ByteString (pack, unpack) |
31 | 3af1359f | Jose A. Lopes | import Snap.Core |
32 | 3af1359f | Jose A. Lopes | import Snap.Http.Server |
33 | 3af1359f | Jose A. Lopes | |
34 | 3af1359f | Jose A. Lopes | import Ganeti.Daemon |
35 | 3af1359f | Jose A. Lopes | import qualified Ganeti.Constants as Constants |
36 | 3af1359f | Jose A. Lopes | import qualified Ganeti.Logging as Logging |
37 | 3af1359f | Jose A. Lopes | import Ganeti.Runtime (GanetiDaemon(..), ExtraLogReason(..)) |
38 | 3af1359f | Jose A. Lopes | import qualified Ganeti.Runtime as Runtime |
39 | 3af1359f | Jose A. Lopes | |
40 | 3af1359f | Jose A. Lopes | type MetaM = Snap () |
41 | 3af1359f | Jose A. Lopes | |
42 | 3af1359f | Jose A. Lopes | error404 :: MetaM |
43 | 3af1359f | Jose A. Lopes | error404 = do |
44 | 3af1359f | Jose A. Lopes | modifyResponse . setResponseStatus 404 $ ByteString.pack "Not found" |
45 | 3af1359f | Jose A. Lopes | writeBS $ ByteString.pack "Resource not found" |
46 | 3af1359f | Jose A. Lopes | |
47 | 3af1359f | Jose A. Lopes | handleMetadata :: Method -> String -> String -> String -> MetaM |
48 | 3af1359f | Jose A. Lopes | handleMetadata GET "ganeti" "latest" "meta_data.json" = |
49 | 3af1359f | Jose A. Lopes | liftIO $ Logging.logInfo "ganeti metadata" |
50 | 3af1359f | Jose A. Lopes | handleMetadata GET "ganeti" "latest" "os/parameters.json" = |
51 | 3af1359f | Jose A. Lopes | liftIO $ Logging.logInfo "ganeti OS parameters" |
52 | 3af1359f | Jose A. Lopes | handleMetadata GET "ganeti" "latest" "read" = |
53 | 3af1359f | Jose A. Lopes | liftIO $ Logging.logInfo "ganeti READ" |
54 | 3af1359f | Jose A. Lopes | handleMetadata POST "ganeti" "latest" "write" = |
55 | 3af1359f | Jose A. Lopes | liftIO $ Logging.logInfo "ganeti WRITE" |
56 | 3af1359f | Jose A. Lopes | handleMetadata _ _ _ _ = error404 |
57 | 3af1359f | Jose A. Lopes | |
58 | 3af1359f | Jose A. Lopes | routeMetadata :: MetaM |
59 | 3af1359f | Jose A. Lopes | routeMetadata = |
60 | 3af1359f | Jose A. Lopes | route [ (providerRoute1, dispatchMetadata) |
61 | 3af1359f | Jose A. Lopes | , (providerRoute2, dispatchMetadata) |
62 | 3af1359f | Jose A. Lopes | ] <|> dispatchMetadata |
63 | 3af1359f | Jose A. Lopes | where provider = "provider" |
64 | 3af1359f | Jose A. Lopes | version = "version" |
65 | 3af1359f | Jose A. Lopes | |
66 | 3af1359f | Jose A. Lopes | providerRoute1 = ByteString.pack $ ':':provider ++ "/" ++ ':':version |
67 | 3af1359f | Jose A. Lopes | providerRoute2 = ByteString.pack $ ':':version |
68 | 3af1359f | Jose A. Lopes | |
69 | 3af1359f | Jose A. Lopes | getParamString :: String -> Snap String |
70 | 3af1359f | Jose A. Lopes | getParamString = |
71 | 3af1359f | Jose A. Lopes | fmap (maybe "" ByteString.unpack) . getParam . ByteString.pack |
72 | 3af1359f | Jose A. Lopes | |
73 | 3af1359f | Jose A. Lopes | dispatchMetadata = |
74 | 3af1359f | Jose A. Lopes | do m <- rqMethod <$> getRequest |
75 | 3af1359f | Jose A. Lopes | p <- getParamString provider |
76 | 3af1359f | Jose A. Lopes | v <- getParamString version |
77 | 3af1359f | Jose A. Lopes | r <- ByteString.unpack . rqPathInfo <$> getRequest |
78 | 3af1359f | Jose A. Lopes | handleMetadata m p v r |
79 | 3af1359f | Jose A. Lopes | |
80 | 3af1359f | Jose A. Lopes | defaultHttpConf :: DaemonOptions -> FilePath -> FilePath -> Config Snap () |
81 | 3af1359f | Jose A. Lopes | defaultHttpConf opts accessLog errorLog = |
82 | 3af1359f | Jose A. Lopes | maybe id (setBind . ByteString.pack) (optBindAddress opts) . |
83 | 3af1359f | Jose A. Lopes | setAccessLog (ConfigFileLog accessLog) . |
84 | 3af1359f | Jose A. Lopes | setCompression False . |
85 | 3af1359f | Jose A. Lopes | setErrorLog (ConfigFileLog errorLog) . |
86 | 3af1359f | Jose A. Lopes | setPort (maybe Constants.defaultMetadPort fromIntegral (optPort opts)) . |
87 | 3af1359f | Jose A. Lopes | setVerbose False $ |
88 | 3af1359f | Jose A. Lopes | emptyConfig |
89 | 3af1359f | Jose A. Lopes | |
90 | 3af1359f | Jose A. Lopes | start :: DaemonOptions -> IO () |
91 | 3af1359f | Jose A. Lopes | start opts = do |
92 | 3af1359f | Jose A. Lopes | accessLog <- Runtime.daemonsExtraLogFile GanetiMetad AccessLog |
93 | 3af1359f | Jose A. Lopes | errorLog <- Runtime.daemonsExtraLogFile GanetiMetad ErrorLog |
94 | 3af1359f | Jose A. Lopes | httpServe (defaultHttpConf opts accessLog errorLog) routeMetadata |