From 2e51e2efc292870479a7b972c7ebc9ceac85da6f Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 27 Aug 2012 20:51:00 -0700 Subject: For the userdata 'post-filtering' add in a new folder that can contain filters that serve this purpose only and add in the initial launch-index filter and replace the code in the datasource class that previously did this. --- cloudinit/filters/__init__.py | 21 +++++++++++++ cloudinit/filters/launch_index.py | 63 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 cloudinit/filters/__init__.py create mode 100644 cloudinit/filters/launch_index.py (limited to 'cloudinit/filters') diff --git a/cloudinit/filters/__init__.py b/cloudinit/filters/__init__.py new file mode 100644 index 00000000..da124641 --- /dev/null +++ b/cloudinit/filters/__init__.py @@ -0,0 +1,21 @@ +# vi: ts=4 expandtab +# +# Copyright (C) 2012 Canonical Ltd. +# Copyright (C) 2012 Hewlett-Packard Development Company, L.P. +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Scott Moser +# Author: Juerg Haefliger +# Author: Joshua Harlow +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . diff --git a/cloudinit/filters/launch_index.py b/cloudinit/filters/launch_index.py new file mode 100644 index 00000000..b9e108c4 --- /dev/null +++ b/cloudinit/filters/launch_index.py @@ -0,0 +1,63 @@ +# vi: ts=4 expandtab +# +# Copyright (C) 2012 Canonical Ltd. +# Copyright (C) 2012 Hewlett-Packard Development Company, L.P. +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Scott Moser +# Author: Juerg Haefliger +# Author: Joshua Harlow +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 3, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import copy + +from cloudinit import log as logging +from cloudinit import user_data as ud +from cloudinit import util + +LOG = logging.getLogger(__name__) + + +class Filter(object): + def __init__(self, wanted_idx, allow_none=True): + self.wanted_idx = wanted_idx + 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 + msg_idx = util.safe_int(msg_idx) + if msg_idx != self.wanted_idx: + 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): + 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 -- cgit v1.2.3