Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / Query / Network.hs @ 36162faf

History | View | Annotate | Download (5.7 kB)

1 05092772 Helga Velroyen
{-| Implementation of the Ganeti Query2 node group queries.
2 05092772 Helga Velroyen
3 05092772 Helga Velroyen
 -}
4 05092772 Helga Velroyen
5 05092772 Helga Velroyen
{-
6 05092772 Helga Velroyen
7 36162faf Iustin Pop
Copyright (C) 2012, 2013 Google Inc.
8 05092772 Helga Velroyen
9 05092772 Helga Velroyen
This program is free software; you can redistribute it and/or modify
10 05092772 Helga Velroyen
it under the terms of the GNU General Public License as published by
11 05092772 Helga Velroyen
the Free Software Foundation; either version 2 of the License, or
12 05092772 Helga Velroyen
(at your option) any later version.
13 05092772 Helga Velroyen
14 05092772 Helga Velroyen
This program is distributed in the hope that it will be useful, but
15 05092772 Helga Velroyen
WITHOUT ANY WARRANTY; without even the implied warranty of
16 05092772 Helga Velroyen
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 05092772 Helga Velroyen
General Public License for more details.
18 05092772 Helga Velroyen
19 05092772 Helga Velroyen
You should have received a copy of the GNU General Public License
20 05092772 Helga Velroyen
along with this program; if not, write to the Free Software
21 05092772 Helga Velroyen
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 05092772 Helga Velroyen
02110-1301, USA.
23 05092772 Helga Velroyen
24 05092772 Helga Velroyen
-}
25 05092772 Helga Velroyen
26 05092772 Helga Velroyen
module Ganeti.Query.Network
27 834bea99 Helga Velroyen
  ( getGroupConnection
28 834bea99 Helga Velroyen
  , getNetworkUuid
29 834bea99 Helga Velroyen
  , instIsConnected
30 36162faf Iustin Pop
  , Runtime(..)
31 36162faf Iustin Pop
  , fieldsMap
32 05092772 Helga Velroyen
  ) where
