summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess2014-05-31 16:48:14 -0400
committerJoey Hess2014-05-31 16:48:14 -0400
commit6383d8c38893c160382eb9bf69e0315c5e87269e (patch)
tree63b3cf0c907df738fb227dc88d1dea5ea08a3c61
parent1a83bf26300a225f044205e2208783e664377e25 (diff)
propellor spin
-rw-r--r--config-joey.hs2
-rw-r--r--debian/changelog9
-rw-r--r--doc/todo/docker_todo_list.mdwn2
-rw-r--r--propellor.cabal2
-rw-r--r--src/Propellor/Attr.hs26
-rw-r--r--src/Propellor/Property/Docker.hs24
6 files changed, 48 insertions, 17 deletions
diff --git a/config-joey.hs b/config-joey.hs
index 7a99b9b1..b667f790 100644
--- a/config-joey.hs
+++ b/config-joey.hs
@@ -53,7 +53,6 @@ hosts = -- (o) `
& Postfix.satellite
& Docker.configured
- & alias "shell.olduse.net"
& Docker.docked hosts "oldusenet-shellbox"
& alias "openid.kitenet.net"
@@ -198,6 +197,7 @@ hosts = -- (o) `
, standardContainer "oldusenet-shellbox" Stable "amd64"
& Docker.publish "4200:4200"
+ & alias "shell.olduse.net"
& JoeySites.oldUseNetShellBox
-- git-annex autobuilder containers
diff --git a/debian/changelog b/debian/changelog
index 916b9b3b..98cbee18 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+propellor (0.6.0) UNRELEASED; urgency=medium
+
+ * Docker containers now propigate DNS attributes out to the host they're
+ docked in. So if a docker container sets a DNS alias, every container
+ it's docked in will automatically become part of a round-robin DNS,
+ if propellor is used to manage DNS for the domain.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 31 May 2014 16:41:56 -0400
+
propellor (0.5.3) unstable; urgency=medium
* Fix unattended-upgrades config for !stable.
diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn
index 65762cff..2bf095f1 100644
--- a/doc/todo/docker_todo_list.mdwn
+++ b/doc/todo/docker_todo_list.mdwn
@@ -4,5 +4,3 @@
* There is no way for a property of a docker container to require
some property be met outside the container. For example, some servers
need ntp installed for a good date source.
-* Docking a container in a host should add to the host any cnames that
- are assigned to the container.
diff --git a/propellor.cabal b/propellor.cabal
index 80c353bc..1ca9f3a5 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 0.5.3
+Version: 0.6.0
Cabal-Version: >= 1.6
License: BSD3
Maintainer: Joey Hess <joey@kitenet.net>
diff --git a/src/Propellor/Attr.hs b/src/Propellor/Attr.hs
index 98cfc64d..e2b64bf0 100644
--- a/src/Propellor/Attr.hs
+++ b/src/Propellor/Attr.hs
@@ -33,21 +33,31 @@ getOS = asks _os
-- TODO check at run time if the host really has this address.
-- (Can't change the host's address, but as a sanity check.)
ipv4 :: String -> Property
-ipv4 addr = pureAttrProperty ("ipv4 " ++ addr)
- (addDNS $ Address $ IPv4 addr)
+ipv4 = addDNS . Address . IPv4
-- | Indidate that a host has an AAAA record in the DNS.
ipv6 :: String -> Property
-ipv6 addr = pureAttrProperty ("ipv6 " ++ addr)
- (addDNS $ Address $ IPv6 addr)
+ipv6 = addDNS . Address . IPv6
-- | Indicates another name for the host in the DNS.
alias :: Domain -> Property
-alias domain = pureAttrProperty ("alias " ++ domain)
- (addDNS $ CNAME $ AbsDomain domain)
+alias = addDNS . CNAME . AbsDomain
-addDNS :: Record -> SetAttr
-addDNS record d = d { _dns = S.insert record (_dns d) }
+addDNS :: Record -> Property
+addDNS r = pureAttrProperty (rdesc r) $
+ \d -> d { _dns = S.insert r (_dns d) }
+ where
+ rdesc (CNAME d) = unwords ["alias", ddesc d]
+ rdesc (Address (IPv4 addr)) = unwords ["ipv4", addr]
+ rdesc (Address (IPv6 addr)) = unwords ["ipv6", addr]
+ rdesc (MX n d) = unwords ["MX", show n, ddesc d]
+ rdesc (NS d) = unwords ["NS", ddesc d]
+ rdesc (TXT s) = unwords ["TXT", s]
+ rdesc (SRV x y z d) = unwords ["SRV", show x, show y, show z, ddesc d]
+
+ ddesc (AbsDomain domain) = domain
+ ddesc (RelDomain domain) = domain
+ ddesc RootDomain = "@"
-- | Adds a DNS NamedConf stanza.
--
diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index 68fbced5..465fe0b4 100644
--- a/src/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -21,6 +21,7 @@ import System.Posix.Directory
import System.Posix.Process
import Data.List
import Data.List.Utils
+import qualified Data.Set as S
-- | Configures docker with an authentication file, so that images can be
-- pushed to index.docker.io.
@@ -54,7 +55,10 @@ cn2hn cn = cn ++ ".docker"
-- | Ensures that a docker container is set up and running. The container
-- has its own Properties which are handled by running propellor
--- inside the container.
+-- inside the container.
+--
+-- Additionally, the container can have DNS attributes, such as a CNAME.
+-- These become attributes of the host(s) it's docked in.
--
-- Reverting this property ensures that the container is stopped and
-- removed.
@@ -62,12 +66,16 @@ docked
:: [Host]
-> ContainerName
-> RevertableProperty
-docked hosts cn = RevertableProperty (go "docked" setup) (go "undocked" teardown)
+docked hosts cn = RevertableProperty
+ (go "docked" setup)
+ (go "undocked" teardown)
where
go desc a = property (desc ++ " " ++ cn) $ do
hn <- getHostName
let cid = ContainerId hn cn
- ensureProperties [findContainer hosts cid cn $ a cid]
+ ensureProperties [findContainer mhost cid cn $ a cid]
+
+ mhost = findHost hosts (cn2hn cn)
setup cid (Container image runparams) =
provisionContainer cid
@@ -86,13 +94,19 @@ docked hosts cn = RevertableProperty (go "docked" setup) (go "undocked" teardown
]
]
+exposeDnsAttrs :: Host -> Property -> Property
+exposeDnsAttrs (Host _ containerattr) p = combineProperties (propertyDesc p) $
+ p : map addDNS (S.toList containerdns)
+ where
+ containerdns = _dns $ containerattr $ newAttr undefined
+
findContainer
- :: [Host]
+ :: Maybe Host
-> ContainerId
-> ContainerName
-> (Container -> Property)
-> Property
-findContainer hosts cid cn mk = case findHost hosts (cn2hn cn) of
+findContainer mhost cid cn mk = case mhost of
Nothing -> cantfind
Just h -> maybe cantfind mk (mkContainer cid h)
where