Skip to content

Commit

Permalink
Add new ostreecontainer command (#2125655)
Browse files Browse the repository at this point in the history
It is another way to set source for ostree.

The difference:
ostreesetup - work for OSTree repositories
ostreecontainer - work for native container images

See https://fedoraproject.org/wiki/Changes/OstreeNativeContainer for
more details.

Changes:
The ostree tool renamed `osname` to `stateroot` so when we creating a
new command let's make the name correct.

The default value is recommended on BZ and here
ostreedev/ostree#2794

Related: rhbz#2125655

Rename osname to stateroot and set default value (#2125655)

The ostree tool renamed `osname` to `stateroot` so when we creating a
new command let's make the name correct.

The default value is recommended on BZ and here
ostreedev/ostree#2794

Related: rhbz#2125655
  • Loading branch information
jkonecny12 committed Mar 14, 2023
1 parent cfcc525 commit 4357283
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 1 deletion.
1 change: 1 addition & 0 deletions pykickstart/commands/__init__.py
Expand Up @@ -62,6 +62,7 @@
nfs,
nvdimm,
timesource,
ostreecontainer,
ostreesetup,
partition,
raid,
Expand Down
94 changes: 94 additions & 0 deletions pykickstart/commands/ostreecontainer.py
@@ -0,0 +1,94 @@
#
# Copyright (C) 2023 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
from pykickstart.version import F38
from pykickstart.base import KickstartCommand
from pykickstart.options import KSOptionParser

class F38_OSTreeContainer(KickstartCommand):
removedKeywords = KickstartCommand.removedKeywords
removedAttrs = KickstartCommand.removedAttrs

def __init__(self, *args, **kwargs):
KickstartCommand.__init__(self, *args, **kwargs)
self.op = self._getParser()
self.stateroot = kwargs.get('stateroot', None)
self.url = kwargs.get('url', None)
self.transport = kwargs.get("transport", None)
self.remote = kwargs.get("remote", self.stateroot)
self.noSignatureVerification = kwargs.get('noSignatureVerification', False)

def __str__(self):
retval = KickstartCommand.__str__(self)

if not self.seen:
return retval

retval += "# OSTree container setup\n"
retval += "ostreecontainer %s\n" % self._getArgsAsStr()

return retval

def _getArgsAsStr(self):
retcmd = []
if self.stateroot:
retcmd.append('--stateroot="%s"' % self.stateroot)
if self.remote:
retcmd.append('--remote="%s"' % self.remote)
if self.noSignatureVerification:
retcmd.append('--no-signature-verification')
if self.transport:
retcmd.append('--transport="%s"' % self.transport)
if self.url:
retcmd.append('--url="%s"' % self.url)
return ' '.join(retcmd)

def _getParser(self):
op = KSOptionParser(prog="ostreecontainer", description="""
Used for OSTree installations from native container. See
https://coreos.github.io/rpm-ostree/container/
for more information about OSTree.
**Experimental. Use on your own risk.**
""", version=F38)
# Remane the osname to stateroot and set default as proposed by
# https://github.com/ostreedev/ostree/issues/2794
op.add_argument("--stateroot", version=F38, help="""
Name for the state directory, also known as "osname".
Default value will be `default`.""")
op.add_argument("--url", required=True, version=F38, help="""
Name of the container image; for the `registry` transport.
This would be e.g. `quay.io/exampleos/foo:latest`.""")
op.add_argument("--transport", version=F38, help="""
The transport; e.g. registry, oci, oci-archive.
The default is `registry`.""")
op.add_argument("--remote", version=F38, help="""
Name of the OSTree remote.""")
op.add_argument("--no-signature-verification",
dest="noSignatureVerification",
action="store_true",
version=F38,
help="""Disable verification via an ostree remote.""")
return op

def parse(self, args):
ns = self.op.parse_args(args=args, lineno=self.lineno)
self.set_to_self(ns)
if not self.remote:
self.remote = self.stateroot

return self
1 change: 1 addition & 0 deletions pykickstart/handlers/f38.py
Expand Up @@ -66,6 +66,7 @@ class F38Handler(BaseHandler):
"nfs": commands.nfs.FC6_NFS,
"nvdimm": commands.nvdimm.F28_Nvdimm,
"timesource": commands.timesource.F33_Timesource,
"ostreecontainer": commands.ostreecontainer.F38_OSTreeContainer,
"ostreesetup": commands.ostreesetup.F21_OSTreeSetup,
"part": commands.partition.F34_Partition,
"partition": commands.partition.F34_Partition,
Expand Down
3 changes: 2 additions & 1 deletion pykickstart/handlers/f39.py
Expand Up @@ -66,7 +66,8 @@ class F39Handler(BaseHandler):
"nfs": commands.nfs.FC6_NFS,
"nvdimm": commands.nvdimm.F28_Nvdimm,
"timesource": commands.timesource.F33_Timesource,
"ostreesetup": commands.ostreesetup.F21_OSTreeSetup,
"ostreecontainer": commands.ostreecontainer.F38_OSTreeContainer,
"ostreesetup": commands.ostreesetup.F38_OSTreeSetup,
"part": commands.partition.F34_Partition,
"partition": commands.partition.F34_Partition,
"poweroff": commands.reboot.F23_Reboot,
Expand Down
61 changes: 61 additions & 0 deletions tests/commands/ostreecontainer.py
@@ -0,0 +1,61 @@
#
# Colin Walters <walters@redhat.com>
#
# Copyright 2023 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use, modify,
# copy, or redistribute it subject to the terms and conditions of the GNU
# General Public License v.2. This program is distributed in the hope that it
# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Any Red Hat
# trademarks that are incorporated in the source code or documentation are not
# subject to the GNU General Public License and may only be used or replicated
# with the express permission of Red Hat, Inc.
#

import unittest
from tests.baseclass import CommandTest
from pykickstart.commands.ostreecontainer import F38_OSTreeContainer

class OSTreeContainer_TestCase(unittest.TestCase):
def runTest(self):
cmd = F38_OSTreeContainer()
self.assertEqual(cmd.noSignatureVerification, False)

# test if arguments are required
op = cmd._getParser()
for action in op._actions:
if '--url' in action.option_strings:
self.assertEqual(action.required, True)

class F38_TestCase(CommandTest):
command = "ostreecontainer"

def runTest(self):
# pass
# the stateroot has default value "default" and remote is set from stateroot if not set
cmdstr = "ostreecontainer --url=\"quay.io/test/test_c:stable\""
self.assert_parse(cmdstr, cmdstr + "\n")
cmdstr = "ostreecontainer --stateroot=\"fedora-silverblue\" --url=\"quay.io/test/test_c:stable\""
cmdstr_expected = "ostreecontainer --stateroot=\"fedora-silverblue\" --remote=\"fedora-silverblue\" --url=\"quay.io/test/test_c:stable\""
self.assert_parse(cmdstr, cmdstr_expected + "\n")
cmdstr = "ostreecontainer --stateroot=\"fedora-silverblue\" --remote=\"test-remote\" --url=\"quay.io/test/test_c:stable\""
self.assert_parse(cmdstr, cmdstr + "\n")
cmdstr = "ostreecontainer --stateroot=\"fedora-silverblue\" --remote=\"test-remote\" --no-signature-verification --url=\"quay.io/test/test_c:stable\""
self.assert_parse(cmdstr, cmdstr + "\n")
cmdstr = "ostreecontainer --stateroot=\"fedora-silverblue\" --remote=\"test-remote\" --no-signature-verification --transport=\"repository\" --url=\"quay.io/test/test_c:stable\""
self.assert_parse(cmdstr, cmdstr + "\n")

# fail - we have required arguments
self.assert_parse_error("ostreecontainer")
self.assert_parse_error("ostreecontainer --bacon=tasty")
self.assert_parse_error("ostreecontainer --os=fedora-silverblue")
self.assert_parse_error("ostreecontainer --stateroot=fedora-silverblue")
self.assert_parse_error("ostreecontainer --no-signature-verification")
self.assert_parse_error("ostreecontainer --remote=\"sweet\"")
self.assert_parse_error("ostreecontainer --transport=\"test\"")

0 comments on commit 4357283

Please sign in to comment.