33 05092772 Helga Velroyen
34 36162faf Iustin Pop
-- FIXME: everything except Runtime(..) and fieldsMap
35 834bea99 Helga Velroyen
-- is only exported for testing.
36 834bea99 Helga Velroyen
37 05092772 Helga Velroyen
import qualified Data.Map as Map
38 2d3d843d Helga Velroyen
import Data.Maybe (fromMaybe, mapMaybe)
39 0c6d6a52 Helga Velroyen
import Data.List (find)
40 05092772 Helga Velroyen
41 2d3d843d Helga Velroyen
import Ganeti.JSON
42 ae960018 Helga Velroyen
import Ganeti.Network
43 05092772 Helga Velroyen
import Ganeti.Objects
44 05092772 Helga Velroyen
import Ganeti.Query.Language
45 05092772 Helga Velroyen
import Ganeti.Query.Common
46 05092772 Helga Velroyen
import Ganeti.Query.Types
47 2d3d843d Helga Velroyen
import Ganeti.Types
48 05092772 Helga Velroyen
49 36162faf Iustin Pop
-- | There is no actual runtime.
50 36162faf Iustin Pop
data Runtime = Runtime
51 05092772 Helga Velroyen
52 36162faf Iustin Pop
networkFields :: FieldList Network Runtime
53 05092772 Helga Velroyen
networkFields =
54 05092772 Helga Velroyen
  [ (FieldDefinition "name" "Name" QFTText "Network name",
55 05092772 Helga Velroyen
     FieldSimple (rsNormal . networkName), QffNormal)
56 05092772 Helga Velroyen
  , (FieldDefinition "network" "Subnet" QFTText "IPv4 subnet",
57 05092772 Helga Velroyen
     FieldSimple (rsNormal . networkNetwork), QffNormal)
58 05092772 Helga Velroyen
  , (FieldDefinition "gateway" "Gateway" QFTOther "IPv4 gateway",
59 05092772 Helga Velroyen
     FieldSimple (rsMaybeUnavail . networkGateway), QffNormal)
60 05092772 Helga Velroyen
  , (FieldDefinition "network6" "IPv6Subnet" QFTOther "IPv6 subnet",
61 05092772 Helga Velroyen
     FieldSimple (rsMaybeUnavail . networkNetwork6), QffNormal)
62 05092772 Helga Velroyen
  , (FieldDefinition "gateway6" "IPv6Gateway" QFTOther "IPv6 gateway",
63 05092772 Helga Velroyen
     FieldSimple (rsMaybeUnavail . networkGateway6), QffNormal)
64 05092772 Helga Velroyen
  , (FieldDefinition "mac_prefix" "MacPrefix" QFTOther "MAC address prefix",
65 05092772 Helga Velroyen
     FieldSimple (rsMaybeUnavail . networkMacPrefix), QffNormal)
66 ae960018 Helga Velroyen
  , (FieldDefinition "free_count" "FreeCount" QFTOther "Number of free IPs",
67 ae960018 Helga Velroyen
     FieldSimple (rsMaybeNoData . fmap getFreeCount . createAddressPool),
68 ae960018 Helga Velroyen
     QffNormal)
69 ae960018 Helga Velroyen
  , (FieldDefinition "map" "Map" QFTText "Map of the network's reserved IPs",
70 ae960018 Helga Velroyen
     FieldSimple (rsMaybeNoData . fmap getMap . createAddressPool),
71 ae960018 Helga Velroyen
     QffNormal)
72 ae960018 Helga Velroyen
  , (FieldDefinition "reserved_count" "ReservedCount" QFTOther
73 ae960018 Helga Velroyen
       "Number of reserved IPs",
74 ae960018 Helga Velroyen
     FieldSimple (rsMaybeNoData . fmap getReservedCount . createAddressPool),
75 ae960018 Helga Velroyen
     QffNormal)
76 05092772 Helga Velroyen
  , (FieldDefinition "group_list" "GroupList" QFTOther "List of node groups",
77 05092772 Helga Velroyen
     FieldConfig (\cfg -> rsNormal . getGroupConnections cfg . networkUuid),
78 ae960018 Helga Velroyen
     QffNormal)
79 ae960018 Helga Velroyen
  , (FieldDefinition "group_cnt" "GroupCount" QFTOther "Number of node groups",
80 ae960018 Helga Velroyen
     FieldConfig (\cfg -> rsNormal . length . getGroupConnections cfg
81 ae960018 Helga Velroyen
       . networkUuid), QffNormal)
82 125df9a8 Helga Velroyen
  , (FieldDefinition "inst_list" "InstanceList" QFTOther "List of instances",
83 125df9a8 Helga Velroyen
     FieldConfig (\cfg -> rsNormal . getInstances cfg . networkUuid),
84 125df9a8 Helga Velroyen
     QffNormal)
85 125df9a8 Helga Velroyen
  , (FieldDefinition "inst_cnt" "InstanceCount" QFTOther "Number of instances",
86 125df9a8 Helga Velroyen
     FieldConfig (\cfg -> rsNormal . length . getInstances cfg
87 125df9a8 Helga Velroyen
       . networkUuid), QffNormal)
88 05092772 Helga Velroyen
  ] ++
89 05092772 Helga Velroyen
  uuidFields "Network" ++
90 05092772 Helga Velroyen
  serialFields "Network" ++
91 05092772 Helga Velroyen
  tagsFields
92 05092772 Helga Velroyen
93 05092772 Helga Velroyen
-- | The group fields map.
94 36162faf Iustin Pop
fieldsMap :: FieldMap Network Runtime
95 36162faf Iustin Pop
fieldsMap =
96 05092772 Helga Velroyen
  Map.fromList $ map (\v@(f, _, _) -> (fdefName f, v)) networkFields
97 05092772 Helga Velroyen
98 834bea99 Helga Velroyen
-- TODO: the following fields are not implemented yet: external_reservations
99 2d3d843d Helga Velroyen
100 2d3d843d Helga Velroyen
-- | Given a network's UUID, this function lists all connections from
101 2d3d843d Helga Velroyen
-- the network to nodegroups including the respective mode and links.
102 2d3d843d Helga Velroyen
getGroupConnections :: ConfigData -> String -> [(String, String, String)]
103 2d3d843d Helga Velroyen
getGroupConnections cfg network_uuid =
104 2d3d843d Helga Velroyen
  mapMaybe (getGroupConnection network_uuid)
