Merge lp:~mikemc/simplestreams/add-filters-glance into lp:~smoser/simplestreams/trunk

Proposed by Mike McCracken
Status: Merged
Merged at revision: 347
Proposed branch: lp:~mikemc/simplestreams/add-filters-glance
Merge into: lp:~smoser/simplestreams/trunk
Diff against target: 104 lines (+31/-6)
3 files modified
simplestreams/filters.py (+6/-1)
simplestreams/mirrors/glance.py (+14/-4)
tools/sstream-mirror-glance (+11/-1)
To merge this branch: bzr merge lp:~mikemc/simplestreams/add-filters-glance
Reviewer Review Type Date Requested Status
Scott Moser Pending
Review via email: mp+222964@code.launchpad.net

Commit message

- Add item and index filters to glance mirror

Description of the change

- Add item and index filters to glance mirror

Includes changes to sstream-mirror-glance to test item filters.

To post a comment you must log in.
347. By Scott Moser

Rename filter_index_item to filter_dict

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'simplestreams/filters.py'
2--- simplestreams/filters.py 2013-09-04 15:55:37 +0000
3+++ simplestreams/filters.py 2014-06-12 17:30:34 +0000
4@@ -64,7 +64,12 @@
5
6
7 def filter_item(filters, data, src, pedigree):
8- data = util.products_exdata(src, pedigree)
9+ "Apply filter list to a products entity. Flatten before doing so."
10+ return filter_dict(filters, util.products_exdata(src, pedigree))
11+
12+
13+def filter_dict(filters, data):
14+ "Apply filter list to dict. Does not flatten."
15 for f in filters:
16 if not f.matches(data):
17 return False
18
19=== modified file 'simplestreams/mirrors/glance.py'
20--- simplestreams/mirrors/glance.py 2014-06-04 20:57:44 +0000
21+++ simplestreams/mirrors/glance.py 2014-06-12 17:30:34 +0000
22@@ -15,6 +15,7 @@
23 # You should have received a copy of the GNU Affero General Public License
24 # along with Simplestreams. If not, see <http://www.gnu.org/licenses/>.
25
26+import simplestreams.filters as filters
27 import simplestreams.mirrors as mirrors
28 import simplestreams.util as util
29 import simplestreams.openstack as openstack
30@@ -44,6 +45,17 @@
31 name_prefix=None):
32 super(GlanceMirror, self).__init__(config=config)
33
34+ self.item_filters = self.config.get('item_filters', [])
35+ if len(self.item_filters) == 0:
36+ self.item_filters = ['ftype~(disk1.img|disk.img)',
37+ 'arch~(x86_64|amd64|i386)']
38+ self.item_filters = filters.get_filters(self.item_filters)
39+
40+ self.index_filters = self.config.get('index_filters', [])
41+ if len(self.index_filters) == 0:
42+ self.index_filters = ['datatype=image-downloads']
43+ self.index_filters = filters.get_filters(self.index_filters)
44+
45 self.loaded_content = {}
46 self.store = objectstore
47
48@@ -134,9 +146,7 @@
49 return glance_t
50
51 def filter_item(self, data, src, target, pedigree):
52- flat = util.products_exdata(src, pedigree, include_top=False)
53- return (flat.get('ftype') in ('disk1.img', 'disk.img') and
54- flat.get('arch') in ('x86_64', 'amd64', 'i386'))
55+ return filters.filter_item(self.item_filters, data, src, pedigree)
56
57 def insert_item(self, data, src, target, pedigree, contentsource):
58 flat = util.products_exdata(src, pedigree, include_top=False)
59@@ -215,7 +225,7 @@
60 self.gclient.images.delete(data['id'])
61
62 def filter_index_entry(self, data, src, pedigree):
63- return data.get('datatype') in ("image-downloads", None)
64+ return filters.filter_dict(self.index_filters, data)
65
66 def insert_products(self, path, target, content):
67 if not self.store:
68
69=== modified file 'tools/sstream-mirror-glance'
70--- tools/sstream-mirror-glance 2013-09-09 19:45:15 +0000
71+++ tools/sstream-mirror-glance 2014-06-12 17:30:34 +0000
72@@ -20,6 +20,7 @@
73 # glanceclient) are not python3.
74 #
75 import argparse
76+import logging
77 import os.path
78 import sys
79
80@@ -79,6 +80,14 @@
81
82 parser.add_argument('source_mirror')
83 parser.add_argument('path', nargs='?', default="streams/v1/index.sjson")
84+ parser.add_argument('--item_filter', action='append', default=[],
85+ dest="item_filters",
86+ help="Filter expression for mirrored items. "
87+ "Multiple filter arguments can be specified"
88+ "and will be combined with logical AND. "
89+ "Expressions are key[!]=literal_string "
90+ "or key[!]~regexp.")
91+
92 args = parser.parse_args()
93
94 modify_hook = None
95@@ -87,7 +96,8 @@
96
97 mirror_config = {'max_items': args.max, 'keep_items': args.keep,
98 'cloud_name': args.cloud_name,
99- 'modify_hook': modify_hook}
100+ 'modify_hook': modify_hook,
101+ 'item_filters': args.item_filters}
102
103 def policy(content, path): # pylint: disable=W0613
104 if args.path.endswith('sjson'):

Subscribers

People subscribed via source and target branches

to all changes: