def test_update_status_update_already_completed(self): c1 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.0-111.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.1-222-g.bbb"}, ), ) notification1 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() # report again, but with no change ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.1-222-g.bbb"}, ), ) notification2 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() self.assertEqual( notification2.render(), "MAAS has been updated to version 3.0.1.", ) self.assertEqual( notification2.context, { "status": "completed", "version": "3.0.1" }, ) self.assertEqual(notification1.id, notification2.id)
def test_update_return_earliest_reported(self): c1 = factory.make_RackController() c2 = factory.make_RackController() c3 = factory.make_RackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "2.9.0-001-g.zzz"}, update={"version": "3.0.0~alpha1-111-g.aaa"}, ), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo( current={"version": "2.9.0-001-g.zzz"}, update={"version": "3.0.0-333-g.ccc"}, ), ) ControllerInfo.objects.set_versions_info( c3, DebVersionsInfo( current={"version": "2.9.0-001-g.zzz"}, update={"version": "3.0.0-333-g.ccc"}, ), ) target_version = get_target_version() self.assertEqual( target_version.version, MAASVersion.from_string("3.0.0-333-g.ccc"), ) self.assertEqual( target_version.first_reported, c2.info.update_first_reported, )
def test_set_versions_update_first_reported_update_same_update_different_install_type( self, ): controller = factory.make_RackController() versions = DebVersionsInfo( current={ "version": "3.0.0~alpha1-111-g.deadbeef", "origin": "http://archive.ubuntu.com/ focal/main", }, update={ "version": "3.0.0~alpha2-222-g.cafecafe", "origin": "http://archive.ubuntu.com/ focal/main", }, ) ControllerInfo.objects.set_versions_info(controller, versions) update_first_reported = controller.controllerinfo.update_first_reported versions = SnapVersionsInfo( current={ "revision": "1234", "version": "3.0.0~alpha1-111-g.deadbeef", }, update={ "revision": "5678", "version": "3.0.0~alpha2-222-g.cafecafe", }, ) ControllerInfo.objects.set_versions_info(controller, versions) controller_info = reload_object(controller).controllerinfo self.assertGreater(controller_info.update_first_reported, update_first_reported)
def test_set_versions_info_deb(self): controller = factory.make_RackController() versions = DebVersionsInfo( current={ "version": "3.0.0~alpha1-111-g.deadbeef", "origin": "http://archive.ubuntu.com/ focal/main", }, update={ "version": "3.0.0~alpha2-222-g.cafecafe", "origin": "http://mymirror.example.com/ focal/main", }, ) ControllerInfo.objects.set_versions_info(controller, versions) controller_info = controller.controllerinfo self.assertEqual(controller_info.install_type, CONTROLLER_INSTALL_TYPE.DEB) self.assertEqual(controller_info.version, "3.0.0~alpha1-111-g.deadbeef") self.assertEqual(controller_info.update_version, "3.0.0~alpha2-222-g.cafecafe") # the origin for the update is used self.assertEqual( controller_info.update_origin, "http://mymirror.example.com/ focal/main", ) self.assertEqual(controller_info.snap_revision, "") self.assertEqual(controller_info.snap_update_revision, "") self.assertEqual(controller_info.snap_cohort, "") self.assertIsNotNone(controller_info.update_first_reported)
def test_dehydrate_with_versions_deb(self): owner = factory.make_admin() handler = ControllerHandler(owner, {}, None) rack = factory.make_RackController() versions = DebVersionsInfo( current={ "version": "3.0.0~alpha1-111-g.deadbeef", "origin": "http://archive.ubuntu.com main/focal", }, update={ "version": "3.0.0~alpha2-222-g.cafecafe", "origin": "http://archive.ubuntu.com main/focal", }, ) ControllerInfo.objects.set_versions_info(rack, versions) result = handler.list({}) self.assertEqual( result[0]["versions"], { "install_type": "deb", "current": { "version": "3.0.0~alpha1-111-g.deadbeef", }, "update": { "version": "3.0.0~alpha2-222-g.cafecafe", }, "origin": "http://archive.ubuntu.com main/focal", "up_to_date": False, "issues": [], }, )
def test_snap_channel_ignores_deb(self): c1 = factory.make_RackController() c2 = factory.make_RackController() ControllerInfo.objects.set_versions_info( c1, SnapVersionsInfo( current={ "version": "3.0.0-111-g.aaa", "revision": "1234" }, channel={ "track": "3.0", "risk": "stable" }, ), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo( current={ "version": "3.0.0~beta1-001-g.bbb", "origin": "http://archive.ubuntu.com/ focal/main", }, update={ "version": "3.0.0-111-g.aaa", "origin": "http://archive.ubuntu.com/ focal/main", }, ), ) target_version = get_target_version() self.assertEqual( target_version.snap_channel, SnapChannel("3.0", "stable"), )
def test_different_versions(self): c1 = factory.make_RegionRackController() c2 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.0-111-g.aaa"}, ), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo(current={"version": "3.0.1-222-g.bbb"}, ), ) notification = Notification.objects.filter( ident=UPGRADE_ISSUE_NOTIFICATION_IDENT).first() self.assertIn( "Controllers have different versions.", notification.message, )
def test_update_older_than_installed(self): c1 = factory.make_RackController() c2 = factory.make_RackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.0-111-g.aaa"}, ), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo( current={"version": "2.9.0-001-g.zzz"}, update={"version": "2.9.1-010-g.bbb"}, ), ) target_version = get_target_version() self.assertEqual(target_version.version, MAASVersion.from_string("3.0.0-111-g.aaa"))
def test_same_upgrade(self): c1 = factory.make_RegionRackController() c2 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.0-111-g.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo( current={"version": "3.0.0-111-g.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) self.assertFalse( Notification.objects.filter( ident=UPGRADE_ISSUE_NOTIFICATION_IDENT).exists())
def test_snap_channel_from_version(self): c1 = factory.make_RackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.0~rc1-111-g.aaa"}, ), ) target_version = get_target_version() self.assertEqual( target_version.snap_channel, SnapChannel("3.0", "candidate"), )
def test_return_highest_version(self): c1 = factory.make_RackController() c2 = factory.make_RackController() c3 = factory.make_RackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.0~alpha1-111-g.aaa"}), ) ControllerInfo.objects.set_versions_info( c2, DebVersionsInfo(current={"version": "3.0.0~beta1-222-g.bbb"}), ) ControllerInfo.objects.set_versions_info( c3, DebVersionsInfo(current={"version": "3.0.0-333-g.ccc"}), ) target_version = get_target_version() self.assertEqual( target_version.version, MAASVersion.from_string("3.0.0-333-g.ccc"), )
def test_set_versions_info_deb_ppa(self): controller = factory.make_RackController() versions = DebVersionsInfo(current={ "version": "3.0.0~alpha1-111-g.deadbeef", "origin": "http://ppa.launchpad.net/maas/3.0/ubuntu/ focal/main", }, ) ControllerInfo.objects.set_versions_info(controller, versions) self.assertEqual( controller.controllerinfo.update_origin, "ppa:maas/3.0", )
def test_region_installed(self): apt_pkg = MockAptPkg() current = apt_pkg._make_package_version("3.0.0~alpha1-111-g.deadbeef") apt_pkg._add_package("maas-region-api", current=current) self.assertEqual( get_deb_versions_info(apt_pkg=apt_pkg), DebVersionsInfo( current=DebVersion( version="3.0.0~alpha1-111-g.deadbeef", origin="" ), update=None, ), )
def test_update_status_new_update_already_completed(self): c1 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.0-111.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.1-222-g.bbb"}, ), ) notification1 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() # a new update is available ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.1-222-g.bbb"}, update={"version": "3.0.2-333-g.ccc"}, ), ) notification2 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() self.assertEqual( notification2.render(), "MAAS 3.0.2 is available, controllers will upgrade soon.", ) self.assertEqual( notification2.context, { "status": "inprogress", "version": "3.0.2" }, ) self.assertNotEqual(notification1.id, notification2.id)
def test_update_status_update_same_version(self): c1 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.0-111.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) notification1 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() self.assertEqual( notification1.render(), "MAAS 3.0.1 is available, controllers will upgrade soon.", ) # report again, same version ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo( current={"version": "3.0.0-111.aaa"}, update={"version": "3.0.1-222-g.bbb"}, ), ) notification2 = Notification.objects.filter( ident=UPGRADE_STATUS_NOTIFICATION_IDENT, ).first() self.assertEqual( notification2.render(), "MAAS 3.0.1 is available, controllers will upgrade soon.", ) self.assertEqual( notification2.context, { "status": "inprogress", "version": "3.0.1" }, ) self.assertEqual(notification1.id, notification2.id)
def test_set_versions_info_deb_no_update(self): controller = factory.make_RackController() versions = DebVersionsInfo(current={ "version": "3.0.0~alpha1-111-g.deadbeef", "origin": "http://archive.ubuntu.com/ focal/main", }, ) ControllerInfo.objects.set_versions_info(controller, versions) controller_info = controller.controllerinfo self.assertEqual(controller_info.update_version, "") self.assertEqual( controller_info.update_origin, "http://archive.ubuntu.com/ focal/main", ) self.assertIsNone(controller_info.update_first_reported)
def test_deserialize(self): info = DebVersionsInfo( current={ "version": "3.0.0~alpha1-111-g.deadbeef", }, update={ "version": "3.0.0~alpha2-222-g.cafecafe", }, ) self.assertEqual( info.current, DebVersion(version="3.0.0~alpha1-111-g.deadbeef"), ) self.assertEqual( info.update, DebVersion(version="3.0.0~alpha2-222-g.cafecafe"), )
def test_different_install_types(self): c1 = factory.make_RegionRackController() c2 = factory.make_RegionRackController() ControllerInfo.objects.set_versions_info( c1, DebVersionsInfo(current={"version": "3.0.0-111-g.aaa"}, ), ) ControllerInfo.objects.set_versions_info( c2, SnapVersionsInfo(current={ "version": "3.0.0-111-g.aaa", "revision": "1234" }, ), ) notification = Notification.objects.filter( ident=UPGRADE_ISSUE_NOTIFICATION_IDENT).first() self.assertIn( "Controllers have different installation sources.", notification.message, )
def test_origin(self): apt_pkg = MockAptPkg() current = apt_pkg._make_package_version( "3.0.0~alpha1-111-g.deadbeef", origins=( (500, "http://archive.ubuntu.com", "focal", "main"), (900, "http://mirror.example.com", "focal", "other"), ), ) apt_pkg._add_package("maas-region-api", current=current) self.assertEqual( get_deb_versions_info(apt_pkg=apt_pkg), DebVersionsInfo( current=DebVersion( version="3.0.0~alpha1-111-g.deadbeef", origin="http://mirror.example.com focal/other", ), update=None, ), )
def test_set_versions_info_change_type(self): controller = factory.make_RackController() deb_versions = DebVersionsInfo( current={ "version": "3.0.0", "origin": "http://archive.ubuntu.com/ focal/main", }, update={ "version": "3.0.1", "origin": "http://mymirror.example.com/ focal/main", }, ) snap_versions = SnapVersionsInfo( current={ "revision": "1234", "version": "3.1.0", }, channel={ "track": "3.0", "risk": "stable" }, update={ "revision": "5678", "version": "3.1.1", }, cohort="abc123", ) ControllerInfo.objects.set_versions_info(controller, deb_versions) ControllerInfo.objects.set_versions_info(controller, snap_versions) controller_info = reload_object(controller).controllerinfo # all fields are updated self.assertEqual(controller_info.install_type, CONTROLLER_INSTALL_TYPE.SNAP) self.assertEqual(controller_info.version, "3.1.0") self.assertEqual(controller_info.update_version, "3.1.1") self.assertEqual(controller_info.update_origin, "3.0/stable") self.assertEqual(controller_info.snap_revision, "1234") self.assertEqual(controller_info.snap_update_revision, "5678") self.assertEqual(controller_info.snap_cohort, "abc123")