def test_get_load_balancer_configuration(self, mocks):
        """
        Test that the load balancer configuration gets generated correctly.
        """
        instance = OpenEdXInstanceFactory(sub_domain='test.load_balancer', use_ephemeral_databases=True)
        domain_names = [
            "test.load_balancer.example.com",
            "preview-test.load_balancer.example.com",
            "studio-test.load_balancer.example.com",
        ]

        # Test configuration for preliminary page
        backend_map, config = instance.get_load_balancer_configuration()
        self._check_load_balancer_configuration(
            backend_map, config, domain_names, settings.PRELIMINARY_PAGE_SERVER_IP
        )

        # Test configuration for active appserver
        appserver_id = instance.spawn_appserver()
        instance.set_appserver_active(appserver_id)
        backend_map, config = instance.get_load_balancer_configuration()
        self._check_load_balancer_configuration(
            backend_map, config, domain_names, instance.active_appserver.server.public_ip
        )

        # Test configuration in case an active appserver doesn't have a public IP address anymore.
        # This might happen if the OpenStack server dies or gets modified from the outside, but it
        # is not expected to happen under normal circumstances.  We deconfigure the backend and log
        # an error in this case.
        with patch('instance.openstack.get_server_public_address', return_value=None), \
                self.assertLogs("instance.models.instance", "ERROR"):
            self.assertEqual(instance.get_load_balancer_configuration(), ([], []))
 def test_set_appserver_active(self, mocks, mock_enable_monitoring):
     """
     Check that monitoring is enabled when an appserver is activated.
     """
     instance = OpenEdXInstanceFactory()
     appserver_id = instance.spawn_appserver()
     instance.set_appserver_active(appserver_id)
     self.assertEqual(mock_enable_monitoring.call_count, 1)
 def test_reconfigure_load_balancer(self, mock_run_playbook):
     """
     Test that reconfigure_load_balancer reconfigures the load balancer and logs to the instance.
     """
     instance = OpenEdXInstanceFactory(sub_domain='test.load_balancer')
     appserver_id = instance.spawn_appserver()
     instance.set_appserver_active(appserver_id)
     with self.assertLogs("instance.models.instance") as logs:
         instance.reconfigure_load_balancer()
     annotation = instance.get_log_message_annotation()
     for log_line in logs.output:
         self.assertIn(annotation, log_line)
     self.assertEqual(len(logs.output), 2)
     self.assertIn("Triggering reconfiguration of the load balancing server", logs.output[0])
     self.assertIn("New load-balancer configuration", logs.output[1])
 def test_set_appserver_active(self, mocks):
     """
     Test set_appserver_active()
     """
     instance = OpenEdXInstanceFactory(internal_lms_domain='test.activate.opencraft.co.uk',
                                       use_ephemeral_databases=True)
     appserver_id = instance.spawn_appserver()
     instance.set_appserver_active(appserver_id)
     instance.refresh_from_db()
     self.assertEqual(instance.active_appserver.pk, appserver_id)
     self.assertEqual(mocks.mock_load_balancer_run_playbook.call_count, 2)
     instance.set_appserver_inactive()
     instance.refresh_from_db()
     self.assertIsNone(instance.active_appserver)
     self.assertEqual(mocks.mock_load_balancer_run_playbook.call_count, 3)