package-installs: provide for skip from env var
Provide a "when" option that provides for not installing packages based on a = or != match on an environment variable. Unit tests are added. Change-Id: Ifa824dccaff69fd447f45d54cb4a3083bcabdd86changes/19/619119/13
parent
b203e2ad19
commit
c52c383f1b
@ -0,0 +1,140 @@
|
||||
# Copyright 2018 Red Hat, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import collections
|
||||
import functools
|
||||
import imp
|
||||
import mock
|
||||
import os
|
||||
|
||||
from oslotest import base
|
||||
from testtools.matchers import Mismatch
|
||||
|
||||
installs_squash_src = (os.path.dirname(os.path.realpath(__file__)) +
|
||||
'/../bin/package-installs-squash')
|
||||
installs_squash = imp.load_source('installs_squash', installs_squash_src)
|
||||
|
||||
|
||||
class IsMatchingInstallList(object):
|
||||
|
||||
def __init__(self, expected):
|
||||
self.expected = expected
|
||||
|
||||
def match(self, actual):
|
||||
for phase, ops in self.expected.items():
|
||||
if phase not in actual:
|
||||
# missing the phase
|
||||
return Mismatch(
|
||||
"Phase %d does not exist in %s" % (phase, actual))
|
||||
for op, pkgs in ops.items():
|
||||
if op not in actual[phase]:
|
||||
# missing op (install/uninstall)
|
||||
return Mismatch(
|
||||
"Operation %s does not exist in %s" % (op, ops))
|
||||
# on py2 these can be out of order, we just want a match
|
||||
expected_phase_ops = sorted(self.expected[phase][op])
|
||||
actual_phase_ops = sorted(actual[phase][op])
|
||||
if expected_phase_ops != actual_phase_ops:
|
||||
return Mismatch(
|
||||
"Operation list %s does not match expected %s" %
|
||||
(actual[phase][op], self.expected[phase][op]))
|
||||
|
||||
|
||||
class TestPackageInstall(base.BaseTestCase):
|
||||
def setUp(self):
|
||||
super(TestPackageInstall, self).setUp()
|
||||
self.final_dict = collections.defaultdict(
|
||||
functools.partial(collections.defaultdict, list))
|
||||
|
||||
def test_simple(self):
|
||||
'''Test a basic package install'''
|
||||
objs = {
|
||||
'test_package': ''
|
||||
}
|
||||
|
||||
result = installs_squash.collect_data(
|
||||
self.final_dict, objs, 'test_element')
|
||||
|
||||
expected = {
|
||||
'install.d': {
|
||||
'install': [('test_package', 'test_element')]
|
||||
}
|
||||
}
|
||||
|
||||
self.assertThat(result, IsMatchingInstallList(expected))
|
||||
|
||||
@mock.patch.object(os, 'environ', dict(ARCH='arm64', **os.environ))
|
||||
def test_arch(self):
|
||||
'''Exercise the arch and not-arch flags'''
|
||||
objs = {
|
||||
'test_package': '',
|
||||
'test_arm64_package': {
|
||||
'arch': 'arm64'
|
||||
},
|
||||
'do_not_install': {
|
||||
'not-arch': 'arm64'
|
||||
}
|
||||
}
|
||||
|
||||
result = installs_squash.collect_data(
|
||||
self.final_dict, objs, 'test_element')
|
||||
|
||||
expected = {
|
||||
'install.d': {
|
||||
'install': [('test_package', 'test_element'),
|
||||
('test_arm64_package', 'test_element')]
|
||||
}
|
||||
}
|
||||
|
||||
self.assertThat(result, IsMatchingInstallList(expected))
|
||||
|
||||
@mock.patch.object(os, 'environ', dict(DIB_FEATURE='1', **os.environ))
|
||||
def test_skip_when(self):
|
||||
'''Exercise the when flag'''
|
||||
objs = {
|
||||
'skipped_package': {
|
||||
'when': 'DIB_FEATURE=0'
|
||||
},
|
||||
'not_skipped_package': {
|
||||
'when': 'DIB_FEATURE=1'
|
||||
},
|
||||
'not_equal_package': {
|
||||
'when': 'DIB_FEATURE!=0'
|
||||
},
|
||||
'not_equal_skipped_package': {
|
||||
'when': 'DIB_FEATURE!=1'
|
||||
},
|
||||
}
|
||||
|
||||
result = installs_squash.collect_data(
|
||||
self.final_dict, objs, 'test_element')
|
||||
|
||||
expected = {
|
||||
'install.d': {
|
||||
'install': [('not_skipped_package', 'test_element'),
|
||||
('not_equal_package', 'test_element')]
|
||||
}
|
||||
}
|
||||
|
||||
self.assertThat(result, IsMatchingInstallList(expected))
|
||||
|
||||
def test_skip_no_var(self):
|
||||
'''Exercise the skip_when missing variable failure case'''
|
||||
objs = {
|
||||
'package': {
|
||||
'when': 'MISSING_VAR=1'
|
||||
},
|
||||
}
|
||||
|
||||
self.assertRaises(RuntimeError, installs_squash.collect_data,
|
||||
self.final_dict, objs, 'test_element')
|
@ -0,0 +1,7 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
The `package-installs` element now supports skipping installation
|
||||
of packages based on an environment variable specified in the
|
||||
config file. See the `package-installs` element documentation for
|
||||
full details.
|
Loading…
Reference in New Issue