397 Commits
Author SHA1 Message Date
Tudor Marcu d4fb2d64f2 Release v4.2.1
This release refactors the BAT tests and adds new tests for the bundle
command, fixes a bug where the version URL was set to the content URL,
reports packages as part of bundle list, and cleans up temp dirs.

Signed-off-by: Tudor Marcu <tudor.marcu@intel.com>
v4.2.1
2018-04-03 18:00:57 +00:00
Matthew Johnson 16bb0edf7d Add hack to fix bogus contentsize check in client
A recent bug in swupd-client prevents users from updating due to a
maximum contensize check that was a couple orders of magnitude off.
These clients are broken and cannot update if they have installed
bundles that violate this maximum.

To allow these broken clients to update temporarily set the maximum
contentsize to the bogus contentsize expected by the client.

Remove this check once a format bump has occurred.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-04-03 10:56:45 -07:00
Kevin C. Wells 299514392b Fix version url bug
Previously, --new-chroots was accidentally using the 'CONTENTURL' value
from builder.conf for both the 'contenturl' and 'versionurl' files.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-04-02 17:31:17 -07:00
Kevin C. Wells 4ef0b73161 Clean up tmp dir after building bundles
'mixer build bundles' creates a temp dir to use for one of the dnf
commands. This patch cleans that dir up when mixer is done building the
bundles.

This is really minor, as by default it writes to /tmp, which gets
cleaned up eventually anyway. However, ioutil.TempDir() will write to
wherever $TMPDIR points, which could be anywhere.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-23 12:05:07 -07:00
Kevin C. Wells 2d7542bef6 Update 'mixer bundle list' to report packages
This patch changes the output for 'mixer bundle list' and 'mixer bundle
list --tree' to distinguish between bundles and packages. This should
help clarify exactly where items in the mix are coming from.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-23 11:43:39 -07:00
Kevin C. Wells eb4a9b7d6d Refactor 'mixer build' bats tests
This patch significantly overhauls the BATS tests for building mixes,
with the goal of reducing redundancy and increasing accuracy.

Each of the following concepts is only tested once:
- Building a mix with a full, real upstream bundle
- Updating the version of a mix (technically tested twice)
- Adding a bundle to a mix
- Removing a bundle from a mix
- Building a mix with a custom local bundle
- Adding a custom package to an upstream bundle
- Adding an upstream package to a custom bundle

Because all but one of the tests use stripped down versions of upstream
bundles for efficiency, they all test:
- Building a mix with a local, edited upstream bundle

This dramatically reduces the number of actual builds that occur.

The test descriptions accurately describe what the tests are actually
doing, and they report if they are using stripped down versions of upstream
bundles.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-22 17:26:40 -07:00
Kevin C. Wells a0771473ab Add new bundle command tests
Add a new set of tests that run through a sequence of 'mixer bundle'
commands and test that they are working as expected.

Note that this is re-using the "01" number, as the rest are being
reworked as a separate commit.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-22 17:26:40 -07:00
Matthew Johnson 8bdab29f8d Do not init image directories from manifest creation
This step was completely unnecessary and created empty chroot
directories in the image dir. This was a product of a too-direct port of
the old swupd-server for this specific part of the rewrite. It probably
wasn't even needed in the old swupd-server.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-22 17:07:28 -07:00
Kevin C. Wells 311d1cfe33 Fix 'mixer bundle list' to work with packages
This patch updates the 'mixer bundle list' command to read the local and
upstream package files. Now 'mixer bundle list local', for example, will
list package-bundles defined in local-packages alongside bundles defined
in local-bundles/.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-22 16:49:02 -07:00
Kevin C. Wells 7753791d8d Release v4.2.0
This release contains four major additions:

1) Support for package-level bundles. A new local and upstream package
list has been introduced, which mixer parses to automatically generate
single-package bundles.

2) The bundle building algorithm has been significantly optimized. This
step now runs approximately three times faster than the previous version.

3) New TOML configuration support. Mixer now has an optional
'--new-config' flag that adds support for TOML-based configuration. A
new 'mixer config' command has been added to validate existing
builder.conf files, as well as convert legacy (INI) files into the new
TOML format.

