def test_do_openstack_upgrade_kilo_notleader(self, git_requested,
                                              stamp_neutron_db,
                                              migrate_neutron_db,
                                              gsrc):
     git_requested.return_value = False
     self.is_elected_leader.return_value = False
     self.os_release.return_value = 'juno'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:trusty-kilo')
     gsrc.return_value = 'kilo'
     self.get_os_codename_install_source.return_value = 'kilo'
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.os_release.assert_called_with('neutron-common')
     self.assertTrue(self.log.called)
     self.configure_installation_source.assert_called_with(
         'cloud:trusty-kilo'
     )
     self.apt_update.assert_called_with(fatal=True)
     dpkg_opts = [
         '--option', 'Dpkg::Options::=--force-confnew',
         '--option', 'Dpkg::Options::=--force-confdef',
     ]
     self.apt_upgrade.assert_called_with(options=dpkg_opts,
                                         fatal=True,
                                         dist=True)
     pkgs = nutils.determine_packages()
     pkgs.sort()
     self.apt_install.assert_called_with(packages=pkgs,
                                         options=dpkg_opts,
                                         fatal=True)
     configs.set_release.assert_called_with(openstack_release='kilo')
     self.assertFalse(stamp_neutron_db.called)
     self.assertFalse(migrate_neutron_db.called)
 def test_do_openstack_upgrade(self):
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:trusty-juno')
     self.os_release.side_effect = 'icehouse'
     self.get_os_codename_install_source.return_value = 'juno'
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.log.assert_called()
     self.configure_installation_source.assert_called_with(
         'cloud:trusty-juno')
     self.apt_update.assert_called_with(fatal=True)
     dpkg_opts = [
         '--option',
         'Dpkg::Options::=--force-confnew',
         '--option',
         'Dpkg::Options::=--force-confdef',
     ]
     self.apt_upgrade.assert_called_with(options=dpkg_opts,
                                         fatal=True,
                                         dist=True)
     pkgs = nutils.BASE_PACKAGES
     pkgs.sort()
     self.apt_install.assert_called_with(packages=pkgs,
                                         options=dpkg_opts,
                                         fatal=True)
     configs.set_release.assert_called_with(openstack_release='juno')
 def test_do_openstack_upgrade_notleader(self, stamp_neutron_db,
                                         migrate_neutron_db, gsrc):
     self.is_elected_leader.return_value = False
     self.os_release.return_value = 'icehouse'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:trusty-juno')
     gsrc.return_value = 'juno'
     self.get_os_codename_install_source.return_value = 'juno'
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.os_release.assert_called_with('neutron-common')
     self.assertTrue(self.log.called)
     self.configure_installation_source.assert_called_with(
         'cloud:trusty-juno')
     self.apt_update.assert_called_with(fatal=True)
     dpkg_opts = [
         '--option',
         'Dpkg::Options::=--force-confnew',
         '--option',
         'Dpkg::Options::=--force-confdef',
     ]
     self.apt_upgrade.assert_called_with(options=dpkg_opts,
                                         fatal=True,
                                         dist=True)
     pkgs = nutils.determine_packages()
     pkgs.sort()
     self.apt_install.assert_called_with(packages=pkgs,
                                         options=dpkg_opts,
                                         fatal=True)
     configs.set_release.assert_called_with(openstack_release='juno')
     self.assertFalse(stamp_neutron_db.called)
     self.assertFalse(migrate_neutron_db.called)
def config_changed():
    # if we are paused, delay doing any config changed hooks.
    # It is forced on the resume.
    if is_unit_paused_set():
        log("Unit is pause or upgrading. Skipping config_changed", "WARN")
        return

    # If neutron is ready to be queried then check for incompatability between
    # existing neutron objects and charm settings
    if neutron_ready():
        if l3ha_router_present() and not get_l3ha():
            e = ('Cannot disable Router HA while ha enabled routers exist.'
                 ' Please remove any ha routers')
            status_set('blocked', e)
            raise Exception(e)
        if dvr_router_present() and not get_dvr():
            e = ('Cannot disable dvr while dvr enabled routers exist. Please'
                 ' remove any distributed routers')
            log(e, level=ERROR)
            status_set('blocked', e)
            raise Exception(e)
    if config('prefer-ipv6'):
        status_set('maintenance', 'configuring ipv6')
        setup_ipv6()
        sync_db_with_multi_ipv6_addresses(config('database'),
                                          config('database-user'))

    global CONFIGS
    if not config('action-managed-upgrade'):
        if openstack_upgrade_available('neutron-common'):
            status_set('maintenance', 'Running openstack upgrade')
            do_openstack_upgrade(CONFIGS)

    additional_install_locations(
        config('neutron-plugin'),
        config('openstack-origin')
    )
    status_set('maintenance', 'Installing apt packages')
    apt_install(filter_installed_packages(
                determine_packages(config('openstack-origin'))),
                fatal=True)
    packages_removed = remove_old_packages()
    configure_https()
    update_nrpe_config()
    CONFIGS.write_all()
    if packages_removed and not is_unit_paused_set():
        log("Package purge detected, restarting services", "INFO")
        for s in services():
            service_restart(s)
    for r_id in relation_ids('neutron-api'):
        neutron_api_relation_joined(rid=r_id)
    for r_id in relation_ids('neutron-plugin-api'):
        neutron_plugin_api_relation_joined(rid=r_id)
    for r_id in relation_ids('amqp'):
        amqp_joined(relation_id=r_id)
    for r_id in relation_ids('identity-service'):
        identity_joined(rid=r_id)
    for r_id in relation_ids('ha'):
        ha_joined(relation_id=r_id)
    [cluster_joined(rid) for rid in relation_ids('cluster')]
