summaryrefslogtreecommitdiff
path: root/src/Propellor/Types/Attr.hs
blob: 4c891a463d056012776fee0775b7b81c9585a639 (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
module Propellor.Types.Attr where

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

import qualified Data.Set as S
import Data.Monoid

-- | The attributes of a host.
data Attr = Attr
	{ _os :: Maybe System
	, _sshPubKey :: Maybe String
	, _dns :: S.Set Dns.Record
	, _namedconf :: Dns.NamedConfMap

	, _dockerImage :: Maybe String
	, _dockerRunParams :: [HostName -> String]
	}

instance Eq Attr where
	x == y = and
		[ _os x == _os y
		, _dns x == _dns y
		, _namedconf x == _namedconf y
		, _sshPubKey x == _sshPubKey y

		, _dockerImage x == _dockerImage y
		, let simpl v = map (\a -> a "") (_dockerRunParams v)
		  in simpl x == simpl y
		]

instance Monoid Attr where
	mempty = Attr Nothing Nothing mempty mempty Nothing mempty
	mappend old new = Attr
		{ _os = case _os new of
			Just v -> Just v
			Nothing -> _os old
		, _sshPubKey = case _sshPubKey new of
			Just v -> Just v
			Nothing -> _sshPubKey old
		, _dns = _dns new <> _dns old
		, _namedconf = _namedconf new <> _namedconf old
		, _dockerImage = case _dockerImage new of
			Just v -> Just v
			Nothing -> _dockerImage old
		, _dockerRunParams = _dockerRunParams old <> _dockerRunParams new
		}

instance Show Attr where
	show a = unlines
		[ "OS " ++ show (_os a)
		, "sshPubKey " ++ show (_sshPubKey a)
		, "dns " ++ show (_dns a)
		, "namedconf " ++ show (_namedconf a)
		, "docker image " ++ show (_dockerImage a)
		, "docker run params " ++ show (map (\mk -> mk "") (_dockerRunParams a))
		]