4) Update to how mixer generates the DNF conf file used during bundle
building. This removes the dependency on m4.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
v4.2.0
2018-03-22 18:05:34 +00:00
Rodrigo Chiossi 1c7a08410d cmd: add mixer config convert command
Add 'convert' as a 'mixer config' subcommand. This command allows the
conversion from old config files to the new TOML config file.

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi d5d35dd506 cmd: add mixer config command
Add 'mixer config' utility command along with 'validate' subcommand,
which parses a config file and print the expanded values

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi 80c57ee7fc config: Add TOML config
This patch adds a new type of config file for mixer, based on the TOML
format. The new format is not compatible with the old parser and
vice-versa. The new flag --new-config enables the use of the new format.

This patch also adds to the parser the properties that exist in the
config file but were not parsed by the older parser.

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi 44f8b6dce6 builder: Add GetConfigPath utility function
The process of checking if a path was provided and getting pwd if not is
required in multiple parts of the code, so this path allows for code
reuse.

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi 8cfd1b1fc0 config: break parsing into discrete steps
Separate the parsing step into parsing, environment variables expansion
and validation. This allows the last two steps to be reused even if the
parse method changes.

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi be000990ae config: Split into categories
Split the config variables into subsections that reflect the structure
of the config file.

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Rodrigo Chiossi d90b12b509 builder: Isolate config
Separete config loading and parsing from Builder object into its own
MixConfig class.

This patch also removes the parsing of CLEARVER and MIXVER since they
are parsed from .mixversion and .clearversion files instead of
builder.conf

Signed-off-by: Rodrigo Chiossi <rodrigo.chiossi@intel.com>
2018-03-22 11:02:49 -07:00
Kevin C. Wells cf7ccdde2b bat tests: Fix local directory names and rpm paths
The mixerlib file and the CLEANDIRS variable in all of the individual
bat Makefiles still pointed to the old "local" and "rpms" directories in
some locations.

This, made 'make batclean' not clean up directories correctly. This likely
made some of the tests not actually do what they were supposed to do, as it
was looking for rpms in 'local-rpms', but putting them in 'rpms'.

This patch also updates the url for the "json-c" rpm, as the previous url no
longer is active and was to a source rpm.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-22 10:46:07 -07:00
Kevin C. Wells f5a79eb090 Rewrite the DNF conf generation
Previously, mixer used m4 to generate the dnf conf (.yum.conf), and only
did so if the file did not already exist, so as to not overwrite people's
custom conf files. However, this meant that the check if a "[local]"
section was needed only ran if the file didn't exist. If a mix had already
been built, this check was skipped, and the local section was never inserted.

This patch removes the use of the yum.conf.in file and m4, instead using an
embedded template. Additionally, if the file already exists but the local
section is needed, mixer will now check the file to see if it has the necessary
local section. If not, the section will be appended to the file.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-22 10:45:45 -07:00
Matthew Johnson 2420606335 Perform all DNF transactions in bulk
When building bundles perform all DNF transactions in bulk. There are
two reasons to do this.

1. DNF is too smart for its own good. It will resolve dependencies
   differently depending on the packages listed in the transaction.
   Therefore we must perform these transactions with all relevant
   packages listed for the bundle being processed.
2. DNF transactions take time. When performing much fewer transactions
   in bulk the bundle builder can execute in a shorter time.

Certain manifest validation tools also require a complete dep-solved
list of all packages and included packages for a bundle to validate the
bundle manifest. For this reason use the bundle.AllPackages list and
leave the bundle.DirectPackages list as an informational list of just
the direct packages specified in the bundle definition file.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-21 16:28:00 -07:00
Matthew Johnson b1e3957509 validate-swupd.sh: remove unnecessary popd calls
It is not necessary to call popd before exiting the script, remove these
calls.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-21 16:26:58 -07:00
Matthew Johnson 7d53e5d197 Process package-scope bundles from package lists
This patch adds the capability to add package-scope bundles to your mix
either from upstream "packages" file or from a "local-packages" file in
your mix directory. These files list one package per line like so:

helloworld
vim
emacs

The bundles created from these packages will be named after the package
itself and will only have that one package defined (plus filesystem as a
hard-coded depencency). The bundle will have no includes. A bundle
definition for the helloworld package will look like this:

Name: helloworld
Filename: /path/to/{local-packages,packages}
DirectPackages: [helloworld, filesystem]

