Пример #1
0
 def test__add_disconnects_signal_if_manager_is_disabled(self):
     manager = SignalsManager()
     manager.disable()
     signal = self.make_Signal()
     manager.add(signal)
     self.assertThat(signal.connect, MockNotCalled())
     self.assertThat(signal.disconnect, MockCalledOnceWith())
Пример #2
0
    def test__can_watch_any_signal(self):
        django_signal = pick_django_signal()

        manager = SignalsManager()
        manager.watch(
            django_signal,
            sentinel.callback,
            sender=sentinel.sender,
            weak=sentinel.weak,
            dispatch_uid=sentinel.dispatch_uid,
        )

        self.assertThat(manager._signals, HasLength(1))
        [signal] = manager._signals
        self.assertThat(
            signal.connect,
            MatchesPartialCall(
                django_signal.connect,
                sentinel.callback,
                sender=sentinel.sender,
                weak=sentinel.weak,
                dispatch_uid=sentinel.dispatch_uid,
            ),
        )
        self.assertThat(
            signal.disconnect,
            MatchesPartialCall(
                django_signal.disconnect,
                sentinel.callback,
                sender=sentinel.sender,
                dispatch_uid=sentinel.dispatch_uid,
            ),
        )
Пример #3
0
    def test__can_watch_fields(self):
        connect_to_field_change = self.patch_autospec(
            signals_module, "connect_to_field_change")
        connect_to_field_change.return_value = (
            sentinel.connect,
            sentinel.disconnect,
        )

        manager = SignalsManager()
        manager.watch_fields(sentinel.callback, sentinel.model,
                             sentinel.fields, sentinel.delete)

        self.assertThat(
            manager._signals,
            Equals({Signal(sentinel.connect, sentinel.disconnect)}),
        )
        self.assertThat(
            connect_to_field_change,
            MockCalledOnceWith(
                sentinel.callback,
                sentinel.model,
                sentinel.fields,
                sentinel.delete,
            ),
        )
Пример #4
0
 def test__remove_removes_the_signal(self):
     manager = SignalsManager()
     signal = self.make_Signal()
     manager.add(signal)
     manager.remove(signal)
     self.assertThat(manager._signals, HasLength(0))
     self.assertThat(signal.connect, MockNotCalled())
     self.assertThat(signal.disconnect, MockNotCalled())
Пример #5
0
 def test__add_adds_the_signal(self):
     manager = SignalsManager()
     signal = self.make_Signal()
     self.assertThat(manager.add(signal), Is(signal))
     self.assertThat(manager._signals, Equals({signal}))
     # The manager is in its "new" state, neither enabled nor disabled, so
     # the signal is not asked to connect or disconnect yet.
     self.assertThat(signal.connect, MockNotCalled())
     self.assertThat(signal.disconnect, MockNotCalled())
Пример #6
0
 def test__disable_disables_all_signals(self):
     manager = SignalsManager()
     signals = [self.make_Signal(), self.make_Signal()]
     for signal in signals:
         manager.add(signal)
     manager.disable()
     self.assertThat(
         signals,
         AllMatch(
             MatchesAll(
                 AfterPreprocessing((lambda signal: signal.connect),
                                    MockNotCalled()),
                 AfterPreprocessing((lambda signal: signal.disconnect),
                                    MockCalledOnceWith()),
             )))
Пример #7
0
    def test__can_watch_config(self):
        callback = lambda: None
        config_name = factory.make_name("config")

        manager = SignalsManager()
        manager.watch_config(callback, config_name)

        self.assertThat(manager._signals, HasLength(1))
        [signal] = manager._signals
        self.assertThat(
            signal.connect,
            MatchesPartialCall(Config.objects.config_changed_connect,
                               config_name, callback))
        self.assertThat(
            signal.disconnect,
            MatchesPartialCall(Config.objects.config_changed_disconnect,
                               config_name, callback))
Пример #8
0
# Copyright 2019 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Respond to Subnet CIDR changes."""

__all__ = ["signals"]

from django.db.models.signals import post_save

from maasserver.enum import IPADDRESS_TYPE
from maasserver.models import StaticIPAddress, Subnet
from maasserver.utils.signals import SignalsManager

signals = SignalsManager()


def update_referenced_ip_addresses(subnet):
    """Updates the `StaticIPAddress`'s to ensure that they are linked to the
    correct subnet."""

    # Remove the IP addresses that no longer fall with in the CIDR.
    remove_ips = StaticIPAddress.objects.filter(
        alloc_type=IPADDRESS_TYPE.USER_RESERVED, subnet_id=subnet.id)
    remove_ips = remove_ips.extra(where=["NOT(ip << %s)"],
                                  params=[subnet.cidr])
    remove_ips.update(subnet=None)

    # Add the IP addresses that now fall into CIDR.
    add_ips = StaticIPAddress.objects.filter(subnet__isnull=True)
    add_ips = add_ips.extra(where=["ip << %s"], params=[subnet.cidr])
    add_ips.update(subnet_id=subnet.id)