Add the ability to exclude hosts in an atomic group from the get_hosts RPC.

Signed-off-by: Gregory Smith <gps@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3581 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/frontend/afe/rpc_utils.py b/frontend/afe/rpc_utils.py
index 7c58ec5..2b0fa83 100644
--- a/frontend/afe/rpc_utils.py
+++ b/frontend/afe/rpc_utils.py
@@ -112,7 +112,7 @@
     return {'where': where}
 
 
-def extra_host_filters(multiple_labels=[]):
+def extra_host_filters(multiple_labels=()):
     """\
     Generate SQL WHERE clauses for matching hosts in an intersection of
     labels.
@@ -126,19 +126,33 @@
     return extra_args
 
 
-def get_host_query(multiple_labels, exclude_only_if_needed_labels, filter_data):
+def get_host_query(multiple_labels, exclude_only_if_needed_labels,
+                   exclude_atomic_group_hosts, filter_data):
     query = models.Host.valid_objects.all()
     if exclude_only_if_needed_labels:
         only_if_needed_labels = models.Label.valid_objects.filter(
             only_if_needed=True)
         if only_if_needed_labels.count() > 0:
-            only_if_needed_ids = ','.join(str(label['id']) for label
-                                          in only_if_needed_labels.values('id'))
+            only_if_needed_ids = ','.join(
+                    str(label['id'])
+                    for label in only_if_needed_labels.values('id'))
             query = models.Host.objects.add_join(
                 query, 'hosts_labels', join_key='host_id',
-                join_condition='hosts_labels_exclude.label_id IN (%s)'
-                               % only_if_needed_ids,
-                suffix='_exclude', exclude=True)
+                join_condition=('hosts_labels_exclude_OIN.label_id IN (%s)'
+                                % only_if_needed_ids),
+                suffix='_exclude_OIN', exclude=True)
+    if exclude_atomic_group_hosts:
+        atomic_group_labels = models.Label.valid_objects.filter(
+                atomic_group__isnull=False)
+        if atomic_group_labels.count() > 0:
+            atomic_group_label_ids = ','.join(
+                    str(atomic_group['id'])
+                    for atomic_group in atomic_group_labels.values('id'))
+            query = models.Host.objects.add_join(
+                    query, 'hosts_labels', join_key='host_id',
+                    join_condition=('hosts_labels_exclude_AG.label_id IN (%s)'
+                                    % atomic_group_label_ids),
+                    suffix='_exclude_AG', exclude=True)
     filter_data['extra_args'] = (extra_host_filters(multiple_labels))
     return models.Host.query_objects(filter_data, initial_query=query)