These packages can be added as bundles simply by running

mixer bundle add helloworld

and mixer will look for the definition in the following order:
1. local-bundles directory
2. local-packages file
3. upstream-bundles directory
4. packages file (upstream)

and will take the first definition it finds. The rest of mixer will see
this package as just another bundle and update content will be created
in the same manner as all other bundles.

The validate-swupd.sh script was added to define a helloworld package,
bundle add it, and test it with the client.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-21 16:26:58 -07:00
Tudor Marcu 96d4b2bd13 Release v4.1.2
This release adds an os-packages file to list all package/srpms in
the build, which can be useful for determining more information on
packages and their corresponding SRPM name.

Signed-off-by: Tudor Marcu <tudor.marcu@intel.com>
2018-03-15 16:36:34 +00:00
Matthew Johnson 35adec4005 Add os-packages file to list all package/srpms in build
This file is intended to be used by validation tooling to identify
orphaned packages and verify there are no file collisions in the build.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-14 15:51:19 -07:00
Tudor Marcu 03214045f0 Release v4.1.1
This release fixes the following bugs:
- Resolve /lib to /usr/lib instead of /usr/lib64
- Install DirectPackages to full chroot instead of AllPackages
	- DirectPackage is the fully resolved list for the bundle(s)
- Skip continued lines in dnf install output causing missing lines in parsing
- Clear cache before DNF install to full chroot causing dnf tracebacks

Smaller fixes such as adding trailing newline to mixbundles, parsing
versions numbers on init, normalizing bundle name output, and updating
all (currently possible) yum references to dnf were also added.

Signed-off-by: Tudor Marcu <tudor.marcu@intel.com>
v4.1.1
2018-03-13 18:35:30 +00:00
Kevin C. Wells ff98fe9c62 Add trailing newline to mixbundles
Previously mixer wrote the mix bundle list as a newline-separated list,
rather than as a newline-delimited list. This made things like "wc -l"
report one fewer than expected, as the final line contained no newline.

This trailing newline does not affect the existing parsing code.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-13 11:31:54 -07:00
Matthew Johnson 9ec58d9fc5 Clear cache before DNF install to full chroot
Keeping the cache around has resulted in interesting errors with invalid
bytes being read from the cache and resulting in DNF tracebacks. As a
fix for this tell DNF not to keepcache and manually clear the cache
before doing the full install. This seems to either be a bug with DNF
itself or maybe with the way Clear Linux is doing its packaging (though
this is just a guess).

The error seen is a UnicodeDecodeError from the DNF source code. It is
trying to decode a non-UTF-8 byte as UTF-8:

Traceback (most recent call last):
  File "/usr/bin/dnf", line 58, in <module>
    main.user_main(sys.argv[1:], exit_code=True)
  File "/usr/lib/python3.6/site-packages/dnf/cli/main.py", line 179, in user_main
    errcode = main(args)
  File "/usr/lib/python3.6/site-packages/dnf/cli/main.py", line 64, in main
    return _main(base, args, cli_class, option_parser_class)
  File "/usr/lib/python3.6/site-packages/dnf/cli/main.py", line 99, in _main
    return cli_run(cli, base)
  File "/usr/lib/python3.6/site-packages/dnf/cli/main.py", line 123, in cli_run
    ret = resolving(cli, base)
  File "/usr/lib/python3.6/site-packages/dnf/cli/main.py", line 154, in resolving
    base.do_transaction(display=displays)
  File "/usr/lib/python3.6/site-packages/dnf/cli/cli.py", line 238, in do_transaction
    super(BaseCli, self).do_transaction(display)
  File "/usr/lib/python3.6/site-packages/dnf/base.py", line 781, in do_transaction
    self._run_transaction(cb=cb)
  File "/usr/lib/python3.6/site-packages/dnf/base.py", line 925, in _run_transaction
    self._verify_transaction(cb.verify_tsi_package)
  File "/usr/lib/python3.6/site-packages/dnf/base.py", line 1018, in _verify_transaction
    self.history.sync_alldb(po)
  File "/usr/lib/python3.6/site-packages/dnf/yum/history.py", line 1399, in sync_alldb
    self._save_rpmdb(ipkg) and
  File "/usr/lib/python3.6/site-packages/dnf/yum/history.py", line 1360, in _save_rpmdb
    val = getattr(ipkg, attr, None)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 0: invalid start byte

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-13 11:31:17 -07:00
Matthew Johnson 0c422c1391 Skip continued lines in dnf install output
DNF likes to set line-width to a default 80 characters when not running
in a TTY (this was confirmed in the source code) and perform a
complicated 'smart wrap' on the fields after any fields that overflow
their column. This results in wrapped lines that do not have the
information we are looking for. Fortunately these lines are prefixed by
more than one space (' ') character. Since package names are always at
the beginning of the line and only prefixed by one space character, if
there is more than one space we can skip the line when parsing.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-12 16:09:19 -07:00
Matthew Johnson 0df4d73195 Install DirectPackages to full chroot
Do not just install the AllPackages list to the full chroot, since this
is just the list of all included packages. The DirectPackages need to be
installed instead since this is the fully resolved list for each bundle.
AllPackages do not need to be installed because all bundles are being
installed to the same place.

