root / htools / Ganeti / Network.hs @ 55abd2c7
History | View | Annotate | Download (3.5 kB)
1 | 76a0266e | Helga Velroyen | {-| Implementation of the Ganeti network objects. |
---|---|---|---|
2 | 76a0266e | Helga Velroyen | |
3 | 76a0266e | Helga Velroyen | This is does not (yet) cover all methods that are provided in the |
4 | 76a0266e | Helga Velroyen | corresponding python implementation (network.py). |
5 | 76a0266e | Helga Velroyen | |
6 | 76a0266e | Helga Velroyen | -} |
7 | 76a0266e | Helga Velroyen | |
8 | 76a0266e | Helga Velroyen | {- |
9 | 76a0266e | Helga Velroyen | |
10 | 76a0266e | Helga Velroyen | Copyright (C) 2011, 2012 Google Inc. |
11 | 76a0266e | Helga Velroyen | |
12 | 76a0266e | Helga Velroyen | This program is free software; you can redistribute it and/or modify |
13 | 76a0266e | Helga Velroyen | it under the terms of the GNU General Public License as published by |
14 | 76a0266e | Helga Velroyen | the Free Software Foundation; either version 2 of the License, or |
15 | 76a0266e | Helga Velroyen | (at your option) any later version. |
16 | 76a0266e | Helga Velroyen | |
17 | 76a0266e | Helga Velroyen | This program is distributed in the hope that it will be useful, but |
18 | 76a0266e | Helga Velroyen | WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | 76a0266e | Helga Velroyen | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
20 | 76a0266e | Helga Velroyen | General Public License for more details. |
21 | 76a0266e | Helga Velroyen | |
22 | 76a0266e | Helga Velroyen | You should have received a copy of the GNU General Public License |
23 | 76a0266e | Helga Velroyen | along with this program; if not, write to the Free Software |
24 | 76a0266e | Helga Velroyen | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
25 | 76a0266e | Helga Velroyen | 02110-1301, USA. |
26 | 76a0266e | Helga Velroyen | |
27 | 76a0266e | Helga Velroyen | -} |
28 | 76a0266e | Helga Velroyen | |
29 | 76a0266e | Helga Velroyen | module Ganeti.Network |
30 | 76a0266e | Helga Velroyen | ( AddressPool(..) |
31 | 76a0266e | Helga Velroyen | , createAddressPool |
32 | 76a0266e | Helga Velroyen | , bitStringToBitVector |
33 | 76a0266e | Helga Velroyen | , allReservations |
34 | 76a0266e | Helga Velroyen | , getReservedCount |
35 | 76a0266e | Helga Velroyen | , getFreeCount |
36 | 76a0266e | Helga Velroyen | , isFull |
37 | 76a0266e | Helga Velroyen | , getMap |
38 | 76a0266e | Helga Velroyen | , networkIsValid |
39 | 76a0266e | Helga Velroyen | ) where |
40 | 76a0266e | Helga Velroyen | |
41 | 76a0266e | Helga Velroyen | import qualified Data.Vector.Unboxed as V |
42 | 76a0266e | Helga Velroyen | |
43 | 76a0266e | Helga Velroyen | import Ganeti.Objects |
44 | 76a0266e | Helga Velroyen | |
45 | 76a0266e | Helga Velroyen | data AddressPool = AddressPool { network :: Network, |
46 | 76a0266e | Helga Velroyen | reservations :: V.Vector Bool, |
47 | 76a0266e | Helga Velroyen | extReservations :: V.Vector Bool } |
48 | 76a0266e | Helga Velroyen | deriving (Show) |
49 | 76a0266e | Helga Velroyen | |
50 | 76a0266e | Helga Velroyen | -- | Create an address pool from a network. |
51 | 76a0266e | Helga Velroyen | createAddressPool :: Network -> Maybe AddressPool |
52 | 76a0266e | Helga Velroyen | createAddressPool n |
53 | 76a0266e | Helga Velroyen | | networkIsValid n = |
54 | 76a0266e | Helga Velroyen | let res = maybeStr2BitVec $ networkReservations n |
55 | 76a0266e | Helga Velroyen | ext_res = maybeStr2BitVec $ networkExtReservations n |
56 | 76a0266e | Helga Velroyen | in Just AddressPool { reservations = res |
57 | 76a0266e | Helga Velroyen | , extReservations = ext_res |
58 | 76a0266e | Helga Velroyen | , network = n } |
59 | 76a0266e | Helga Velroyen | | otherwise = Nothing |
60 | 76a0266e | Helga Velroyen | |
61 | 76a0266e | Helga Velroyen | -- | Checks the consistency of the network object. So far, only checks the |
62 | 76a0266e | Helga Velroyen | -- length of the reservation strings. |
63 | 76a0266e | Helga Velroyen | networkIsValid :: Network -> Bool |
64 | 76a0266e | Helga Velroyen | networkIsValid n = sameLength (networkReservations n) (networkExtReservations n) |
65 | 76a0266e | Helga Velroyen | |
66 | 76a0266e | Helga Velroyen | -- | Checks if two maybe strings are both nothing or of equal length. |
67 | 76a0266e | Helga Velroyen | sameLength :: Maybe String -> Maybe String -> Bool |
68 | 76a0266e | Helga Velroyen | sameLength Nothing Nothing = True |
69 | 76a0266e | Helga Velroyen | sameLength (Just s1) (Just s2) = length s1 == length s2 |
70 | 76a0266e | Helga Velroyen | sameLength _ _ = False |
71 | 76a0266e | Helga Velroyen | |
72 | 76a0266e | Helga Velroyen | -- | Converts a maybe bit string to a bit vector. Returns an empty bit vector on |
73 | 76a0266e | Helga Velroyen | -- nothing. |
74 | 76a0266e | Helga Velroyen | maybeStr2BitVec :: Maybe String -> V.Vector Bool |
75 | 76a0266e | Helga Velroyen | maybeStr2BitVec (Just s) = bitStringToBitVector s |
76 | 76a0266e | Helga Velroyen | maybeStr2BitVec Nothing = V.fromList ([]::[Bool]) |
77 | 76a0266e | Helga Velroyen | |
78 | 76a0266e | Helga Velroyen | -- | Converts a string to a bit vector. The character '0' is interpreted |
79 | 76a0266e | Helga Velroyen | -- as 'False', all others as 'True'. |
80 | 76a0266e | Helga Velroyen | bitStringToBitVector :: String -> V.Vector Bool |
81 | 76a0266e | Helga Velroyen | bitStringToBitVector = V.fromList . map (/= '0') |
82 | 76a0266e | Helga Velroyen | |
83 | 76a0266e | Helga Velroyen | -- | Get a bit vector of all reservations (internal and external) combined. |
84 | 76a0266e | Helga Velroyen | allReservations :: AddressPool -> V.Vector Bool |
85 | 76a0266e | Helga Velroyen | allReservations a = V.zipWith (||) (reservations a) (extReservations a) |
86 | 76a0266e | Helga Velroyen | |
87 | 76a0266e | Helga Velroyen | -- | Get the count of reserved addresses. |
88 | 76a0266e | Helga Velroyen | getReservedCount :: AddressPool -> Int |
89 | 76a0266e | Helga Velroyen | getReservedCount = V.length . V.filter (== True) . allReservations |
90 | 76a0266e | Helga Velroyen | |
91 | 76a0266e | Helga Velroyen | -- | Get the count of free addresses. |
92 | 76a0266e | Helga Velroyen | getFreeCount :: AddressPool -> Int |
93 | 76a0266e | Helga Velroyen | getFreeCount = V.length . V.filter (== False) . allReservations |
94 | 76a0266e | Helga Velroyen | |
95 | 76a0266e | Helga Velroyen | -- | Check whether the network is full. |
96 | 76a0266e | Helga Velroyen | isFull :: AddressPool -> Bool |
97 | 76a0266e | Helga Velroyen | isFull = V.and . allReservations |
98 | 76a0266e | Helga Velroyen | |
99 | 76a0266e | Helga Velroyen | -- | Return a textual representation of the network's occupation status. |
100 | 76a0266e | Helga Velroyen | getMap :: AddressPool -> String |
101 | 76a0266e | Helga Velroyen | getMap = V.toList . V.map mapPixel . allReservations |
102 | 76a0266e | Helga Velroyen | where mapPixel c = if c then 'X' else '.' |