8
import charmhelpers.fetch
9
from charmhelpers.core.hookenv import log, config, relation_set
12
def _service_dir(charmconfig):
13
unit = os.environ['JUJU_UNIT_NAME'].split('/')[0]
14
for x in (':', '-', '/', '"', "'"):
15
unit = unit.replace(x, '_')
16
return os.path.join(charmconfig['install_root'], unit)
19
def _install_from_tarball(charmconfig, upgrade):
24
def _install_from_bzr(charmconfig, upgrade):
25
log('grabbing service from bzr...', 'INFO')
26
sdir = _service_dir(charmconfig)
27
rev = charmconfig.get('revno', '')
30
args = ['bzr', 'pull']
32
args.extend(['-r', rev])
33
subprocess.check_call(args, cwd=sdir)
35
if os.path.exists(sdir):
36
log('deleting pre-existing service directory: {}'.format(sdir),
40
args = ['bzr', 'branch']
42
args.extend(['-r', rev])
43
args.append(charmconfig['branch'])
45
subprocess.check_call(args)
48
def _write_system_image_config(charmconfig):
49
sdir = _service_dir(charmconfig)
50
config_file = os.path.join(sdir, 'etc', 'config')
51
from jinja2 import Environment, FileSystemLoader
52
template_env = Environment(loader=FileSystemLoader(os.path.join(
53
os.environ['CHARM_DIR'], 'data')))
57
template = template_env.get_template('config.tmpl').render(svars)
58
log("Writing system-image config to {}".format(config_file), 'INFO')
59
with open(config_file, 'w') as conf:
60
conf.write(str(template))
63
def _create_stable_channel(charmconfig):
64
log('creating stable channel...', 'INFO')
65
libpath = os.path.join(_service_dir(charmconfig), 'lib')
66
if libpath not in sys.path:
67
sys.path.insert(0, libpath)
69
from systemimage import tree, config as si_config
70
conf = si_config.Config()
72
pub.create_channel('stable')
73
pub.create_device('stable', 'mako')
74
for keyring in ("archive-master", "image-master", "image-signing"):
75
pub.publish_keyring(keyring)
78
def _generate_keys(charmconfig):
79
log('generating keys...', 'INFO')
80
#haveged is just an entropy generator
81
subprocess.check_output(['haveged'])
82
srvdir = _service_dir(charmconfig)
83
#the system-image tools unfortunately really want to run from this dir
85
out = subprocess.check_output(['{}/tests/generate-keys'.format(srvdir)])
87
#copy the keys we just generated into the proper location
88
shutil.rmtree('{}/secret/gpg/keys/'.format(srvdir))
89
shutil.copytree('{}/tests/keys'.format(srvdir), '{}/secret/gpg/keys/'.format(srvdir))
90
subprocess.check_output(['{}/bin/generate-keyrings'.format(srvdir)])
94
def install(charmconfig, upgrade=False):
95
pkgs = ['bzr', 'abootimg', 'android-tools-fsutils', 'python-gnupg',
96
'python-gpgme', 'fakeroot', 'pxz', 'pep8', 'pyflakes',
97
'python-mock', 'haveged']
98
log('installing apt packages...', 'INFO')
99
charmhelpers.fetch.configure_sources(update=True)
100
charmhelpers.fetch.apt_install(pkgs)
102
if charmconfig.get('vcs') == 'tarball':
103
_install_from_tarball(charmconfig, upgrade)
105
_install_from_bzr(charmconfig, upgrade)
107
_write_system_image_config(charmconfig)
108
_generate_keys(charmconfig)
109
_create_stable_channel(charmconfig)
112
def website_relation_joined(charmconfig):
113
host = subprocess.check_output(['unit-get', 'private-address']).strip()
114
relation_set(None, {'port': charmconfig["port"], 'hostname': host})
117
def website_relation_changed(charmconfig):
118
return website_relation_joined(charmconfig)
121
def website_relation_broken(charmconfig):
126
hook = os.path.basename(sys.argv[0])
127
log("Running hook: {}".format(hook), 'INFO')
129
hook_py = hook.replace('-', '_')
131
if hook_py not in funcs:
132
print("Unknown hook: {}".format(hook))
135
charmconfig = config()
137
return funcs[hook_py](charmconfig)
138
except subprocess.CalledProcessError as e:
139
log('Error running: {}: {}'.format(e.cmd, e.output), 'INFO')
143
def start(charmconfig):
147
def stop(charmconfig):
151
def upgrade_charm(charmconfig):
152
install(charmconfig, True)
155
if __name__ == '__main__':