Skip to content

Commit

Permalink
Add a disk.docker resource driver
Browse files Browse the repository at this point in the history
Create a docker volume, to be used by other containers to store or
share data.

Example:

[disk#0]
type = docker
;driver = local
;options = --opt o=size=100m,uid=1000 --opt type=tmpfs --opt device=tmpfs
  • Loading branch information
cvaroqui committed Mar 2, 2018
1 parent b9ef3d5 commit d7dedb2
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 2 deletions.
21 changes: 21 additions & 0 deletions lib/rcDocker.py
Expand Up @@ -538,6 +538,27 @@ def docker_inspect(self, container_id):
data = json.loads(out)
return data[0]

def docker_volume_inspect(self, vol_id):
"""
Return the "docker volume inspect" data dict.
"""
try:
self.docker_exe
except ex.excInitError:
return {}
if vol_id is None:
raise IndexError("vol id is None")
elif isinstance(vol_id, list):
cmd = self.docker_cmd + ["volume", "inspect"] + vol_id
out = justcall(cmd)[0]
data = json.loads(out)
return data
else:
cmd = self.docker_cmd + ["volume", "inspect", vol_id]
out = justcall(cmd)[0]
data = json.loads(out)
return data[0]

def docker_service_inspect(self, service_id):
"""
Return the "docker service inspect" data dict.
Expand Down
67 changes: 67 additions & 0 deletions lib/resDiskDocker.py
@@ -0,0 +1,67 @@
import os
import rcExceptions as ex
import resDisk
from rcGlobalEnv import rcEnv
from rcUtilities import lazy

class Disk(resDisk.Disk):
def __init__(self,
rid=None,
driver=None,
options=None,
**kwargs):
resDisk.Disk.__init__(self,
rid=rid,
name="",
type='disk.docker',
**kwargs)
self.driver = driver
self.options = options

@lazy
def label(self):
return "%s volume %s" % (self.driver, self.volname)

def _info(self):
data = [
["name", self.volname],
["driver", self.driver],
["options", self.options],
]
return data

def has_it(self):
try:
data = self.svc.dockerlib.docker_volume_inspect(self.volname)
return True
except (ValueError, IndexError):
return False

def is_up(self):
"""
Returns True if the logical volume is present and activated
"""
return self.has_it()

@lazy
def volname(self):
return ".".join([self.svc.svcname, self.rid.replace("#", ".")])

def create_vol(self):
cmd = self.svc.dockerlib.docker_cmd + ["volume", "create", "--name", self.volname]
if self.options:
cmd += options
ret, out, err = self.vcall(cmd)
if ret != 0:
raise ex.excError

def do_start(self):
if self.has_it():
self.log.info("%s is already created" % self.label)
return 0
self.create_vol()
self.can_rollback = True

def do_stop(self):
pass

2 changes: 1 addition & 1 deletion lib/svc.py
Expand Up @@ -289,13 +289,13 @@ def signal_handler(*args):
"disk.lock",
"disk.loop",
"disk.md",
"disk.docker",
"disk.lv",
"disk.raw",
"disk.rados",
"disk.scsireserv",
"disk.vg",
"disk.veritas",
"disk.lv",
"disk.zpool",
"fs",
"fs.dir",
Expand Down
20 changes: 20 additions & 0 deletions lib/svcBuilder.py
Expand Up @@ -345,6 +345,20 @@ def add_ip(svc, s):
r = ip.Ip(**kwargs)
svc += r

def add_docker_vol(svc, s):
kwargs = init_kwargs(svc, s)
try:
kwargs['driver'] = svc.conf_get(s, 'driver')
except ex.OptNotFound as exc:
kwargs['driver'] = exc.default
try:
kwargs['options'] = svc.conf_get(s, 'options')
except ex.OptNotFound as exc:
kwargs['options'] = exc.default
m = __import__('resDiskDocker')
r = m.Disk(**kwargs)
svc += r

def add_lv(svc, s):
kwargs = init_kwargs(svc, s)
kwargs['name'] = svc.conf_get(s, 'name')
Expand Down Expand Up @@ -585,6 +599,9 @@ def add_disk_compat(svc, s):
if disk_type == 'Lv':
add_lv(svc, s)
return
if disk_type == 'Docker':
add_docker_vol(svc, s)
return
if disk_type == 'Gce':
add_disk_gce(svc, s)
return
Expand Down Expand Up @@ -691,6 +708,9 @@ def add_disk(svc, s):
if disk_type == 'Lv':
add_lv(svc, s)
return
if disk_type == 'Docker':
add_docker_vol(svc, s)
return
if disk_type == 'Md':
add_md(svc, s)
return
Expand Down
32 changes: 31 additions & 1 deletion lib/svcdict.py
Expand Up @@ -2320,10 +2320,38 @@ def __init__(self):
at=True,
order=9,
default="vg",
candidates=["disk", "veritas", "raw", "rados", "md", "drbd", "loop", "zpool", "pool", "raw", "vmdg", "vdisk", "lvm", "vg", "lv", "amazon", "gce"],
candidates=["disk", "veritas", "raw", "rados", "md", "drbd", "loop", "zpool", "pool", "raw", "vmdg", "vdisk", "lvm", "vg", "lv", "amazon", "gce", "docker"],
text="The volume group driver to use. Leave empty to activate the native volume group manager."
)

class KeywordDiskDockerDriver(Keyword):
def __init__(self):
Keyword.__init__(
self,
section="disk",
rtype="docker",
keyword="driver",
default="local",
order=10,
at=True,
text="The docker volume driver to use for the resource.",
example="tmpfs"
)

class KeywordDiskDockerOptions(Keyword):
def __init__(self):
Keyword.__init__(
self,
section="disk",
rtype="docker",
keyword="options",
order=10,
at=True,
convert="shlex",
text="The docker volume create options to use for the resource. --label and --opt",
example="--opt o=size=100m,uid=1000 --opt type=tmpfs --opt device=tmpfs"
)

class KeywordDiskLvName(Keyword):
def __init__(self):
Keyword.__init__(
Expand Down Expand Up @@ -4599,6 +4627,8 @@ def kw_pg_blkio_weight(resource):
self += KeywordDiskMdChunk()
self += KeywordDiskMdLayout()
self += KeywordDiskMdSpares()
self += KeywordDiskDockerDriver()
self += KeywordDiskDockerOptions()
self += KeywordDiskLvName()
self += KeywordDiskLvVg()
self += KeywordDiskLvSize()
Expand Down

0 comments on commit d7dedb2

Please sign in to comment.