3110N/A#!/usr/bin/python
3110N/A#
3110N/A# CDDL HEADER START
3110N/A#
3110N/A# The contents of this file are subject to the terms of the
3110N/A# Common Development and Distribution License (the "License").
3110N/A# You may not use this file except in compliance with the License.
3110N/A#
3110N/A# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3110N/A# or http://www.opensolaris.org/os/licensing.
3110N/A# See the License for the specific language governing permissions
3110N/A# and limitations under the License.
3110N/A#
3110N/A# When distributing Covered Code, include this CDDL HEADER in each
3110N/A# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3110N/A# If applicable, add the following below this CDDL HEADER, with the
3110N/A# fields enclosed by brackets "[]" replaced with your own identifying
3110N/A# information: Portions Copyright [yyyy] [name of copyright owner]
3110N/A#
3110N/A# CDDL HEADER END
3110N/A#
3110N/A
3110N/A#
3339N/A# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
3110N/A#
3110N/A
3339N/Afrom . import testutils
3110N/Aif __name__ == "__main__":
3110N/A testutils.setup_environment("../../../proto")
3110N/Aimport pkg5unittest
3110N/A
3110N/Aimport os
3110N/Aimport pkg.misc as misc
3110N/Aimport time
3110N/A
3110N/Aclass TestPkgHydrate(pkg5unittest.ManyDepotTestCase):
3110N/A # Tests in this suite use the read only data directory.
3110N/A need_ro_data = True
3110N/A
3110N/A # A set of packages that we publish with additional hash attributes
3110N/A pkgs = """
3110N/A open dev@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=dev
3110N/A add dir mode=0755 owner=root group=bin path=dev/cfg
3110N/A add file dev/cfg/bar path=dev/cfg/bar mode=0644 owner=root group=bin preserve=true facet.locale.fr=True variant.opensolaris.zone=global
3110N/A add file dev/cfg/bar1 path=dev/cfg/bar1 mode=0555 owner=root group=bin facet.locale.fr=True variant.opensolaris.zone=global revert-tag="bob"
3110N/A add file dev/cfg/bar2 path=dev/cfg/bar2 mode=0644 owner=root group=bin overlay=true
3110N/A add link path=dev/cfg/bar1.slink target=bar1
3110N/A add hardlink path=usr/bin/vi target=../../dev/cfg/bar2 mediator=vi mediator-implementation=dev
3110N/A close
3110N/A open dev@2.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=dev
3110N/A add dir mode=0755 owner=root group=bin path=dev/cfg
3110N/A add file dev/cfg/bar path=dev/cfg/bar mode=0644 owner=root group=bin preserve=true
3110N/A add file dev/cfg/bar1 path=dev/cfg/bar1 mode=0555 owner=root group=bin
3110N/A add file dev/cfg/bar2 path=dev/cfg/bar2 mode=0644 owner=root group=bin overlay=true
3110N/A add file dev/cfg/bar3 path=dev/cfg/bar3 mode=0644 owner=root group=bin
3110N/A add link path=dev/cfg/bar1.slink target=bar1
3110N/A add hardlink path=usr/bin/vi target=../../dev/cfg/bar2 mediator=vi mediator-implementation=dev
3110N/A close
3110N/A open dev2@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=dev
3110N/A add dir mode=0755 owner=root group=bin path=dev/cfg
3110N/A add file dev/cfg/foo path=dev/cfg/foo mode=0555 owner=root group=bin
3110N/A add link path=dev/cfg/foo.slink target=foo
3110N/A add hardlink path=dev/cfg/foo.hlink target=foo
3110N/A close
3110N/A """
3110N/A
3110N/A pkgs2 = """
3110N/A open etc@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=etc
3110N/A add dir mode=0755 owner=root group=bin path=etc/cfg
3110N/A add file etc/foo path=etc/foo mode=0555 owner=root group=bin
3110N/A add file etc/cfg/foo path=etc/cfg/foo mode=0644 owner=root group=bin preserve=true
3110N/A add file etc/cfg/foo1 path=etc/cfg/foo1 mode=0555 owner=root group=bin
3110N/A add link path=etc/foo.slink target=foo
3110N/A add hardlink path=usr/bin/vi target=../../etc/foo mediator=vi mediator-implementation=etc
3110N/A close
3110N/A open etc@2.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=etc
3110N/A add file etc/foo path=etc/foo mode=0555 owner=root group=bin
3110N/A add hardlink path=usr/bin/vi target=../../etc/foo mediator=vi mediator-implementation=etc
3110N/A close
3110N/A """
3110N/A
3110N/A pkgs3 = """
3110N/A open dba@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=dba
3110N/A add file dba/foo path=dba/foo mode=0555 owner=root group=bin
3110N/A add file dba/foo1 path=dba/foo1 mode=0644 owner=root group=bin preserve=true
3110N/A add link path=dba/foo.slink target=foo
3110N/A add hardlink path=dba/foo.hlink target=foo
3110N/A close
3110N/A """
3110N/A
3110N/A pkgs4 = """
3110N/A open cga@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=cga
3110N/A close
3110N/A open mnt@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=mnt
3110N/A add file mnt/mm path=mnt/mm mode=0555 owner=root group=bin
3110N/A add file mnt/nn path=mnt/nn mode=0644 owner=root group=bin preserve=true
3110N/A close
3110N/A """
3110N/A
3110N/A zones = """
3110N/A open zones@1.0,5.11-0
3110N/A add dir mode=0755 owner=root group=bin path=etc/zones
3110N/A add file path=etc/zones/index mode=0644 owner=root group=bin preserve=true
3110N/A add file group=bin mode=0444 owner=root path=etc/zones/SYSdefault.xml dehydrate=false variant.opensolaris.zone=global
3110N/A close
3110N/A """
3110N/A
3110N/A misc_files = ["dev/cfg/bar", "dev/cfg/bar1", "dev/cfg/bar2", "dev/cfg/bar3",
3110N/A "dev/cfg/bar1.slink", "usr/bin/vi", "dev/cfg/foo",
3110N/A "dev/cfg/foo.hlink",
3110N/A "etc/foo", "etc/cfg/foo", "etc/cfg/foo1", "etc/foo.slink",
3110N/A "dba/foo", "dba/foo1", "dba/foo.slink", "dba/foo1.slink",
3110N/A "dba/foo.hlink",
3110N/A "mnt/mm", "mnt/nn"]
3110N/A
3110N/A def setUp(self):
3110N/A pkg5unittest.ManyDepotTestCase.setUp(self, ["test1", "test2",
3110N/A "test1", "test3"])
3110N/A
3110N/A self.rurl1 = self.dcs[1].get_repo_url()
3110N/A self.make_misc_files(self.misc_files)
3110N/A self.plist = self.pkgsend_bulk(self.rurl1, self.pkgs)
3110N/A self.rurl2 = self.dcs[2].get_repo_url()
3110N/A self.pkgsend_bulk(self.rurl2, self.pkgs2)
3110N/A self.rurl3 = self.dcs[3].get_repo_url()
3110N/A self.pkgsend_bulk(self.rurl3, self.pkgs3)
3110N/A self.rurl4 = self.dcs[4].get_repo_url()
3110N/A self.pkgsend_bulk(self.rurl4, self.pkgs4)
3110N/A self.pkgsign_simple(self.rurl1, "'*'")
3110N/A self.pkgsign_simple(self.rurl2, "'*'")
3110N/A self.pkgsign_simple(self.rurl3, "'*'")
3110N/A self.pkgsign_simple(self.rurl4, "'*'")
3110N/A
3110N/A def test_01_basics(self):
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A # Nothing to do when there are no packages installed under
3110N/A # all publishers.
3110N/A self.pkg("dehydrate", exit=4)
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated []\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("dehydrate -p test1", exit=4)
3110N/A self.pkg("rehydrate", exit=4)
3110N/A
3110N/A self.pkg("install dev@1.0 dev2")
3110N/A # Rehydrate do nothing if the publisher has not been dehydrated.
3110N/A self.pkg("rehydrate -p test1", exit=4)
3110N/A
3110N/A index_dir = self.get_img_api_obj().img.index_dir
3110N/A index_file = os.path.join(index_dir, "main_dict.ascii.v2")
3110N/A orig_mtime = os.stat(index_file).st_mtime
3110N/A time.sleep(1)
3110N/A
3110N/A some_files = ["dev/xxx", "dev/yyy", "dev/zzz",
3110N/A "dev/dir1/aaaa", "dev/dir1/bbbb", "dev/dir2/cccc",
3110N/A "dev/cfg/ffff", "dev/cfg/gggg",
3110N/A "dev/cfg/dir3/iiii", "dev/cfg/dir3/jjjj"]
3110N/A some_dirs = ["dev/dir1/", "dev/dir1/", "dev/dir2/", "dev/cfg/dir3/"]
3110N/A self.create_some_files(some_dirs + some_files)
3110N/A self.files_are_all_there(some_dirs + some_files)
3110N/A removed = "dev/cfg/bar1"
3110N/A size1 = self.file_size(removed)
3110N/A
3110N/A # Verify that unprivileged users are handled by dehydrate.
3110N/A self.pkg("dehydrate", exit=1, su_wrap=True)
3110N/A
3110N/A # Verify that dehydrate fails gracefully,
3110N/A # if any of the specified publishers does not have a configured
3110N/A # package repository;
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("set-publisher -G '*' test2")
3110N/A self.pkg("dehydrate -p test1 -p test2", exit=1)
3110N/A # if any of the publishers specified does not exist;
3110N/A self.pkg("dehydrate -p nosuch -p test1", exit=1)
3110N/A # if all known publishers have no configured package repository.
3110N/A self.pkg("set-publisher -G '*' test1")
3110N/A self.pkg("dehydrate", exit=1)
3110N/A self.pkg("dehydrate -p test1", exit=1)
3110N/A
3110N/A # If no publishers exist in the image,
3110N/A self.pkg("unset-publisher test1 test2")
3110N/A # dehydrate will default to do nothing;
3110N/A self.pkg("dehydrate", exit=4)
3110N/A # the specified publisher will be treated as not having a
3110N/A # configured package repository.
3110N/A self.pkg("dehydrate -p test1", exit=1)
3110N/A
3110N/A # Verify that dehydrate works as expected.
3110N/A self.pkg("set-publisher -g " + self.rurl1 + " test1")
3110N/A self.pkg("dehydrate -vvv -p test1")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A # Verify dehydrate would not touch unpackaged data.
3110N/A self.files_are_all_there(some_dirs + some_files)
3110N/A # Verify that files are deleted or remained as expected.
3110N/A self.file_exists("dev/cfg/bar")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_exists("dev/cfg/bar2")
3110N/A self.file_doesnt_exist("usr/bin/vi")
3110N/A self.file_doesnt_exist("dev/cfg/foo.hlink")
3110N/A self.file_doesnt_exist("dev/cfg/foo")
3110N/A
3110N/A # Dehydrate do nothing on dehydrated publishers.
3110N/A self.pkg("dehydrate -vvv -p test1", exit=4)
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A
3110N/A # Verify that rehydrate fails gracefully,
3110N/A # if any of the specified publishers does not have a configured
3110N/A # package repository;
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("set-publisher -G '*' test2")
3110N/A self.pkg("rehydrate -p test2 -p test1", exit=1)
3110N/A # if any of the publishers specified does not exist;
3110N/A self.pkg("rehydrate -p nosuch -p test1", exit=1)
3110N/A # if all known publishers have no configured package repository.
3110N/A self.pkg("set-publisher -G '*' test1")
3110N/A self.pkg("rehydrate", exit=1)
3110N/A self.pkg("rehydrate -p test1", exit=1)
3110N/A
3110N/A # If no publishers exist in the image,
3110N/A self.pkg("unset-publisher test1 test2")
3110N/A # The dehydrated property will not be removed if the publisher
3110N/A # is deleted.
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A # rehydrate will default to do nothing;
3110N/A self.pkg("rehydrate", exit=4)
3110N/A # the specified publisher will be treated as not having a
3110N/A # configured package repository.
3110N/A self.pkg("rehydrate -p test1", exit=1)
3110N/A
3110N/A # Verify that unprivileged users are handled by rehydrate.
3110N/A self.pkg("rehydrate", exit=1, su_wrap=True)
3110N/A
3110N/A # Verify that rehydrate works as expected.
3110N/A self.pkg("set-publisher -g " + self.rurl1 + " test1")
3110N/A self.pkg("rehydrate -vvv -p test1")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Check that we didn't reindex.
3110N/A new_mtime = os.stat(index_file).st_mtime
3110N/A self.assertEqual(orig_mtime, new_mtime)
3110N/A
3110N/A # Make sure it's the same size as the original.
3110N/A size2 = self.file_size(removed)
3110N/A self.assertEqual(size1, size2)
3110N/A
3110N/A # Verify that rehydrate will not operate on rehydrated publishers.
3110N/A self.pkg("rehydrate -p test1", exit=4)
3110N/A
3110N/A # Verify that the default behavior of dehydrate/rehydrate works
3110N/A # as expected.
3110N/A self.pkg("dehydrate")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that dehydrate defaults to dehydrate on all publishers
3110N/A # that have configured repositories, regardless of whether the
3110N/A # publisher has installed packages or not.
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("dehydrate -vvv")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1', 'test2']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("rehydrate -vvv")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_02_multiple_publishers(self):
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("install dev@1.0 dev2")
3110N/A self.pkg("install etc@1.0")
3110N/A
3110N/A some_files = ["dev/cfg/bar1", "usr/bin/vi", "dev/cfg/foo",
3110N/A "etc/foo", "etc/cfg/foo1"]
3110N/A
3110N/A # Verify that specifying publishers manually will work.
3110N/A self.pkg("dehydrate -vvv -p test1 -p test2")
3110N/A self.files_are_all_missing(some_files)
3110N/A self.pkg("rehydrate -vvv -p test1 -p test2")
3110N/A self.files_are_all_there(some_files)
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that dehydrate defaults to operate on all publishers
3110N/A # with configured package repositories.
3110N/A self.pkg("dehydrate -vvv")
3110N/A self.files_are_all_missing(some_files)
3110N/A self.pkg("rehydrate -vvv")
3110N/A self.files_are_all_there(some_files)
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that multiple origins with the same publisher will work.
3110N/A self.pkg("set-publisher -g " + self.rurl3 + " test1")
3110N/A self.pkg("install dba")
3110N/A self.pkg("dehydrate -vvv -p test1")
3110N/A some_files = ["dev/cfg/bar1", "dev/cfg/foo", "dba/foo",
3110N/A "dba/foo.hlink"]
3110N/A self.files_are_all_missing(some_files)
3110N/A self.pkg("rehydrate -vvv")
3110N/A self.files_are_all_there(some_files)
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that packages with nothing to dehydrate will work.
3110N/A self.pkg("set-publisher -g " + self.rurl4 + " test3")
3110N/A self.pkg("install cga")
3110N/A self.pkg("dehydrate -vvv -p test1 -p test3")
3110N/A self.pkg("rehydrate -vvv -p test1 -p test3")
3110N/A self.pkg("verify")
3110N/A
3110N/A # More tests on the user behaviors.
3110N/A self.pkg("dehydrate -vvv -p test1")
3110N/A self.pkg("dehydrate -vvv -p test2")
3110N/A self.pkg("rehydrate -vvv -p test1")
3110N/A self.pkg("rehydrate -vvv -p test1", exit=4)
3110N/A self.pkg("rehydrate -vvv -p test2")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Test the dehydrated property will be set correctly.
3110N/A self.pkg("install mnt")
3110N/A self.pkg("dehydrate -p test1 -p test3")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1', 'test3']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A
3110N/A self.pkg("dehydrate -p test1 -p test2 -p test3")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3339N/A"""PROPERTY VALUE\ndehydrated ['test1', 'test2', 'test3']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("rehydrate -p test3")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1', 'test2']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("rehydrate")
3110N/A # The dehydrated proerty should has no value after
3110N/A # fully rehydrate.
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated []\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3339N/A"""PROPERTY VALUE\ndehydrated ['test1', 'test2', 'test3']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated []\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_03_hardlinks(self):
3110N/A """Hardlink test: make sure that a file getting rehydrated gets
3110N/A any hardlinks that point to it updated"""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install dev@1.0")
3110N/A
3110N/A victim = "dev/cfg/bar2"
3110N/A victimlink = "usr/bin/vi"
3110N/A
3110N/A self.pkg("dehydrate")
3110N/A self.pkg("rehydrate")
3110N/A
3110N/A # Get the inode of the orig file.
3110N/A i1 = self.file_inode(victim)
3110N/A # Get the inode of the new hardlink.
3110N/A i2 = self.file_inode(victimlink)
3110N/A
3110N/A # Make sure the inode of the link is now same.
3110N/A self.assertEqual(i1, i2)
3110N/A
3110N/A def test_04_pkg_install(self):
3110N/A """Test that pkg install will install packages dehydrated from
3110N/A dehydrated publishers and install packages normally from normal
3110N/A publishers."""
3110N/A for install_cmd in ["install", "exact-install"]:
3110N/A self.base_04_pkg_install(install_cmd)
3110N/A
3110N/A def base_04_pkg_install(self, install_cmd):
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A # Verify that a package from a dehydrated publisher will be
3110N/A # installed dehydrated on the image.
3110N/A self.pkg("install -vvv dev2")
3110N/A self.file_doesnt_exist("dev/cfg/foo")
3110N/A self.file_doesnt_exist("dev/cfg/foo.hlink")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("dehydrate", exit=4)
3110N/A self.pkg("rehydrate")
3110N/A self.file_exists("dev/cfg/foo")
3110N/A self.file_exists("dev/cfg/foo.hlink")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that if we dehydrate a publisher without any packages,
3110N/A # installing packages for that publisher are dehydrated.
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("dehydrate -p test1 -p test2")
3110N/A self.pkg("install etc@1.0")
3110N/A self.file_doesnt_exist("etc/foo")
3110N/A self.file_doesnt_exist("etc/cfg/foo1")
3110N/A self.file_doesnt_exist("usr/bin/vi")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that if users adds a new publisher and install packages
3110N/A # from it, the package is installed normally.
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.pkg("set-publisher -g " + self.rurl4 + " test3")
3110N/A self.pkg("install mnt")
3110N/A self.file_exists("mnt/mm")
3110N/A self.file_exists("mnt/nn")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_05_pkg_update(self):
3110N/A """Test that pkg update will update packages dehydrated from
3110N/A dehydrated publishers and update packages normally from normal
3110N/A publishers."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A # Verify that a package that is dilvered by a dehydrated publisher
3110N/A # will be updated dehydrated on the image.
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("install dev@1.0 etc@1.0")
3110N/A self.file_doesnt_exist("dev/cfg/bar3")
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.file_doesnt_exist("dev/cfg/bar3")
3110N/A self.pkg("update dev")
3110N/A self.file_doesnt_exist("dev/cfg/bar3")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that a package that is not dilvered by a dehydrated
3110N/A # publisher will be updated normally.
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.pkg("update etc")
3110N/A self.file_exists("etc/foo")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that update without pargs will work too.
3110N/A self.pkg("update dev@1.0")
3110N/A self.pkg("update etc@1.0")
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.pkg("update")
3110N/A self.file_doesnt_exist("dev/cfg/bar3")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_exists("etc/foo")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_06_pkg_uninstall(self):
3110N/A """Test uninstall works fine."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A # Verify that if we uninstall all packages under dehydrated
3110N/A # publishers, no work to do in dehydrate and rehydrate, and
3110N/A # the dehydrated property remains.
3110N/A self.pkg("install dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.pkg("uninstall dev")
3110N/A self.pkg("dehydrate", exit=4)
3110N/A self.pkg("rehydrate", exit=4)
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that uninstalling some packages under dehydrated
3110N/A # publishers will not cause dehydrate to fail on other packages,
3110N/A # and the dehydrated property is deleted after rehydrate.
3110N/A self.pkg("unset-property dehydrated")
3110N/A self.pkg("install dev@1.0 dev2")
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.pkg("uninstall dev")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated ['test1']\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("dehydrate -p test1", exit=4)
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("property dehydrated")
3110N/A expected = \
3110N/A"""PROPERTY VALUE\ndehydrated []\n"""
3110N/A self.assertEqual(expected, self.output)
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that uninstalling some packages under a publisher
3110N/A # will not cause dehydrate to fail on another publisher.
3110N/A self.pkg("set-publisher -g " + self.rurl4 + " test3")
3110N/A self.pkg("install mnt")
3110N/A self.pkg("dehydrate -p test3")
3110N/A self.pkg("uninstall mnt")
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.pkg("rehydrate")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_07_pkg_verify(self):
3110N/A """Test that verify will only look at things that have not been
3110N/A dehydrated."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install dev@1.0")
3110N/A self.file_append("dev/cfg/bar", "junk")
3110N/A self.pkg("dehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_contains("dev/cfg/bar", "junk")
3110N/A self.pkg("verify -vvv")
3110N/A # dev/cfg/bar1 is dehydrated, so verify will not look at it
3339N/A self.assertTrue("dev/cfg/bar1" not in self.output)
3110N/A self.pkg("verify -v")
3110N/A self.output.index("editable file has been changed")
3110N/A
3110N/A def test_08_pkg_fix(self):
3110N/A """Test that fix will only fix things that have not been
3110N/A dehydrated."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A self.pkg("install dev@1.0")
3110N/A self.file_append("dev/cfg/bar", "junk")
3110N/A self.pkg("dehydrate")
3110N/A # dev/cfg/bar1 is dehydrated, dev/cfg/bar is not
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_exists("dev/cfg/bar")
3110N/A self.pkg("fix -vvv", exit=4)
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A # remove dev/cfg/bar to cause an error
3110N/A self.file_remove("dev/cfg/bar")
3110N/A self.pkg("fix")
3110N/A
3110N/A def test_09_pkg_revert(self):
3110N/A """Test that revert will only revert things that have not been
3110N/A dehydrated."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install dev@1.0")
3110N/A self.file_append("dev/cfg/bar", "junk")
3110N/A self.pkg("dehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_contains("dev/cfg/bar", "junk")
3110N/A # It will be treated as "not packaged" if revert by path-to-name.
3110N/A self.pkg("revert dev/cfg/bar1", exit=1)
3110N/A # Nothing to do if revert by tag-name.
3110N/A self.pkg("revert --tagged bob", exit=4)
3110N/A self.pkg("revert dev/cfg/bar")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_10_pkg_change_facet(self):
3110N/A """Test that change-facet for dehydrated publishers will be
3110N/A automatically dehydrated."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A # Test that change-facet uninstalls files on dehydrated
3110N/A # publishers.
3110N/A self.pkg("install dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.file_exists("dev/cfg/bar")
3110N/A self.pkg("change-facet facet.locale.fr=False")
3110N/A self.file_doesnt_exist("dev/cfg/bar")
3110N/A self.pkg("rehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that change-facet installs new files dehydrated on
3110N/A # dehydrated publishers.
3110N/A self.pkg("dehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.pkg("change-facet facet.locale.fr=True")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.pkg("rehydrate")
3110N/A self.file_exists("dev/cfg/bar1")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_11_pkg_change_variant(self):
3110N/A """Test that change-variant for dehydrated publishers will be
3110N/A automatically dehydrated."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A
3110N/A # Test that change-variant uninstalls files on dehydrated
3110N/A # publishers.
3110N/A self.pkg("install dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.file_exists("dev/cfg/bar")
3110N/A self.pkg("change-variant variant.opensolaris.zone=non-global")
3110N/A self.file_doesnt_exist("dev/cfg/bar")
3110N/A self.pkg("rehydrate")
3110N/A # Rehydrate will be restricted by variants.
3110N/A self.file_doesnt_exist("dev/cfg/bar")
3110N/A self.pkg("verify")
3110N/A
3110N/A # Verify that change-variant installs new files dehydrated on
3110N/A # dehydrated publishers.
3110N/A self.pkg("dehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.pkg("change-variant variant.opensolaris.zone=global")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.pkg("rehydrate")
3110N/A self.file_exists("dev/cfg/bar1")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_12_zone_files(self):
3110N/A """Test that zone configuration files 'index' and 'SYSdefault.xml'
3110N/A will not be removed in dehydrate."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.make_misc_files(["etc/zones/index", "etc/zones/SYSdefault.xml"])
3110N/A self.pkgsend_bulk(self.rurl1, self.zones)
3110N/A self.pkgsign_simple(self.rurl1, "zones")
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install zones dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.file_exists("etc/zones/index")
3110N/A self.file_exists("etc/zones/SYSdefault.xml")
3110N/A
3110N/A def test_13_existing_file(self):
3110N/A """Test that rehydrate will reinstall the file if it was created
3110N/A manually at the same path."""
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("install dev@1.0")
3110N/A self.pkg("dehydrate")
3110N/A self.file_doesnt_exist("dev/cfg/bar1")
3110N/A self.file_append("dev/cfg/bar1", "junk")
3110N/A self.file_exists("dev/cfg/bar1")
3110N/A self.pkg("rehydrate -vvv")
3110N/A self.file_doesnt_contain("dev/cfg/bar1", "junk")
3110N/A self.pkg("verify")
3110N/A
3110N/A def test_14_mediator(self):
3110N/A """Test that a warning emitted whenever dehydrated publishers
3110N/A exist and 'pkg mediator' or 'pkg set-mediator' is executed, and
3110N/A the correct mediation will be applied when the publishers are
3110N/A rehydrated."""
3110N/A
3110N/A def get_link_path(*parts):
3110N/A return os.path.join(self.img_path(), *parts)
3110N/A
3110N/A def assert_target(link, target):
3110N/A self.assertEqual(os.stat(link).st_ino,
3110N/A os.stat(target).st_ino)
3110N/A
3110N/A def assert_mediation_matches(expected, mediators=misc.EmptyI):
3158N/A self.pkg("mediator -H -F tsv {0}".format(" ".join(mediators)))
3110N/A self.assertEqualDiff(expected, self.output)
3110N/A
3110N/A vi_path = get_link_path("usr", "bin", "vi")
3110N/A dev_path = get_link_path("dev", "cfg", "bar2")
3110N/A etc_path = get_link_path("etc", "foo")
3110N/A
3110N/A self.image_create(self.rurl1)
3110N/A self.seed_ta_dir("ta3")
3110N/A self.pkg("set-property signature-policy require-signatures")
3110N/A self.pkg("set-publisher -g " + self.rurl2 + " test2")
3110N/A self.pkg("install dev@1.0 etc@1.0")
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tsystem\tdev\t
3110N/A""")
3110N/A
3110N/A warning = """\
3110N/AWARNING: pkg mediators may not be accurately shown when one or more publishers have been dehydrated. The correct mediation will be applied when the publishers are rehydrated.
3110N/A"""
3110N/A
3110N/A # If dehydrate all publishers that have the mediated hardlink
3110N/A # to remove it and its target file exists.
3110N/A self.pkg("dehydrate -p test1 -p test2")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.file_exists(dev_path)
3110N/A self.pkg("set-mediator -vvv -I dev vi")
3110N/A self.file_doesnt_exist(vi_path)
3339N/A self.assertTrue(warning in self.output, self.output)
3110N/A self.pkg("mediator")
3339N/A self.assertTrue(warning in self.output, self.output)
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test1 -p test2")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.pkg("unset-mediator -vvv vi")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tsystem\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A # If dehydrate all publishers that have the mediated hardlink
3110N/A # to remove it and its target file doesn't exist.
3110N/A self.pkg("dehydrate -p test1 -p test2")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("set-mediator -vvv -I etc vi")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, etc_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tetc\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test1 -p test2")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("unset-mediator -vvv vi")
3110N/A self.file_doesnt_exist(vi_path)
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tsystem\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A # If dehydrate only a publisher that has the mediated hardlink
3110N/A # but the other publisher still deliver it and its target file
3110N/A # exists.
3110N/A self.pkg("dehydrate -vvv -p test2")
3110N/A self.file_exists(vi_path)
3110N/A self.file_exists(dev_path)
3110N/A self.pkg("set-mediator -vvv -I dev vi")
3110N/A self.pkg("rehydrate -vvv")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test2")
3110N/A self.file_exists(vi_path)
3110N/A self.file_exists(dev_path)
3110N/A self.pkg("unset-mediator -vvv vi")
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tsystem\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.file_exists(vi_path)
3110N/A self.file_exists(dev_path)
3110N/A self.pkg("set-mediator -vvv -I dev vi")
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.file_exists(vi_path)
3110N/A self.file_exists(etc_path)
3110N/A self.pkg("set-mediator -vvv -I etc vi")
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, etc_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tetc\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A self.pkg("dehydrate -p test1")
3110N/A self.file_exists(vi_path)
3110N/A self.file_exists(etc_path)
3110N/A self.pkg("unset-mediator -vvv vi")
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, dev_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tsystem\tdev\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A # If dehydrate only a publisher that has the mediated hardlink
3110N/A # but the other publisher still deliver it and its target file
3110N/A # doesn't exist.
3110N/A self.pkg("dehydrate -p test2")
3110N/A self.file_exists(vi_path)
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("set-mediator -vvv -I etc vi")
3110N/A self.file_doesnt_exist(etc_path)
3110N/A self.pkg("rehydrate")
3110N/A assert_target(vi_path, etc_path)
3110N/A assert_mediation_matches("""\
3110N/Avi\tsystem\t\tlocal\tetc\t
3110N/A""")
3110N/A self.pkg("verify")
3110N/A
3110N/A
3110N/Aif __name__ == "__main__":
3110N/A unittest.main()
3110N/A