summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/filters/launch_index.py44
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)