Revision bac48afe src/Ganeti/Query/Network.hs

b/src/Ganeti/Query/Network.hs
37 37

  
38 38
import qualified Data.Map as Map
39 39
import Data.Maybe (fromMaybe, mapMaybe)
40
import Data.List (find)
40
import Data.List (find, foldl', intercalate)
41 41

  
42 42
import Ganeti.JSON
43 43
import Ganeti.Network
......
88 88
  , (FieldDefinition "inst_cnt" "Instances" QFTNumber "Number of instances",
89 89
     FieldConfig (\cfg -> rsNormal . length . getInstances cfg
90 90
       . networkUuid), QffNormal)
91
  , (FieldDefinition "external_reservations" "ExternalReservations" QFTText
92
     "External reservations",
93
     FieldSimple getExtReservationsString, QffNormal)
91 94
  ] ++
92 95
  uuidFields "Network" ++
93 96
  serialFields "Network" ++
......
149 152
               ((Map.elems . fromContainer . configNetworks) cfg)
150 153
  in fmap networkUuid net
151 154

  
155
-- | Computes the reservations list for a network.
156
--
157
-- This doesn't use the netmask for validation of the length, instead
158
-- simply iterating over the reservations string.
159
getReservations :: Ip4Network -> String -> [Ip4Address]
160
getReservations (Ip4Network net _) =
161
  reverse .
162
  fst .
163
  foldl' (\(accu, addr) c ->
164
            let addr' = nextIp4Address addr
165
                accu' = case c of
166
                          '1' -> addr:accu
167
                          '0' -> accu
168
                          _ -> -- FIXME: the reservations string
169
                               -- should be a proper type
170
                               accu
171
            in (accu', addr')) ([], net)
172

  
173
-- | Computes the external reservations as string for a network.
174
getExtReservationsString :: Network -> ResultEntry
175
getExtReservationsString net =
176
  let addrs = getReservations (networkNetwork net)
177
              (fromMaybe "" $ networkExtReservations net)
178
  in rsNormal . intercalate ", " $ map show addrs
179

  
152 180
-- | Dummy function for collecting live data (which networks don't have).
153 181
collectLiveData :: Bool -> ConfigData -> [Network] -> IO [(Network, Runtime)]
154 182
collectLiveData _ _ = return . map (\n -> (n, Runtime))

Also available in: Unified diff