示例#1
0
def main():
    logger = logging.getLogger('argo-poem-packages')
    logger.setLevel(logging.INFO)

    # setting up logging to file
    logfile = logging.FileHandler('/var/log/messages')
    logfile.setLevel(logging.INFO)
    logfile.setFormatter(
        logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s'))

    # add the handler to the root logger
    logger.addHandler(logfile)

    try:
        subprocess.call(['yum', 'clean', 'all'])

        config = Config()
        token = config.get_token()
        hostname = config.get_hostname()
        profiles = config.get_profiles()

        logger.info('Sending request for profile(s): ' + ', '.join(profiles))
        data = get_repo_data(build_api_url(hostname), token, profiles)

        if not data:
            logger.warning('No data for given metric profile(s): ' +
                           ', '.join(profiles))
            sys.exit(2)

        else:
            logger.info('Creating YUM repo files...')
            create_yum_repo_file(data)

            pkg = Packages(data)

            installed, not_installed, downgraded, not_downgraded = \
                pkg.install_packages()

            warn_msg = []
            info_msg = []
            if pkg.get_packages_not_found():
                warn_msg.append('Packages not found: ' +
                                ', '.join(pkg.get_packages_not_found()))

            if installed:
                new_installed = \
                    pkg.get_packages_installed_with_versions_as_requested(
                        installed
                    )

                if new_installed:
                    info_msg.append('Packages installed: ' +
                                    ', '.join(new_installed))

                installed_diff = \
                    pkg.get_packages_installed_with_different_version()

                if installed_diff:
                    info_msg.append(
                        'Packages installed with different version: ' +
                        ', '.join(installed_diff))

            if not_installed:
                warn_msg.append('Packages not installed: ' +
                                ', '.join(not_installed))

            if downgraded:
                info_msg.append('Packages downgraded: ' +
                                ', '.join(downgraded))

            if not_downgraded:
                warn_msg.append('Packages not downgraded: ' +
                                ', '.join(not_downgraded))

            if info_msg:
                logger.info('; '.join(info_msg))

            if warn_msg:
                logger.warning('; '.join(warn_msg))
                sys.exit(1)

            else:
                logger.info('ok!')
                sys.exit(0)

    except requests.exceptions.ConnectionError as err:
        logger.error(err)
        sys.exit(2)

    except requests.exceptions.RequestException as err:
        logger.error(err)
        sys.exit(2)

    except ConfigParser.ParsingError as err:
        logger.error(err)
        sys.exit(2)

    except ConfigParser.NoSectionError as err:
        logger.error(err)
        sys.exit(2)

    except ConfigParser.NoOptionError as err:
        logger.error(err)
        sys.exit(2)
class PackageTests(unittest.TestCase):
    def setUp(self):
        self.pkgs = Packages(data)

    def test_get_package_list(self):
        self.assertEqual(self.pkgs.list_of_packages(),
                         [('nordugrid-arc-nagios-plugins', ),
                          ('nagios-plugins-fedcloud', '0.5.0'),
                          ('nagios-plugins-igtf', '1.4.0'),
                          ('nagios-plugins-globus', '0.1.5')])

    @mock.patch('yum.YumBase.pkgSack')
    @mock.patch('yum.YumBase.rpmdb')
    def test_get_packages(self, mock_yumbase1, mock_yumbase2):
        mock1 = mock.Mock(version='0.5.0')
        mock2 = mock.Mock(version='0.4.0')
        mock3 = mock.Mock(version='1.5.0')
        mock4 = mock.Mock(version='1.4.0')
        mock5 = mock.Mock(version='0.1.5')
        mock6 = mock.Mock(version='2.0.0')
        mock1.name = 'nagios-plugins-fedcloud'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock4.name = 'nagios-plugins-igtf'
        mock5.name = 'nagios-plugins-globus'
        mock6.name = 'nordugrid-arc-nagios-plugins'
        mock_yumbase1.returnPackages.return_value = [mock2, mock3]
        mock_yumbase2.returnPackages.return_value = [
            mock1, mock2, mock3, mock4, mock5, mock6
        ]

        install, downgrade = self.pkgs.get_packages()

        self.assertEqual(install, [
            'nordugrid-arc-nagios-plugins', 'nagios-plugins-fedcloud-0.5.0',
            'nagios-plugins-globus-0.1.5'
        ])
        self.assertEqual(downgrade, ['nagios-plugins-igtf-1.4.0'])

    @mock.patch('yum.YumBase.pkgSack')
    @mock.patch('yum.YumBase.rpmdb')
    def test_get_packages_if_installed_and_wrong_version_available(
            self, mock_yumbase1, mock_yumbase2):
        mock1 = mock.Mock(version='0.5.0')
        mock2 = mock.Mock(version='0.4.0')
        mock3 = mock.Mock(version='1.5.0')
        mock4 = mock.Mock(version='1.4.0')
        mock5 = mock.Mock(version='0.1.5')
        mock6 = mock.Mock(version='2.0.1')
        mock7 = mock.Mock(version='1.9.0')
        mock1.name = 'nagios-plugins-fedcloud'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock4.name = 'nagios-plugins-igtf'
        mock5.name = 'nagios-plugins-globus'
        mock6.name = 'nordugrid-arc-nagios-plugins'
        mock7.name = 'nordugrid-arc-nagios-plugins'
        mock_yumbase1.returnPackages.return_value = [mock2, mock3, mock7]
        mock_yumbase2.returnPackages.return_value = [
            mock1, mock2, mock3, mock4, mock5, mock6
        ]

        install, downgrade = self.pkgs.get_packages()

        self.assertEqual(
            install,
            ['nagios-plugins-fedcloud-0.5.0', 'nagios-plugins-globus-0.1.5'])
        self.assertEqual(downgrade, ['nagios-plugins-igtf-1.4.0'])

    @mock.patch('yum.YumBase.pkgSack')
    def test_exact_packages_not_found(self, mock_yumbase):
        mock1 = mock.Mock(version='2.0.0')
        mock2 = mock.Mock(version='0.6.0')
        mock3 = mock.Mock(version='1.4.0')
        mock1.name = 'nordugrid-arc-nagios-plugins'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2, mock3]

        self.assertEqual(self.pkgs.exact_packages_not_found(),
                         [('nagios-plugins-fedcloud', '0.5.0'),
                          ('nagios-plugins-globus', '0.1.5')])

    @mock.patch('yum.YumBase.pkgSack')
    def test_packages_not_found(self, mock_yumbase):
        mock1 = mock.Mock(version='2.0.0')
        mock2 = mock.Mock(version='0.6.0')
        mock3 = mock.Mock(version='1.4.0')
        mock1.name = 'nordugrid-arc-nagios-plugins'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2, mock3]

        self.assertEqual(self.pkgs.packages_not_found(),
                         [('nagios-plugins-globus', '0.1.5')])

    @mock.patch('yum.YumBase.pkgSack')
    def test_get_packages_not_found(self, mock_yumbase):
        mock1 = mock.Mock(version='0.6.0')
        mock2 = mock.Mock(version='1.4.0')
        mock1.name = 'nagios-plugins-fedcloud'
        mock2.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2]

        self.assertEqual(
            self.pkgs.get_packages_not_found(),
            ['nordugrid-arc-nagios-plugins', 'nagios-plugins-globus-0.1.5'])

    @mock.patch('yum.YumBase.pkgSack')
    def test_packages_found_with_different_version(self, mock_yumbase):
        mock1 = mock.Mock(version='2.0.0')
        mock2 = mock.Mock(version='0.5.0')
        mock3 = mock.Mock(version='1.5.0')
        mock1.name = 'nordugrid-arc-nagios-plugins'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2, mock3]

        self.assertEqual(self.pkgs.packages_found_with_different_version(),
                         [('nagios-plugins-igtf', '1.5.0')])

    @mock.patch('yum.YumBase.pkgSack')
    def test_get_packages_installed_with_different_version(self, mock_yumbase):
        mock1 = mock.Mock(version='2.0.0')
        mock2 = mock.Mock(version='0.5.0')
        mock3 = mock.Mock(version='1.5.0')
        mock1.name = 'nordugrid-arc-nagios-plugins'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2, mock3]

        self.assertEqual(
            self.pkgs.get_packages_installed_with_different_version(),
            ['nagios-plugins-igtf-1.4.0 -> nagios-plugins-igtf-1.5.0'])

    @mock.patch('yum.YumBase.pkgSack')
    def test_get_packages_installed_with_version_as_requested(
            self, mock_yumbase):
        mock1 = mock.Mock(version='2.0.0')
        mock2 = mock.Mock(version='0.5.0')
        mock3 = mock.Mock(version='1.5.0')
        mock1.name = 'nordugrid-arc-nagios-plugins'
        mock2.name = 'nagios-plugins-fedcloud'
        mock3.name = 'nagios-plugins-igtf'
        mock_yumbase.returnPackages.return_value = [mock1, mock2, mock3]

        self.assertEqual(
            self.pkgs.get_packages_installed_with_versions_as_requested([
                'nordugrid-arc-nagios-plugins',
                'nagios-plugins-fedcloud-0.5.0', 'nagios-plugins-igtf'
            ]),
            ['nordugrid-arc-nagios-plugins', 'nagios-plugins-fedcloud-0.5.0'])