def config_changed():
    # If neutron is ready to be queried then check for incompatability between
    # existing neutron objects and charm settings
    codename = get_os_codename_install_source(config('openstack-origin'))
    if codename >= 'kilo':
        branch = "stable/%s" % codename
        pip_install("git+https://github.com/openstack/networking-hyperv.git@%s" % branch)

    if neutron_ready():
        if l3ha_router_present() and not get_l3ha():
            e = ('Cannot disable Router HA while ha enabled routers exist.'
                 ' Please remove any ha routers')
            status_set('blocked', e)
            raise Exception(e)
        if dvr_router_present() and not get_dvr():
            e = ('Cannot disable dvr while dvr enabled routers exist. Please'
                 ' remove any distributed routers')
            log(e, level=ERROR)
            status_set('blocked', e)
            raise Exception(e)
    if config('prefer-ipv6'):
        status_set('maintenance', 'configuring ipv6')
        setup_ipv6()
        sync_db_with_multi_ipv6_addresses(config('database'),
                                          config('database-user'))

    global CONFIGS
    if git_install_requested():
        if config_value_changed('openstack-origin-git'):
            status_set('maintenance', 'Running Git install')
            git_install(config('openstack-origin-git'))
    elif not config('action-managed-upgrade'):
        if openstack_upgrade_available('neutron-common'):
            status_set('maintenance', 'Running openstack upgrade')
            do_openstack_upgrade(CONFIGS)

    additional_install_locations(
        config('neutron-plugin'),
        config('openstack-origin')
    )
    status_set('maintenance', 'Installing apt packages')
    apt_install(filter_installed_packages(
                determine_packages(config('openstack-origin'))),
                fatal=True)
    configure_https()
    update_nrpe_config()
    CONFIGS.write_all()
    for r_id in relation_ids('neutron-api'):
        neutron_api_relation_joined(rid=r_id)
    for r_id in relation_ids('neutron-plugin-api'):
        neutron_plugin_api_relation_joined(rid=r_id)
    for r_id in relation_ids('amqp'):
        amqp_joined(relation_id=r_id)
    for r_id in relation_ids('identity-service'):
        identity_joined(rid=r_id)
    for rid in relation_ids('zeromq-configuration'):
        zeromq_configuration_relation_joined(rid)
    [cluster_joined(rid) for rid in relation_ids('cluster')]
 def test_do_openstack_upgrade_liberty(self, stamp_neutron_db,
                                       migrate_neutron_db, gsrc):
     self.is_elected_leader.return_value = True
     self.os_release.return_value = 'liberty'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:trusty-mitaka')
     gsrc.return_value = 'mitaka'
     self.get_os_codename_install_source.return_value = 'mitaka'
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.assertFalse(stamp_neutron_db.called)
def config_changed():
    # If neutron is ready to be queried then check for incompatability between
    # existing neutron objects and charm settings
    if neutron_ready():
        if l3ha_router_present() and not get_l3ha():
            e = ('Cannot disable Router HA while ha enabled routers exist.'
                 ' Please remove any ha routers')
            status_set('blocked', e)
            raise Exception(e)
        if dvr_router_present() and not get_dvr():
            e = ('Cannot disable dvr while dvr enabled routers exist. Please'
                 ' remove any distributed routers')
            log(e, level=ERROR)
            status_set('blocked', e)
            raise Exception(e)
    if config('prefer-ipv6'):
        status_set('maintenance', 'configuring ipv6')
        setup_ipv6()
        sync_db_with_multi_ipv6_addresses(config('database'),
                                          config('database-user'))

    global CONFIGS
    if git_install_requested():
        if config_value_changed('openstack-origin-git'):
            status_set('maintenance', 'Running Git install')
            git_install(config('openstack-origin-git'))
    elif not config('action-managed-upgrade'):
        if openstack_upgrade_available('neutron-common'):
            status_set('maintenance', 'Running openstack upgrade')
            do_openstack_upgrade(CONFIGS)

    additional_install_locations(
        config('neutron-plugin'),
        config('openstack-origin')
    )
    status_set('maintenance', 'Installing apt packages')
    apt_install(filter_installed_packages(
                determine_packages(config('openstack-origin'))),
                fatal=True)
    configure_https()
    update_nrpe_config()
    CONFIGS.write_all()
    for r_id in relation_ids('neutron-api'):
        neutron_api_relation_joined(rid=r_id)
    for r_id in relation_ids('neutron-plugin-api'):
        neutron_plugin_api_relation_joined(rid=r_id)
    for r_id in relation_ids('amqp'):
        amqp_joined(relation_id=r_id)
    for r_id in relation_ids('identity-service'):
        identity_joined(rid=r_id)
    for rid in relation_ids('zeromq-configuration'):
        zeromq_configuration_relation_joined(rid)
    [cluster_joined(rid) for rid in relation_ids('cluster')]
 def test_do_openstack_upgrade_liberty(self,
                                       stamp_neutron_db, migrate_neutron_db,
                                       gsrc):
     self.is_elected_leader.return_value = True
     self.os_release.return_value = 'liberty'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:trusty-mitaka')
     gsrc.return_value = 'mitaka'
     self.get_os_codename_install_source.return_value = 'mitaka'
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.assertFalse(stamp_neutron_db.called)
 def test_do_openstack_upgrade_rocky(self, stamp_neutron_db,
                                     migrate_neutron_db, gsrc):
     self.is_elected_leader.return_value = True
     self.os_release.return_value = 'rocky'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:bionic-rocky')
     gsrc.return_value = 'rocky'
     self.get_os_codename_install_source.return_value = 'rocky'
     self.filter_missing_packages.return_value = ['python-neutron']
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.apt_purge.assert_called_with(['python-neutron'], fatal=True)
     self.apt_autoremove.assert_called_with(purge=True, fatal=True)
     self.filter_missing_packages.assert_called_with(nutils.PURGE_PACKAGES)
     self.assertFalse(stamp_neutron_db.called)
 def test_do_openstack_upgrade_train(self, stamp_neutron_db,
                                     migrate_neutron_db, gsrc,
                                     fwaas_migrate_v1_to_v2,
                                     mock_manage_plugin):
     self.is_elected_leader.return_value = True
     self.os_release.return_value = 'train'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:bionic-train')
     gsrc.return_value = 'train'
     self.get_os_codename_install_source.return_value = 'train'
     self.filter_missing_packages.return_value = ['python-neutron']
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.apt_purge.assert_called_with(['python-neutron'], fatal=True)
     self.apt_autoremove.assert_called_with(purge=True, fatal=True)
     self.filter_missing_packages.assert_called_with(
         nutils.PURGE_PACKAGES + nutils.PURGE_EXTRA_PACKAGES_ON_TRAIN)
     self.assertFalse(stamp_neutron_db.called)
     fwaas_migrate_v1_to_v2.assert_called_once_with()
     configs.write_all.assert_called_once_with()
 def test_do_openstack_upgrade_stein(self,
                                     stamp_neutron_db,
                                     migrate_neutron_db,
                                     gsrc,
                                     fwaas_migrate_v1_to_v2):
     self.is_elected_leader.return_value = True
     self.os_release.return_value = 'stein'
     self.config.side_effect = self.test_config.get
     self.test_config.set('openstack-origin', 'cloud:bionic-stein')
     gsrc.return_value = 'rocky'
     self.get_os_codename_install_source.return_value = 'stein'
     self.filter_missing_packages.return_value = ['python-neutron']
     configs = MagicMock()
     nutils.do_openstack_upgrade(configs)
     self.apt_purge.assert_called_with(['python-neutron'], fatal=True)
     self.apt_autoremove.assert_called_with(purge=True, fatal=True)
     self.filter_missing_packages.assert_called_with(nutils.PURGE_PACKAGES)
     self.assertFalse(stamp_neutron_db.called)
     fwaas_migrate_v1_to_v2.assert_called_once_with()
     configs.write_all.assert_called_once_with()
def config_changed():
    apt_install(filter_installed_packages(determine_packages()), fatal=True)
    if config('prefer-ipv6'):
        setup_ipv6()
        sync_db_with_multi_ipv6_addresses(config('database'),
                                          config('database-user'))

    global CONFIGS
    if openstack_upgrade_available('neutron-server'):
        do_openstack_upgrade(CONFIGS)
    configure_https()
    update_nrpe_config()
    CONFIGS.write_all()
    for r_id in relation_ids('neutron-api'):
        neutron_api_relation_joined(rid=r_id)
    for r_id in relation_ids('neutron-plugin-api'):
        neutron_plugin_api_relation_joined(rid=r_id)
    for r_id in relation_ids('amqp'):
        amqp_joined(relation_id=r_id)
    for r_id in relation_ids('identity-service'):
        identity_joined(rid=r_id)
    [cluster_joined(rid) for rid in relation_ids('cluster')]