105 2d3d843d Helga Velroyen
  ((Map.elems . fromContainer . configNodegroups) cfg)
106 2d3d843d Helga Velroyen
107 2d3d843d Helga Velroyen
-- | Given a network's UUID and a node group, this function assembles
108 2d3d843d Helga Velroyen
-- a tuple of the group's name, the mode and the link by which the
109 2d3d843d Helga Velroyen
-- network is connected to the group. Returns 'Nothing' if the network
110 2d3d843d Helga Velroyen
-- is not connected to the group.
111 2d3d843d Helga Velroyen
getGroupConnection :: String -> NodeGroup -> Maybe (String, String, String)
112 2d3d843d Helga Velroyen
getGroupConnection network_uuid group =
113 2d3d843d Helga Velroyen
  let networks = fromContainer . groupNetworks $ group
114 2d3d843d Helga Velroyen
  in case Map.lookup network_uuid networks of
115 2d3d843d Helga Velroyen
    Nothing -> Nothing
116 2d3d843d Helga Velroyen
    Just net ->
117 2d3d843d Helga Velroyen
      Just (groupName group, getNicMode net, getNicLink net)
118 2d3d843d Helga Velroyen
119 2d3d843d Helga Velroyen
-- | Retrieves the network's mode and formats it human-readable,
120 2d3d843d Helga Velroyen
-- also in case it is not available.
121 2d3d843d Helga Velroyen
getNicMode :: PartialNicParams -> String
122 2d3d843d Helga Velroyen
getNicMode nic_params =
123 2d3d843d Helga Velroyen
  maybe "-" nICModeToRaw $ nicpModeP nic_params
124 2d3d843d Helga Velroyen
125 2d3d843d Helga Velroyen
-- | Retrieves the network's link and formats it human-readable, also in
126 2d3d843d Helga Velroyen
-- case it it not available.
127 2d3d843d Helga Velroyen
getNicLink :: PartialNicParams -> String
128 2d3d843d Helga Velroyen
getNicLink nic_params = fromMaybe "-" (nicpLinkP nic_params)
129 2d3d843d Helga Velroyen
130 125df9a8 Helga Velroyen
-- | Retrieves the network's instances' names.
131 125df9a8 Helga Velroyen
getInstances :: ConfigData -> String -> [String]
132 125df9a8 Helga Velroyen
getInstances cfg network_uuid =
133 0c6d6a52 Helga Velroyen
  map instName (filter (instIsConnected cfg network_uuid)
134 125df9a8 Helga Velroyen
    ((Map.elems . fromContainer . configInstances) cfg))
135 125df9a8 Helga Velroyen
136 125df9a8 Helga Velroyen
-- | Helper function that checks if an instance is linked to the given network.
137 0c6d6a52 Helga Velroyen
instIsConnected :: ConfigData -> String -> Instance -> Bool
138 0c6d6a52 Helga Velroyen
instIsConnected cfg network_uuid inst =
139 0c6d6a52 Helga Velroyen
  network_uuid `elem` mapMaybe (getNetworkUuid cfg)
140 0c6d6a52 Helga Velroyen
    (mapMaybe nicNetwork (instNics inst))
141 0c6d6a52 Helga Velroyen
142 0c6d6a52 Helga Velroyen
-- | Helper function to look up a network's UUID by its name
143 0c6d6a52 Helga Velroyen
getNetworkUuid :: ConfigData -> String -> Maybe String
144 0c6d6a52 Helga Velroyen
getNetworkUuid cfg name =
145 0c6d6a52 Helga Velroyen
  let net = find (\n -> name == fromNonEmpty (networkName n))
146 0c6d6a52 Helga Velroyen
               ((Map.elems . fromContainer . configNetworks) cfg)
147 0c6d6a52 Helga Velroyen
  in fmap networkUuid net