Revision 6b6e335b

b/htools/Ganeti/HTools/Group.hs
46 46
  , idx         :: T.Gdx         -- ^ Internal index for book-keeping
47 47
  , allocPolicy :: T.AllocPolicy -- ^ The allocation policy for this group
48 48
  , iPolicy     :: T.IPolicy     -- ^ The instance policy for this group
49
  , allTags     :: [String]      -- ^ The tags for this group
49 50
  } deriving (Show, Read, Eq)
50 51

  
51 52
-- Note: we use the name as the alias, and the UUID as the official
......
66 67
-- * Initialization functions
67 68

  
68 69
-- | Create a new group.
69
create :: String -> T.GroupID -> T.AllocPolicy -> T.IPolicy -> Group
70
create name_init id_init apol_init ipol_init =
70
create :: String -> T.GroupID -> T.AllocPolicy -> T.IPolicy -> [String] -> Group
71
create name_init id_init apol_init ipol_init tags_init =
71 72
  Group { name        = name_init
72 73
        , uuid        = id_init
73 74
        , allocPolicy = apol_init
74 75
        , iPolicy     = ipol_init
76
        , allTags     = tags_init
75 77
        , idx         = -1
76 78
        }
77 79

  
b/htools/Ganeti/HTools/IAlloc.hs
130 130
  name <- extract "name"
131 131
  apol <- extract "alloc_policy"
132 132
  ipol <- extract "ipolicy"
133
  return (u, Group.create name u apol ipol)
133
  tags <- extract "tags"
134
  return (u, Group.create name u apol ipol tags)
134 135

  
135 136
-- | Top-level parser.
136 137
--
b/htools/Ganeti/HTools/Luxi.hs
116 116
-- | The input data for node group query.
117 117
queryGroupsMsg :: L.LuxiOp
118 118
queryGroupsMsg =
119
  L.Query L.QRGroup ["uuid", "name", "alloc_policy", "ipolicy"] ()
119
  L.Query L.QRGroup ["uuid", "name", "alloc_policy", "ipolicy", "tags"] ()
120 120

  
121 121
-- | Wraper over 'callMethod' doing node query.
122 122
queryNodes :: L.Client -> IO (Result JSValue)
......
218 218

  
219 219
-- | Parses a given group information.
220 220
parseGroup :: [(JSValue, JSValue)] -> Result (String, Group.Group)
221
parseGroup [uuid, name, apol, ipol] = do
221
parseGroup [uuid, name, apol, ipol, tags] = do
222 222
  xname <- annotateResult "Parsing new group" (fromJValWithStatus name)
223 223
  let convert a = genericConvert "Group" xname a
224 224
  xuuid <- convert "uuid" uuid
225 225
  xapol <- convert "alloc_policy" apol
226 226
  xipol <- convert "ipolicy" ipol
227
  return (xuuid, Group.create xname xuuid xapol xipol)
227
  xtags <- convert "tags" tags
228
  return (xuuid, Group.create xname xuuid xapol xipol xtags)
228 229

  
229 230
parseGroup v = fail ("Invalid group query result: " ++ show v)
230 231

  
b/htools/Ganeti/HTools/QC.hs
157 157
defGroup :: Group.Group
158 158
defGroup = flip Group.setIdx 0 $
159 159
             Group.create "default" Types.defaultGroupID Types.AllocPreferred
160
                  nullIPolicy
160
                  nullIPolicy []
161 161

  
162 162
defGroupList :: Group.List
163 163
defGroupList = Container.fromList [(Group.idx defGroup, defGroup)]
b/htools/Ganeti/HTools/Rapi.hs
177 177
  uuid <- extract "uuid"
178 178
  apol <- extract "alloc_policy"
179 179
  ipol <- extract "ipolicy"
180
  return (uuid, Group.create name uuid apol ipol)
180
  tags <- extract "tags"
181
  return (uuid, Group.create name uuid apol ipol tags)
181 182

  
182 183
-- | Parse cluster data from the info resource.
183 184
parseCluster :: JSObject JSValue -> Result ([String], IPolicy)
b/htools/Ganeti/HTools/Simu.hs
83 83
                           (fromIntegral cpu) False spindles grpIndex
84 84
                  ) [1..ncount]
85 85
      grp = Group.create (printf "group-%02d" grpIndex)
86
            (printf "fake-uuid-%02d" grpIndex) apol defIPolicy
86
            (printf "fake-uuid-%02d" grpIndex) apol defIPolicy []
87 87
  return (Group.setIdx grp grpIndex, nodes)
