{-# LANGUAGE DeriveDataTypeable #-}
{-| Data types describing the execution environment
    of virtual machine builds.
    'ExecEnv', 'Resources' and 'SharedDirectory' describe how
    "B9.LibVirtLXC" should configure and execute
    build scripts, as defined in "B9.ShellScript" and "B9.Vm".
    -}
module B9.ExecEnv (
    ExecEnv(..),
    Resources(..),
    noResources,
    SharedDirectory(..),
    CPUArch(..),
    RamSize(..),
    ) where

import Data.Data
import Data.Monoid

import B9.DiskImages

data ExecEnv = ExecEnv { envName :: String
                       , envImageMounts :: [Mounted Image]
                       , envSharedDirectories :: [SharedDirectory]
                       , envResources :: Resources
                       }

data SharedDirectory = SharedDirectory FilePath MountPoint
                     | SharedDirectoryRO FilePath MountPoint
                     | SharedSources MountPoint
  deriving (Read, Show, Typeable, Data, Eq)

data Resources = Resources { maxMemory :: RamSize
                           , cpuCount :: Int
                           , cpuArch :: CPUArch
                           }
  deriving (Read, Show, Typeable, Data)

instance Monoid Resources where
  mempty = Resources mempty 1 mempty
  mappend (Resources m c a) (Resources m' c' a') = Resources (m <> m') (max c c') (a <> a')

noResources :: Resources
noResources = mempty

data CPUArch = X86_64
             | I386
  deriving (Read, Show, Typeable, Data, Eq)

instance Monoid CPUArch where
    mempty = I386
    I386 `mappend` x = x
    X86_64 `mappend` _ = X86_64

data RamSize = RamSize Int SizeUnit
             | AutomaticRamSize
  deriving (Eq, Read, Show, Ord, Typeable, Data)

instance Monoid RamSize where
    mempty = AutomaticRamSize
    AutomaticRamSize `mappend` x = x
    x `mappend` AutomaticRamSize = x
    r `mappend` r' = max r r'