~free.ekanayaka/landscape-client/lucid-1.5.4-0ubuntu0.10.04.0

« back to all changes in this revision

Viewing changes to landscape/broker/exchange.py

  • Committer: Bazaar Package Importer
  • Author(s): Free Ekanayaka
  • Date: 2010-06-28 18:07:18 UTC
  • mfrom: (1.2.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20100628180718-vytyqgbtkiirv5sb
Tags: 1.5.2.1-0ubuntu0.10.04.0
Filter duplicate network interfaces in get_active_interfaces (LP: #597000)

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
    plugin_name = "message-exchange"
23
23
 
24
24
    def __init__(self, reactor, store, transport, registration_info,
 
25
                 exchange_store,
25
26
                 exchange_interval=60*60,
26
27
                 urgent_exchange_interval=10,
27
28
                 monitor_interval=None,
52
53
        self._client_accepted_types = set()
53
54
        self._client_accepted_types_hash = None
54
55
        self._message_handlers = {}
 
56
        self._exchange_store = exchange_store
55
57
 
56
58
        self.register_message("accepted-types", self._handle_accepted_types)
57
59
        self.register_message("resynchronize", self._handle_resynchronize)
63
65
        """Return a binary tuple with urgent and normal exchange intervals."""
64
66
        return (self._urgent_exchange_interval, self._exchange_interval)
65
67
 
 
68
    def _message_is_obsolete(self, message):
 
69
        """Returns C{True} if message is obsolete.
 
70
 
 
71
        A message is considered obsolete if the secure ID changed since it was
 
72
        received.
 
73
        """
 
74
        if 'operation-id' not in message:
 
75
            return False
 
76
 
 
77
        operation_id = message['operation-id']
 
78
        context = self._exchange_store.get_message_context(operation_id)
 
79
        if context is None:
 
80
            logging.warning(
 
81
                "No message context for message with operation-id: %s"
 
82
                % operation_id)
 
83
            return False
 
84
 
 
85
        # Compare the current secure ID with the one that was in effect when
 
86
        # the request message was received.
 
87
        result = self._registration_info.secure_id != context.secure_id
 
88
        context.remove()
 
89
 
 
90
        return result
 
91
 
66
92
    def send(self, message, urgent=False):
67
93
        """Include a message to be sent in an exchange.
68
94
 
71
97
 
72
98
        @param message: Same as in L{MessageStore.add}.
73
99
        """
 
100
        if self._message_is_obsolete(message):
 
101
            logging.info(
 
102
                "Response message with operation-id %s was discarded "
 
103
                "because the client's secure ID has changed in the meantime"
 
104
                % message.get('operation-id'))
 
105
            return None
 
106
 
74
107
        if "timestamp" not in message:
75
108
            message["timestamp"] = int(self._reactor.time())
76
109
        message_id = self._message_store.add(message)
300
333
        @param result: The response got in reply to the C{payload}.
301
334
        """
302
335
        message_store = self._message_store
303
 
        self._client_accepted_types_hash = result.get("client-accepted-types-hash")
 
336
        self._client_accepted_types_hash = result.get(
 
337
            "client-accepted-types-hash")
304
338
        next_expected = result.get("next-expected-sequence")
305
339
        old_sequence = message_store.get_sequence()
306
340
        if next_expected is None:
363
397
        Any message handlers registered with L{register_message} will
364
398
        be called.
365
399
        """
 
400
        if 'operation-id' in message:
 
401
            # This is a message that requires a response. Store the secure ID
 
402
            # so we can check for obsolete results later.
 
403
            self._exchange_store.add_message_context(
 
404
                message['operation-id'], self._registration_info.secure_id,
 
405
                message['type'])
 
406
 
366
407
        self._reactor.fire("message", message)
367
408
        # This has plan interference! but whatever.
368
409
        if message["type"] in self._message_handlers: