root / test / hs / Test / Ganeti / Kvmd.hs @ dde8b625
History | View | Annotate | Download (3.6 kB)
1 | 588d0ee4 | Jose A. Lopes | {-# LANGUAGE TemplateHaskell #-} |
---|---|---|---|
2 | 588d0ee4 | Jose A. Lopes | {-| Unittests for the KVM daemon. |
3 | 588d0ee4 | Jose A. Lopes | |
4 | 588d0ee4 | Jose A. Lopes | -} |
5 | 588d0ee4 | Jose A. Lopes | |
6 | 588d0ee4 | Jose A. Lopes | {- |
7 | 588d0ee4 | Jose A. Lopes | |
8 | 588d0ee4 | Jose A. Lopes | Copyright (C) 2013 Google Inc. |
9 | 588d0ee4 | Jose A. Lopes | |
10 | 588d0ee4 | Jose A. Lopes | This program is free software; you can redistribute it and/or modify |
11 | 588d0ee4 | Jose A. Lopes | it under the terms of the GNU General Public License as published by |
12 | 588d0ee4 | Jose A. Lopes | the Free Software Foundation; either version 2 of the License, or |
13 | 588d0ee4 | Jose A. Lopes | (at your option) any later version. |
14 | 588d0ee4 | Jose A. Lopes | |
15 | 588d0ee4 | Jose A. Lopes | This program is distributed in the hope that it will be useful, but |
16 | 588d0ee4 | Jose A. Lopes | WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | 588d0ee4 | Jose A. Lopes | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | 588d0ee4 | Jose A. Lopes | General Public License for more details. |
19 | 588d0ee4 | Jose A. Lopes | |
20 | 588d0ee4 | Jose A. Lopes | You should have received a copy of the GNU General Public License |
21 | 588d0ee4 | Jose A. Lopes | along with this program; if not, write to the Free Software |
22 | 588d0ee4 | Jose A. Lopes | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
23 | 588d0ee4 | Jose A. Lopes | 02110-1301, USA. |
24 | 588d0ee4 | Jose A. Lopes | |
25 | 588d0ee4 | Jose A. Lopes | -} |
26 | 588d0ee4 | Jose A. Lopes | |
27 | 588d0ee4 | Jose A. Lopes | module Test.Ganeti.Kvmd (testKvmd) where |
28 | 588d0ee4 | Jose A. Lopes | |
29 | 588d0ee4 | Jose A. Lopes | import Control.Concurrent |
30 | 588d0ee4 | Jose A. Lopes | import Control.Exception (try) |
31 | 588d0ee4 | Jose A. Lopes | import qualified Network.Socket as Socket |
32 | 588d0ee4 | Jose A. Lopes | import System.Directory |
33 | 588d0ee4 | Jose A. Lopes | import System.FilePath |
34 | 588d0ee4 | Jose A. Lopes | import System.IO |
35 | 588d0ee4 | Jose A. Lopes | |
36 | 588d0ee4 | Jose A. Lopes | import qualified Ganeti.Kvmd as Kvmd |
37 | 588d0ee4 | Jose A. Lopes | import qualified Ganeti.UDSServer as UDSServer |
38 | 588d0ee4 | Jose A. Lopes | import Test.HUnit as HUnit |
39 | 588d0ee4 | Jose A. Lopes | |
40 | 588d0ee4 | Jose A. Lopes | import qualified Test.Ganeti.TestHelper as TestHelper (testSuite) |
41 | 588d0ee4 | Jose A. Lopes | import qualified Test.Ganeti.TestCommon as TestCommon (getTempFileName) |
42 | 588d0ee4 | Jose A. Lopes | |
43 | 588d0ee4 | Jose A. Lopes | import qualified Ganeti.Logging as Logging |
44 | 588d0ee4 | Jose A. Lopes | |
45 | 588d0ee4 | Jose A. Lopes | {-# ANN module "HLint: ignore Use camelCase" #-} |
46 | 588d0ee4 | Jose A. Lopes | |
47 | 588d0ee4 | Jose A. Lopes | startKvmd :: FilePath -> IO ThreadId |
48 | 588d0ee4 | Jose A. Lopes | startKvmd dir = |
49 | 588d0ee4 | Jose A. Lopes | forkIO (do Logging.setupLogging Nothing "ganeti-kvmd" False False |
50 | 588d0ee4 | Jose A. Lopes | False Logging.SyslogNo |
51 | 588d0ee4 | Jose A. Lopes | Kvmd.startWith dir) |
52 | 588d0ee4 | Jose A. Lopes | |
53 | 588d0ee4 | Jose A. Lopes | stopKvmd :: ThreadId -> IO () |
54 | 588d0ee4 | Jose A. Lopes | stopKvmd = killThread |
55 | 588d0ee4 | Jose A. Lopes | |
56 | 588d0ee4 | Jose A. Lopes | delayKvmd :: IO () |
57 | 588d0ee4 | Jose A. Lopes | delayKvmd = threadDelay 1000000 |
58 | 588d0ee4 | Jose A. Lopes | |
59 | 588d0ee4 | Jose A. Lopes | detectShutdown :: (Handle -> IO ()) -> IO Bool |
60 | 588d0ee4 | Jose A. Lopes | detectShutdown putFn = |
61 | 588d0ee4 | Jose A. Lopes | do monitorDir <- TestCommon.getTempFileName "ganeti" |
62 | 588d0ee4 | Jose A. Lopes | let monitor = "instance.qmp" |
63 | 588d0ee4 | Jose A. Lopes | monitorFile = monitorDir </> monitor |
64 | 588d0ee4 | Jose A. Lopes | shutdownFile = Kvmd.shutdownPath monitorFile |
65 | 588d0ee4 | Jose A. Lopes | -- ensure the KVM directory exists |
66 | 588d0ee4 | Jose A. Lopes | createDirectoryIfMissing True monitorDir |
67 | 588d0ee4 | Jose A. Lopes | -- ensure the shutdown file does not exist |
68 | 588d0ee4 | Jose A. Lopes | (try (removeFile shutdownFile) :: IO (Either IOError ())) >> return () |
69 | 588d0ee4 | Jose A. Lopes | -- start KVM daemon |
70 | 588d0ee4 | Jose A. Lopes | threadId <- startKvmd monitorDir |
71 | 588d0ee4 | Jose A. Lopes | threadDelay 1000 |
72 | 588d0ee4 | Jose A. Lopes | -- create a Unix socket |
73 | 588d0ee4 | Jose A. Lopes | sock <- UDSServer.openServerSocket monitorFile |
74 | 588d0ee4 | Jose A. Lopes | Socket.listen sock 1 |
75 | 588d0ee4 | Jose A. Lopes | handle <- UDSServer.acceptSocket sock |
76 | 588d0ee4 | Jose A. Lopes | -- read 'qmp_capabilities' message |
77 | 588d0ee4 | Jose A. Lopes | res <- try . hGetLine $ handle :: IO (Either IOError String) |
78 | 588d0ee4 | Jose A. Lopes | case res of |
79 | 588d0ee4 | Jose A. Lopes | Left err -> |
80 | 588d0ee4 | Jose A. Lopes | assertFailure $ "Expecting " ++ show Kvmd.monitorGreeting ++ |
81 | 588d0ee4 | Jose A. Lopes | ", received " ++ show err |
82 | 588d0ee4 | Jose A. Lopes | Right str -> Kvmd.monitorGreeting @=? str |
83 | 588d0ee4 | Jose A. Lopes | -- send Qmp messages |
84 | 588d0ee4 | Jose A. Lopes | putFn handle |
85 | 588d0ee4 | Jose A. Lopes | hFlush handle |
86 | 588d0ee4 | Jose A. Lopes | -- close the Unix socket |
87 | 588d0ee4 | Jose A. Lopes | UDSServer.closeClientSocket handle |
88 | 588d0ee4 | Jose A. Lopes | UDSServer.closeServerSocket sock monitorFile |
89 | 588d0ee4 | Jose A. Lopes | -- KVM needs time to create the shutdown file |
90 | 588d0ee4 | Jose A. Lopes | delayKvmd |
91 | 588d0ee4 | Jose A. Lopes | -- stop the KVM daemon |
92 | 588d0ee4 | Jose A. Lopes | stopKvmd threadId |
93 | 588d0ee4 | Jose A. Lopes | -- check for shutdown file |
94 | 588d0ee4 | Jose A. Lopes | doesFileExist shutdownFile |
95 | 588d0ee4 | Jose A. Lopes | |
96 | 588d0ee4 | Jose A. Lopes | case_DetectAdminShutdown :: Assertion |
97 | 588d0ee4 | Jose A. Lopes | case_DetectAdminShutdown = |
98 | 588d0ee4 | Jose A. Lopes | do res <- detectShutdown putMessage |
99 | 588d0ee4 | Jose A. Lopes | assertBool "Detected user shutdown instead of administrator shutdown" $ |
100 | 588d0ee4 | Jose A. Lopes | not res |
101 | 588d0ee4 | Jose A. Lopes | where putMessage handle = |
102 | 588d0ee4 | Jose A. Lopes | do hPrint handle "POWERDOWN" |
103 | 588d0ee4 | Jose A. Lopes | hPrint handle "SHUTDOWN" |
104 | 588d0ee4 | Jose A. Lopes | |
105 | 588d0ee4 | Jose A. Lopes | case_DetectUserShutdown :: Assertion |
106 | 588d0ee4 | Jose A. Lopes | case_DetectUserShutdown = |
107 | 588d0ee4 | Jose A. Lopes | do res <- detectShutdown putMessage |
108 | 588d0ee4 | Jose A. Lopes | assertBool "Detected administrator shutdown instead of user shutdown" res |
109 | 588d0ee4 | Jose A. Lopes | where putMessage handle = |
110 | 588d0ee4 | Jose A. Lopes | hPrint handle "SHUTDOWN" |
111 | 588d0ee4 | Jose A. Lopes | |
112 | 588d0ee4 | Jose A. Lopes | TestHelper.testSuite "Kvmd" |
113 | 588d0ee4 | Jose A. Lopes | [ 'case_DetectAdminShutdown |
114 | 588d0ee4 | Jose A. Lopes | , 'case_DetectUserShutdown |
115 | 588d0ee4 | Jose A. Lopes | ] |