88 88

  
89 89
-- | Builds the cluster data from node\/instance files.
b/htools/Ganeti/HTools/Text.hs
66 66
-- | Serialize a single group.
67 67
serializeGroup :: Group.Group -> String
68 68
serializeGroup grp =
69
  printf "%s|%s|%s" (Group.name grp) (Group.uuid grp)
69
  printf "%s|%s|%s|%s" (Group.name grp) (Group.uuid grp)
70 70
           (allocPolicyToRaw (Group.allocPolicy grp))
71
           (intercalate "," (Group.allTags grp))
71 72

  
72 73
-- | Generate group file data from a group list.
73 74
serializeGroups :: Group.List -> String
......
167 168
loadGroup :: (Monad m) => [String]
168 169
          -> m (String, Group.Group) -- ^ The result, a tuple of group
169 170
                                     -- UUID and group object
170
loadGroup [name, gid, apol] = do
171
loadGroup [name, gid, apol, tags] = do
171 172
  xapol <- allocPolicyFromRaw apol
172
  return (gid, Group.create name gid xapol defIPolicy)
173
  let xtags = commaSplit tags
174
  return (gid, Group.create name gid xapol defIPolicy xtags)
173 175

  
174 176
loadGroup s = fail $ "Invalid/incomplete group data: '" ++ show s ++ "'"
175 177

  
b/lib/cmdlib.py
14834 14834
      "name": gdata.name,
14835 14835
      "alloc_policy": gdata.alloc_policy,
14836 14836
      "ipolicy": _CalculateGroupIPolicy(cluster, gdata),
14837
      "tags": list(gdata.tags),
14837 14838
      })
14838 14839
      for guuid, gdata in cfg.GetAllNodeGroupsInfo().items())
14839 14840

  
b/test/data/htools/common-suffix.data
1
default|fake-uuid-01|preferred
1
default|fake-uuid-01|preferred|
2 2

  
3 3
node1.example.com|1024|0|1024|95367|95367|4|N|fake-uuid-01|1
4 4
node2.example.com|1024|0|896|95367|94343|4|N|fake-uuid-01|1
b/test/data/htools/hail-alloc-drbd.json
43 43
        "spindle-ratio": 32.0
44 44
      },
45 45
      "alloc_policy": "preferred",
46
      "tags": [],
46 47
      "name": "default"
47 48
    }
48 49
  },
b/test/data/htools/hail-change-group.json
43 43
        "spindle-ratio": 32.0
44 44
      },
45 45
      "alloc_policy": "preferred",
46
      "tags": [],
46 47
      "name": "default"
47 48
    },
48 49
    "uuid-group-2": {
......
84 85
        "spindle-ratio": 32.0
85 86
      },
86 87
      "alloc_policy": "preferred",
88
      "tags": [],
87 89
      "name": "empty"
88 90
    }
89 91
  },
b/test/data/htools/hail-node-evac.json
43 43
        "spindle-ratio": 32.0
44 44
      },
45 45
      "alloc_policy": "preferred",
46
      "tags": [],
46 47
      "name": "default"
47 48
    }
48 49
  },
b/test/data/htools/hail-reloc-drbd.json
43 43
        "spindle-ratio": 32.0
44 44
      },
45 45
      "alloc_policy": "preferred",
46
      "tags": [],
46 47
      "name": "default"
47 48
    }
48 49
  },
b/test/data/htools/hbal-excl-tags.data
1
group-01|fake-uuid-01|preferred
1
group-01|fake-uuid-01|preferred|
2 2

  
3 3
node-01|16384|0|14336|409600|153600|16|N|fake-uuid-01|1
4 4
node-02|16384|0|13312|409600|153600|16|N|fake-uuid-01|1
b/test/data/htools/hbal-split-insts.data
1
group-01|fake-uuid-01|preferred
2
group-02|fake-uuid-02|preferred
1
group-01|fake-uuid-01|preferred|
2
group-02|fake-uuid-02|preferred|
3 3

  
4 4
node-01-001|98304|0|96256|8388608|8355840|16|N|fake-uuid-01|1
5 5
node-01-002|98304|0|96256|8388608|8355840|16|N|fake-uuid-01|1
b/test/data/htools/invalid-node.data
1
group-01|fake-uuid-01|preferred
1
group-01|fake-uuid-01|preferred|
2 2

  
3 3
node-01-001|1024|0|1024|95367|95367|4|N|fake-uuid-01|1
4 4
node-01-002|1024|0|896|95367|94343|4|N|fake-uuid-01|1
b/test/data/htools/missing-resources.data
1
default|fake-uuid-01|preferred
1
default|fake-uuid-01|preferred|
2 2

  
3 3
node1|1024|0|1024|95367|95367|4|N|fake-uuid-01|1
4 4
node2|1024|0|0|95367|0|4|N|fake-uuid-01|1

Also available in: Unified diff