summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess2014-10-24 09:58:12 -0400
committerJoey Hess2014-10-24 09:58:12 -0400
commit3959d5be901121cc697316837b96b6bdc37248d2 (patch)
tree93bbef55ad3d247f2e64d5cb7ceb1f3679514935
parent2bd599470a875b10159535ecb44b3a3aac59da85 (diff)
parentb5ab8a7f9fedc283cd561b8a414748ecee3868fd (diff)
Merge branch 'joeyconfig'
-rw-r--r--config-joey.hs1
-rw-r--r--debian/changelog9
-rw-r--r--doc/todo/docker_todo_list.mdwn2
-rw-r--r--propellor.cabal2
-rw-r--r--src/Propellor/Info.hs5
-rw-r--r--src/Propellor/Property.hs10
-rw-r--r--src/Propellor/Property/Docker.hs39
-rw-r--r--src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs15
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs2
9 files changed, 66 insertions, 19 deletions
diff --git a/config-joey.hs b/config-joey.hs
index 3bf01114..fb90651e 100644
--- a/config-joey.hs
+++ b/config-joey.hs
@@ -53,7 +53,6 @@ darkstar = host "darkstar.kitenet.net"
& Apt.buildDep ["git-annex"] `period` Daily
& Docker.configured
! Docker.docked hosts "android-git-annex"
- ! Docker.docked hosts "webserver"
clam :: Host
clam = standardSystem "clam.kitenet.net" Unstable "amd64"
diff --git a/debian/changelog b/debian/changelog
index 012826bd..c580b3ba 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+propellor (0.9.1) unstable; urgency=medium
+
+ * Docker: Add ability to control when containers restart.
+ * Docker: Default to always restarting containers, so they come back
+ up after reboots and docker daemon upgrades.
+ * Fix loop when a docker host that does not exist was docked.
+
+ -- Joey Hess <joeyh@debian.org> Fri, 24 Oct 2014 09:57:31 -0400
+
propellor (0.9.0) unstable; urgency=medium
* Avoid encoding the current stable suite in propellor's code,
diff --git a/doc/todo/docker_todo_list.mdwn b/doc/todo/docker_todo_list.mdwn
index 1321445d..72ded426 100644
--- a/doc/todo/docker_todo_list.mdwn
+++ b/doc/todo/docker_todo_list.mdwn
@@ -1,3 +1,5 @@
* 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.
+* The SimpleSh was added before `docker exec` existed, and could probably
+ be eliminated by using that.
diff --git a/propellor.cabal b/propellor.cabal
index 5843894e..282a5e04 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 0.9.0
+Version: 0.9.1
Cabal-Version: >= 1.6
License: BSD3
Maintainer: Joey Hess <joey@kitenet.net>
diff --git a/src/Propellor/Info.hs b/src/Propellor/Info.hs
index 1b89c008..f44d1de3 100644
--- a/src/Propellor/Info.hs
+++ b/src/Propellor/Info.hs
@@ -80,7 +80,10 @@ aliasMap = M.fromList . concat .
map (\h -> map (\aka -> (aka, h)) $ S.toList $ _aliases $ hostInfo h)
findHost :: [Host] -> HostName -> Maybe Host
-findHost l hn = maybe (findAlias l hn) Just (M.lookup hn (hostMap l))
+findHost l hn = maybe (findAlias l hn) Just (findHostNoAlias l hn)
+
+findHostNoAlias :: [Host] -> HostName -> Maybe Host
+findHostNoAlias l hn = M.lookup hn (hostMap l)
findAlias :: [Host] -> HostName -> Maybe Host
findAlias l hn = M.lookup hn (aliasMap l)
diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs
index ce825192..4b957317 100644
--- a/src/Propellor/Property.hs
+++ b/src/Propellor/Property.hs
@@ -135,7 +135,7 @@ host hn = Host hn [] mempty
--
-- Can add Properties and RevertableProperties
(&) :: IsProp p => Host -> p -> Host
-(Host hn ps as) & p = Host hn (ps ++ [toProp p]) (as <> getInfo p)
+(Host hn ps is) & p = Host hn (ps ++ [toProp p]) (is <> getInfo p)
infixl 1 &
@@ -145,6 +145,14 @@ h ! p = h & revert p
infixl 1 !
+-- | Like (&), but adds the property as the first property of the host.
+-- Normally, property order should not matter, but this is useful
+-- when it does.
+(&^) :: IsProp p => Host -> p -> Host
+(Host hn ps is) &^ p = Host hn ([toProp p] ++ ps) (getInfo p <> is)
+
+infixl 1 &^
+
-- Changes the action that is performed to satisfy a property.
adjustProperty :: Property -> (Propellor Result -> Propellor Result) -> Property
adjustProperty p f = p { propertySatisfy = f (propertySatisfy p) }
diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index 8c2f3701..d9d5f191 100644
--- a/src/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -19,7 +19,6 @@ module Propellor.Property.Docker (
-- * Container configuration
dns,
hostname,
- name,
publish,
expose,
user,
@@ -30,6 +29,9 @@ module Propellor.Property.Docker (
cpuShares,
link,
ContainerAlias,
+ restartAlways,
+ restartOnFailure,
+ restartNever,
-- * Internal use
chain,
) where
@@ -106,7 +108,7 @@ docked hosts cn = RevertableProperty
let cid = ContainerId hn cn
ensureProperties [findContainer mhost cid cn $ a cid]
- mhost = findHost hosts (cn2hn cn)
+ mhost = findHostNoAlias hosts (cn2hn cn)
setup cid (Container image runparams) =
provisionContainer cid
@@ -150,14 +152,18 @@ findContainer mhost cid cn mk = case mhost of
mkContainer :: ContainerId -> Host -> Maybe Container
mkContainer cid@(ContainerId hn _cn) h = Container
<$> fromVal (_dockerImage info)
- <*> pure (map (\a -> a hn) (_dockerRunParams info))
+ <*> pure (map (\mkparam -> mkparam hn) (_dockerRunParams info))
where
info = _dockerinfo $ hostInfo h'
h' = h
- -- expose propellor directory inside the container
+ -- Restart by default so container comes up on
+ -- boot or when docker is upgraded.
+ &^ restartAlways
+ -- Expose propellor directory inside the container.
& volume (localdir++":"++localdir)
- -- name the container in a predictable way so we
- -- and the user can easily find it later
+ -- Name the container in a predictable way so we
+ -- and the user can easily find it later. This property
+ -- comes last, so it cannot be overridden.
& name (fromContainerId cid)
-- | Causes *any* docker images that are not in use by running containers to
@@ -217,7 +223,7 @@ dns = runProp "dns"
hostname :: String -> Property
hostname = runProp "hostname"
--- | Set name for container. (Normally done automatically.)
+-- | Set name of container.
name :: String -> Property
name = runProp "name"
@@ -274,6 +280,25 @@ link linkwith calias = genProp "link" $ \hn ->
-- Each container has its own alias namespace.
type ContainerAlias = String
+-- | This property is enabled by default for docker containers configured by
+-- propellor; as well as keeping badly behaved containers running,
+-- it ensures that containers get started back up after reboot or
+-- after docker is upgraded.
+restartAlways :: Property
+restartAlways = runProp "restart" "always"
+
+-- | Docker will restart the container if it exits nonzero.
+-- If a number is provided, it will be restarted only up to that many
+-- times.
+restartOnFailure :: Maybe Int -> Property
+restartOnFailure Nothing = runProp "restart" "on-failure"
+restartOnFailure (Just n) = runProp "restart" ("on-failure:" ++ show n)
+
+-- | Makes docker not restart a container when it exits
+-- Note that this includes not restarting it on boot!
+restartNever :: Property
+restartNever = runProp "restart" "no"
+
-- | A container is identified by its name, and the host
-- on which it's deployed.
data ContainerId = ContainerId HostName ContainerName
diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
index 056578a1..901eba2e 100644
--- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
+++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
@@ -65,6 +65,7 @@ tree buildarch = combineProperties "gitannexbuilder tree"
buildDepsApt :: Property
buildDepsApt = combineProperties "gitannexbuilder build deps"
[ Apt.buildDep ["git-annex"]
+ , Apt.installed ["liblockfile-simple-perl"]
, buildDepsNoHaskellLibs
, "git-annex source build deps installed" ==> Apt.buildDepIn builddir
]
@@ -113,17 +114,14 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe
& os osver
& Apt.stdSourcesList
& Apt.installed ["systemd"]
+ & Docker.tweaked
& User.accountFor builduser
& File.dirExists gitbuilderdir
& File.ownerGroup homedir builduser builduser
- & buildDepsNoHaskellLibs
+ & buildDepsApt
& flagFile chrootsetup ("/chrootsetup")
`requires` setupgitannexdir
- & Docker.tweaked
- -- TODO: automate installing haskell libs
- -- (Currently have to run
- -- git-annex/standalone/android/install-haskell-packages
- -- which is not fully automated.)
+ & flagFile haskellpkgsinstalled ("/haskellpkgsinstalled")
where
-- Use git-annex's android chroot setup script, which will install
-- ghc-android and the NDK, all build deps, etc, in the home
@@ -131,7 +129,10 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe
chrootsetup = scriptProperty
[ "cd " ++ gitannexdir ++ " && ./standalone/android/buildchroot-inchroot"
]
- osver = System (Debian (Stable "wheezy")) "i386"
+ haskellpkgsinstalled = userScriptProperty "builder"
+ [ "cd " ++ gitannexdir ++ " && ./standalone/android/install-haskell-packages"
+ ]
+ osver = System (Debian Testing) "i386" -- once jessie is released, use: (Stable "jessie")
-- armel builder has a companion container using amd64 that
-- runs the build first to get TH splices. They need
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index 77af65fa..bd9e01e2 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -72,7 +72,7 @@ oldUseNetServer hosts = propertyList ("olduse.net server")
oldUseNetShellBox :: Property
oldUseNetShellBox = propertyList "olduse.net shellbox"
[ oldUseNetInstalled "oldusenet"
- , Service.running "oldusenet"
+ , Service.running "shellinabox"
]
oldUseNetInstalled :: Apt.Package -> Property