Statistics
| Branch: | Tag: | Revision:

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
  ]