Do a check on the length of the DirectPackages list before actually
trying to install them so we don't try to 'dnf install ' (no package
specified) for bundles that don't specify their own packages and only
include other bundles.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-12 16:09:19 -07:00
Kevin C. Wells f228559fe1 Parse version numbers on init
Recently, code was added to ReadVersions to parse the mixversion
and upstreamversion string values as uint32 values. This patch
adds the same logic to init (the only command that does not
result in a call to ReadVersions), so that the parsed versions
will be consistently available.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-12 13:01:31 -07:00
Matthew Johnson 66392a1e64 Convert chroot/yum references to bundles/dnf
Recent changes deprecated the use of individual bundle chroots when
building bundle contents and moved away from using yum to using dnf.
Because of this much of our variable and file names and comments were
inconsistent with the implementation.

This includes a change to make 'mixer build chroots' an alias to 'mixer
build bundles' and updates to the bat tests to call the new 'mixer build
bundles' command. This is not a breaking change since 'mixer build
chroots' behaves the way it always has (except internally with the
recent changes mentioned).

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-12 09:57:17 -07:00
Kevin C. Wells c59eb134a3 Normalize bundle name output
Previously, the names of bundles were output differently from one
command to another. Some would insert the bundle name as-is, some would
surround it with single quotes, and some would use double quotes.

This patch normalizes all output (that I could find in builder.conf) to
use the same output format: all now use the %q formatter, which renders
them with double quotes.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-12 09:21:44 -07:00
Matthew Johnson 1755ea28fd Resolve /lib to /usr/lib instead of /usr/lib64
Fix a typo that resolved /lib paths to /usr/lib64.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 16:27:52 -08:00
Kevin C. Wells 7408f4e75a Release v4.1.0
This release includes a significant change to the way chroots are built.
Rather than building individual chroots for each bundle, a single full
chroot is generated, and JSON metadata files are created for each bundle.
This allows us to scale much more easily on machines with limited disk
space. Because chroots are now decoupled from manifest creation, this
also makes it possible in the future to move to bundle builds on
distributed machines.

Additionally, a change was made to allow developers to add extra files
to a bundle in addition to those included by the bundle packages.

A change was included that fails when the manifest cannot be parsed.

Minor bug fixes are also included.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
v4.1.0
2018-03-09 19:57:58 +00:00
Matthew Johnson 783ef71e61 Do not shadow declared err variable
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:54:08 -08:00
Matthew Johnson e6526ff6ef Add support for adding extra files to a bundle
Allow a user to add extra files to a bundle by adding a file per line to
<imageDir>/<version>/<bundleName>-extra-files. Each file must be an
absolute path. At this point the user must manually create the file in
the full chroot as well.

The workflow for a user adding additional files to a bundle would be
this:

- mixer build chroots
- echo /path/to/bar >> update/image/my-bundle-extra-files
- mkdir -p update/image/full/path/to
- cp /local/path/to/bar update/image/full/path/to/bar
- mixer build update

This can definitely be improved in the future but this is a first step
that allows additional content on top of what dnf installs.

