Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
339 lines (253 sloc) 8.25 KB
#
# Collective Knowledge (abstracting docker)
#
# See CK LICENSE.txt for licensing details
# See CK COPYRIGHT.txt for copyright details
#
# Developer: Grigori Fursin, Grigori.Fursin@cTuning.org, http://fursin.net
#
cfg={} # Will be updated by CK (meta description of this module)
work={} # Will be updated by CK (temporal data)
ck=None # Will be updated by CK (initialized CK kernel)
# Local settings
##############################################################################
# Initialize module
def init(i):
"""
Input: {}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
return {'return':0}
##############################################################################
# build Docker image
def build(i):
"""
Input: {
data_uoa - CK entry with Docker description
(scenario) - scenario to get CMD (default if empty)
(org) - organization (default - ctuning)
(cmd) - extra CMD
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['func']='build'
return call(i)
##############################################################################
# run Docker image
def run(i):
"""
Input: {
data_uoa - CK entry with Docker description
(scenario) - scenario to get CMD (default if empty)
(cmd) - extra CMD
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['func']='run'
return call(i)
##############################################################################
# run Docker image
def call(i):
"""
Input: {
data_uoa - CK entry with Docker description
func - (build or run)
(scenario) - scenario to get CMD (default if empty)
(org) - organization (default - ctuning)
(sudo) - if 'yes', use sudo
(cmd) - extra CMD
(browser) - if 'yes', start browser
(filename) - file to save/load external Docker image (data_uoa.tar by default)
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
import os
import platform
o=i.get('out','')
func=i['func']
sudo=i.get('sudo','')
duoa=i.get('data_uoa','')
if duoa=='':
return {'return':1, 'error':'please, specify CK entry with Docker description as following "ck build docker:{CK entry}"'}
filename=i.get('filename','')
if filename=='': filename='docker-image-'+duoa+'.tar'
# Load CK entry
r=ck.access({'action':'load',
'module_uoa':work['self_module_uid'],
'data_uoa':duoa})
if r['return']>0: return r
p=r['path']
d=r['dict']
duoa=r['data_uoa']
duid=r['data_uid']
# Check if reuse other entry
re=d.get('reuse_another_entry','')
if re!='':
r=ck.access({'action':'find',
'module_uoa':work['self_module_uid'],
'data_uoa':re})
if r['return']>0: return r
p=r['path']
# Choose scenario
s=i.get('scenario','')
if s=='': s='default'
# Choose organization
org=i.get('org','')
if org=='':
org=ck.cfg.get('docker_org','')
if org=='':
org='ctuning'
ecmd=i.get('cmd','')
# Find scenario in meta
cc=d.get('cmd',{}).get(s,{})
c=cc.get(func,'')
if c=='':
return {'return':1, 'error':'CMD to '+func+' Docker image is not defined in the CK entry ('+duoa+')'}
# Check if Windows
pl=platform.system().lower()
ps=d.get('platform_specific',{}).get(pl,{})
for k in ps:
v=ps[k]
if v.startswith('$(') and v.endswith(')'):
# Run and get var
r=ck.gen_tmp_file({'prefix':'tmp-', 'suffix':'.tmp'})
if r['return']>0: return r
ftmp=r['file_name']
os.system(v[2:-1]+' > '+ftmp)
# Read file
r=ck.load_text_file({'text_file':ftmp,
'delete_after_read':'yes'})
if r['return']>0: return r
v=r['string'].strip()
i[k]=v
cmd=cc.get(func+'_extra_cmd','')
if ecmd!='':
cmd=ecmd
# Update CMD
c=c.replace('$#CK_DOCKER_ORGANIZATION#$',org)
c=c.replace('$#CK_DOCKER_NAME#$',duoa)
c=c.replace('$#CK_PATH#$',p)
c=c.replace('$#CK_DOCKER_FILE#$',filename)
if cmd!='':
c=cmd+' '+c
c='docker '+func+' '+c
# Update vars from input
citv=d.get('convert_input_to_vars',{})
for k in citv:
x=citv[k]
ki=x.get('key','')
kd=x.get('default','')
vv=i.get(k,'')
if vv=='':
vv=kd
i[k]=vv
c=c.replace('$#'+ki+'#$',vv)
if sudo=='yes':
c='sudo '+c
# Check if has browser
if i.get('browser','')=='yes':
url=d.get('browser',{}).get('url','')
# Update vars:
for k in citv:
x=citv[k]
ki=x.get('key','')
vv=i.get(k,'')
url=url.replace('$#'+ki+'#$',vv)
import webbrowser
webbrowser.open(url)
if o=='con':
ck.out('Executing command line:')
ck.out(' '+c)
ck.out('')
# Run Docker
r=os.system(c)
return {'return':0}
##############################################################################
# login to Docker Hub
def login(i):
"""
Input: {
(sudo) - if 'yes', add sudo
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
import os
s='docker login'
if i.get('sudo','')=='yes':
s='sudo '+s
os.system(s)
return {'return':0}
##############################################################################
# push a given image to the Docker Hub
def push(i):
"""
Input: {
data_uoa - CK entry with Docker description
(scenario) - scenario to get CMD (default if empty)
(org) - organization (default - ctuning)
(cmd) - extra CMD
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['func']='push'
return call(i)
##############################################################################
# save Docker image (for example to share via external repositories and digital libraries)
def save(i):
"""
Input: {
data_uoa - CK entry with Docker description
(scenario) - scenario to get CMD (default if empty)
(cmd) - extra CMD
(filename) - file to save image (data_uoa.tar by default)
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['func']='save'
return call(i)
##############################################################################
# import external Docker image (tar file)
def ximport(i):
"""
Input: {
data_uoa - CK entry with Docker description
(scenario) - scenario to get CMD (default if empty)
(cmd) - extra CMD
(filename) - file to load image (data_uoa.tar by default)
}
Output: {
return - return code = 0, if successful
> 0, if error
(error) - error text if return > 0
}
"""
i['func']='import'
return call(i)