124 lines
3.0 KiB
Python
124 lines
3.0 KiB
Python
import os
|
|
import requests
|
|
|
|
from subprocess import check_call, check_output
|
|
|
|
from charmhelpers.core import host
|
|
|
|
from charms.reactive import (
|
|
when,
|
|
when_not,
|
|
set_state,
|
|
remove_state,
|
|
endpoint_from_flag,
|
|
hook,
|
|
)
|
|
|
|
from charmhelpers.fetch import (
|
|
apt_install,
|
|
apt_update,
|
|
apt_purge,
|
|
apt_autoremove,
|
|
import_key,
|
|
)
|
|
|
|
from charmhelpers.core.hookenv import resource_get
|
|
|
|
from charms.layer import status
|
|
|
|
|
|
KATA_PACKAGES = ["kata-runtime", "kata-proxy", "kata-shim"]
|
|
|
|
|
|
@when_not("kata.installed")
|
|
@when_not("endpoint.untrusted.departed")
|
|
def install_kata():
|
|
"""
|
|
Install the Kata container runtime.
|
|
|
|
:returns: None
|
|
"""
|
|
dist = host.lsb_release()
|
|
release = "{}_{}".format(dist["DISTRIB_ID"], dist["DISTRIB_RELEASE"])
|
|
|
|
arch = check_output(["arch"]).decode().strip()
|
|
|
|
archive = resource_get("kata-archive")
|
|
|
|
if not archive or os.path.getsize(archive) == 0:
|
|
status.maintenance("Installing Kata via apt")
|
|
gpg_key = requests.get(
|
|
"http://download.opensuse.org/repositories/home:/katacontainers:/"
|
|
# wokeignore:rule=master
|
|
"releases:/{}:/master/x{}/Release.key".format(arch, release)
|
|
).text
|
|
import_key(gpg_key)
|
|
|
|
with open("/etc/apt/sources.list.d/kata-containers.list", "w") as f:
|
|
f.write(
|
|
"deb http://download.opensuse.org/repositories/home:/"
|
|
# wokeignore:rule=master
|
|
"katacontainers:/releases:/{}:/master/x{}/ /".format(arch, release)
|
|
)
|
|
|
|
apt_update()
|
|
apt_install(KATA_PACKAGES)
|
|
|
|
else:
|
|
status.maintenance("Installing Kata via resource")
|
|
unpack = "/tmp/kata-debs"
|
|
|
|
if not os.path.isdir(unpack):
|
|
os.makedirs(unpack, exist_ok=True)
|
|
|
|
check_call(["tar", "-xvf", archive, "-C", unpack])
|
|
check_call("apt-get install -y {}/*.deb".format(unpack), shell=True)
|
|
|
|
status.active("Kata runtime available")
|
|
set_state("kata.installed")
|
|
|
|
|
|
@when("endpoint.untrusted.departed")
|
|
def purge_kata():
|
|
"""
|
|
Purge Kata containers.
|
|
|
|
:return: None
|
|
"""
|
|
status.maintenance("Purging Kata")
|
|
|
|
apt_purge(KATA_PACKAGES, fatal=False)
|
|
|
|
source = "/etc/apt/sources.list.d/kata-containers.list"
|
|
if os.path.isfile(source):
|
|
os.remove(source)
|
|
|
|
apt_autoremove()
|
|
|
|
remove_state("kata.installed")
|
|
|
|
|
|
@when("kata.installed")
|
|
@when("endpoint.untrusted.joined")
|
|
@when_not("endpoint.untrusted.departed")
|
|
def publish_config():
|
|
"""
|
|
Pass configuration over the interface.
|
|
|
|
:return: None
|
|
"""
|
|
endpoint = endpoint_from_flag("endpoint.untrusted.joined")
|
|
endpoint.set_config(name="kata", binary_path="/usr/bin/kata-runtime")
|
|
|
|
|
|
@hook("pre-series-upgrade")
|
|
def pre_series_upgrade():
|
|
"""Set status during series upgrade."""
|
|
status.blocked("Series upgrade in progress")
|
|
|
|
|
|
@hook("post-series-upgrade")
|
|
def post_series_upgrade():
|
|
"""Reset status to active after series upgrade."""
|
|
status.active("Kata runtime available")
|