In the rare case that a post-install action for dnf install adds a file,
this file would already exist in the full chroot and would not need to
be copied in. The user would only need to append the path to that file
to the <bundle>-extra-files file to make sure it is included in that
bundle's manifests.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:54:08 -08:00
Matthew Johnson 6fa8754a30 Add format flag to update in validate-swupd.sh
This is necessary for actually performing the update against the correct
format. Without it the server version will be detected as -1.

While I'm here, fix the quoting for this line.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:36:27 -08:00
Matthew Johnson cced6a0180 Use filepath.Join for recordFromFile hash calculation
This caused an issue in testing where the passed file.Name did not
include a leading /. This was technically a testing bug but let's be
consistent about joining our paths anyways.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:36:27 -08:00
Matthew Johnson 9edb1d9d73 Overhaul tests to use new bundle creation method
This overhaul leaves several tests using the old method of using chroots
to generate the update to verify we aren't totally deprecating the old
method.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:36:27 -08:00
Matthew Johnson 341891f55f Build bundle information using dnf commands
Deprecate use of chroot-building for each individual bundle. This allows
us to scale much easier on machines with limited disk space. Because
chroots are decoupled from manifest creation this also makes it possible
in the future to move to doing bundle builds on distributed machines and
allows our bundle numbers to scale. The bundle file list is stored in a
JSON file that is read later by the manifest creation step.

This leaves a fallback in swupd/fullchroot.go to allow users to add
content to a chroot in order to extend a typical build.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-09 11:36:27 -08:00
Matthew Johnson c9ab1b5008 Fail when parsing invalid old manifests
Fail when the old manifest exists but is invalid and cannot be parsed.
This is a clear failure case because the old manifest does exist at that
path and therefore the user expects it to be used.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-08 16:39:51 -08:00
Matthew Johnson 94e7f8a474 Allow 'm' flag in rename flag position
The 'm' flag is used as a special flag by mixer-integration on the
client side to indicate a manifest record in the Manifest.MoM was
created by a local mix. Allow this flag and just set the rename flag to
renameUnset.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-08 16:39:51 -08:00
Tudor Marcu 604e33249c Fix erroneous test
Signed-off-by: Tudor Marcu <tudor.marcu@intel.com>
2018-03-09 00:36:10 +00:00
Tudor Marcu 2fc6761727 Updates for new mixer
Touch mixbundles so it does not get autopopulated by init, and use
os-core in the builder.conf so we do not have to include os-core-update.

Signed-off-by: Tudor Marcu <tudor.marcu@intel.com>
2018-03-08 16:32:01 -08:00
Matthew Johnson 3b61e82eab bat: write to buildconf as privileged user
The builder.conf is created and owned by root, so it must be appended to
as root.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-08 16:25:53 -08:00
Kevin C. Wells f888e6d09d Release v4.0.3
This release fixes:

- Travis: add workaround to failing clrtrust
- build-deltas: Do not fail on missing previous versions
- Update 'mixer bundle add' to skip existing bundles

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
v4.0.3
2018-03-07 16:34:34 -08:00
Matthew Johnson b93a6efa02 Add newline to error printf
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-07 15:55:21 -08:00
Kevin C. Wells 864505b503 Update 'mixer bundle add' to skip existing bundles
Previously, repeated calls to 'mixer bundle add <bundle>' would yield
the same "Adding bundle <bundle> from <source>" output. Because the
Mix Bundle List is treated as a set, and duplicate bundles are removed,
these redundant additions do not change the resultant list, and are
effectively no-ops.

This patch:
a) Explictly skips the bundles if they already exist.
b) Reports this case to the user

As a result, functionality is equivalent, but the no-op behavior is
more explicit and output is more clear.

Signed-off-by: Kevin C. Wells <kevin.c.wells@intel.com>
2018-03-07 11:42:37 -08:00
Matthew Johnson b75733a1e4 Travis: add workaround to failing clrtrust
In the current clearlinux:latest docker image clrtrust generate is
broken due to /var/lock not existing. To workaround this so our CI isn't
constantly failing mkdir -p this directory. This will not break future
fixes to clrtrust, but the maintainer will alert us when this workaround
can be removed.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-07 11:39:34 -08:00
Matthew Johnson cf7a3a03f6 build-deltas: Do not fail on missing previous versions.
A version can be missing if the minversion is newer than the previous
version being checked. This is not an error, but should be printed as a
warning to the user in case this is not expected.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-03-07 11:39:34 -08:00