{-| Module describing a node group. -} {- Copyright (C) 2010, 2011, 2012 Google Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -} module Ganeti.HTools.Group ( Group(..) , List , AssocList -- * Constructor , create , setIdx , isAllocable ) where import qualified Ganeti.HTools.Container as Container import qualified Ganeti.HTools.Types as T -- * Type declarations -- | The node group type. data Group = Group { name :: String -- ^ The node name , uuid :: T.GroupID -- ^ The UUID of the group , idx :: T.Gdx -- ^ Internal index for book-keeping , allocPolicy :: T.AllocPolicy -- ^ The allocation policy for this group , networks :: [T.NetworkID] -- ^ The networks connected to this group , iPolicy :: T.IPolicy -- ^ The instance policy for this group , allTags :: [String] -- ^ The tags for this group } deriving (Show, Eq) -- Note: we use the name as the alias, and the UUID as the official -- name instance T.Element Group where nameOf = uuid idxOf = idx setAlias = setName setIdx = setIdx allNames n = [name n, uuid n] -- | A simple name for the int, node association list. type AssocList = [(T.Gdx, Group)] -- | A simple name for a node map. type List = Container.Container Group -- * Initialization functions -- | Create a new group. create :: String -- ^ The node name -> T.GroupID -- ^ The UUID of the group -> T.AllocPolicy -- ^ The allocation policy for this group -> [T.NetworkID] -- ^ The networks connected to this group -> T.IPolicy -- ^ The instance policy for this group -> [String] -- ^ The tags for this group -> Group create name_init id_init apol_init nets_init ipol_init tags_init = Group { name = name_init , uuid = id_init , allocPolicy = apol_init , networks = nets_init , iPolicy = ipol_init , allTags = tags_init , idx = -1 } -- | Sets the group index. -- -- This is used only during the building of the data structures. setIdx :: Group -> T.Gdx -> Group setIdx t i = t {idx = i} -- | Changes the alias. -- -- This is used only during the building of the data structures. setName :: Group -> String -> Group setName t s = t { name = s } -- | Checks if a group is allocable. isAllocable :: Group -> Bool isAllocable = (/= T.AllocUnallocable) . allocPolicy