summaryrefslogtreecommitdiff
path: root/src/Propellor/Types/Info.hs
blob: 6aba1f9f64743b08ec578a016254f1f2be9f72a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
module Propellor.Types.Info where

import Propellor.Types.OS
import Propellor.Types.PrivData
import qualified Propellor.Types.Dns as Dns

import qualified Data.Set as S
import Data.Monoid

-- | Information about a host.
data Info = Info
	{ _os :: Val System
	, _privDataFields :: S.Set (PrivDataField, Context)
	, _sshPubKey :: Val String
	, _aliases :: S.Set HostName
	, _dns :: S.Set Dns.Record
	, _namedconf :: Dns.NamedConfMap
	, _dockerinfo :: DockerInfo
	}
	deriving (Eq, Show)

instance Monoid Info where
	mempty = Info mempty mempty mempty mempty mempty mempty mempty
	mappend old new = Info
		{ _os = _os old <> _os new
		, _privDataFields = _privDataFields old <> _privDataFields new
		, _sshPubKey = _sshPubKey old <> _sshPubKey new
		, _aliases = _aliases old <> _aliases new
		, _dns = _dns old <> _dns new
		, _namedconf = _namedconf old <> _namedconf new
		, _dockerinfo = _dockerinfo old <> _dockerinfo new
		}

data Val a = Val a | NoVal
	deriving (Eq, Show)

instance Monoid (Val a) where
	mempty = NoVal
	mappend old new = case new of
		NoVal -> old
		_ -> new

fromVal :: Val a -> Maybe a
fromVal (Val a) = Just a
fromVal NoVal = Nothing

data DockerInfo = DockerInfo
	{ _dockerRunParams :: [HostName -> String]
	}

instance Eq DockerInfo where
	x == y = and
		[ let simpl v = map (\a -> a "") (_dockerRunParams v)
		  in simpl x == simpl y
		]

instance Monoid DockerInfo where
	mempty = DockerInfo mempty
	mappend old new = DockerInfo
		{ _dockerRunParams = _dockerRunParams old <> _dockerRunParams new
		}

instance Show DockerInfo where
	show a = unlines
		[ "docker run params " ++ show (map (\mk -> mk "") (_dockerRunParams a))
		]