diff options
Diffstat (limited to 'cloudinit/filters')
-rw-r--r-- | cloudinit/filters/launch_index.py | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/cloudinit/filters/launch_index.py b/cloudinit/filters/launch_index.py index b9e108c4..4299fb46 100644 --- a/cloudinit/filters/launch_index.py +++ b/cloudinit/filters/launch_index.py @@ -35,8 +35,6 @@ class Filter(object): self.allow_none = allow_none def _select(self, message): - if ud.is_skippable(message): - return False msg_idx = message.get('Launch-Index', None) if self.allow_none and msg_idx is None: return True @@ -45,19 +43,33 @@ class Filter(object): return False return True - def apply(self, base_message): - if not base_message.is_multipart() or self.wanted_idx is None: - return base_message - prev_msgs = base_message.get_payload(decode=False) - to_attach = [] - for sub_msg in base_message.walk(): - if self._select(sub_msg): - to_attach.append(sub_msg) - if len(prev_msgs) != len(to_attach): + def _do_filter(self, message): + # Don't use walk() here since we want to do the reforming of the + # messages ourselves and not flatten the message listings... + if not self._select(message): + return None + if message.is_multipart(): + # Recreate it and its child messages + prev_msgs = message.get_payload(decode=False) + new_msgs = [] + discarded = 0 + for m in prev_msgs: + m = self._do_filter(m) + if m is not None: + new_msgs.append(m) + else: + discarded += 1 LOG.debug(("Discarding %s multipart messages " "which do not match launch index %s"), - (len(prev_msgs) - len(to_attach)), self.wanted_idx) - filtered_msg = copy.deepcopy(base_message) - filtered_msg.set_payload(to_attach) - filtered_msg[ud.ATTACHMENT_FIELD] = str(len(to_attach)) - return filtered_msg + discarded, self.wanted_idx) + new_message = copy.copy(message) + new_message.set_payload(new_msgs) + new_message[ud.ATTACHMENT_FIELD] = str(len(new_msgs)) + return new_message + else: + return copy.copy(message) + + def apply(self, root_message): + if self.wanted_idx is None: + return root_message + return self._do_filter(root_message) |