Updated inventory script to only return active groups and active hosts for active inventories.

This commit is contained in:
Chris Church
2013-06-12 22:37:25 -04:00
parent 6f43190b2b
commit 6557fb33f3
4 changed files with 62 additions and 26 deletions

View File

@@ -201,9 +201,7 @@ class BaseSubList(BaseList):
relationship.remove(sub) relationship.remove(sub)
else: else:
# resource is just a ForeignKey, can't remove it from the set, just set it inactive # resource is just a ForeignKey, can't remove it from the set, just set it inactive
sub.name = "_deleted_%s_%s" % (str(datetime.time()), sub.name) sub.mark_inactive()
sub.active = False
sub.save()
if created: if created:
return Response(status=status.HTTP_201_CREATED, data=ser.data) return Response(status=status.HTTP_201_CREATED, data=ser.data)
@@ -229,9 +227,7 @@ class BaseDetail(generics.RetrieveUpdateDestroyAPIView):
if not check_user_access(request.user, self.model, 'delete', obj): if not check_user_access(request.user, self.model, 'delete', obj):
raise PermissionDenied() raise PermissionDenied()
if isinstance(obj, PrimordialModel): if isinstance(obj, PrimordialModel):
obj.name = "_deleted_%s_%s" % (str(datetime.time()), obj.name) obj.mark_inactive()
obj.active = False
obj.save()
elif type(obj) == User: elif type(obj) == User:
obj.username = "_deleted_%s_%s" % (str(datetime.time()), obj.username) obj.username = "_deleted_%s_%s" % (str(datetime.time()), obj.username)
obj.is_active = False obj.is_active = False

View File

@@ -26,11 +26,12 @@ class Command(NoArgsCommand):
def get_list(self, inventory, indent=None): def get_list(self, inventory, indent=None):
groups = {} groups = {}
for group in inventory.groups.all(): for group in inventory.groups.filter(active=True):
# FIXME: Check if group is active? hosts = group.hosts.filter(active=True)
children = group.children.filter(active=True)
group_info = { group_info = {
'hosts': list(group.hosts.values_list('name', flat=True)), 'hosts': list(hosts.values_list('name', flat=True)),
'children': list(group.children.values_list('name', flat=True)), 'children': list(children.values_list('name', flat=True)),
} }
if group.variables: if group.variables:
group_info['vars'] = group.variables_dict group_info['vars'] = group.variables_dict
@@ -46,8 +47,7 @@ class Command(NoArgsCommand):
from ansibleworks.main.models import Host from ansibleworks.main.models import Host
hostvars = {} hostvars = {}
try: try:
# FIXME: Check if active? host = inventory.hosts.get(active=True, name=hostname)
host = inventory.hosts.get(name=hostname)
except Host.DoesNotExist: except Host.DoesNotExist:
raise CommandError('Host %s not found in the given inventory' % hostname) raise CommandError('Host %s not found in the given inventory' % hostname)
hostvars = {} hostvars = {}
@@ -68,7 +68,7 @@ class Command(NoArgsCommand):
if not inventory_id: if not inventory_id:
raise CommandError('No inventory ID specified') raise CommandError('No inventory ID specified')
try: try:
inventory = Inventory.objects.get(id=inventory_id) inventory = Inventory.objects.get(active=True, id=inventory_id)
except Inventory.DoesNotExist: except Inventory.DoesNotExist:
raise CommandError('Inventory with ID %d not found' % inventory_id) raise CommandError('Inventory with ID %d not found' % inventory_id)
host = options.get('host', '') host = options.get('host', '')

View File

@@ -117,6 +117,15 @@ class PrimordialModel(models.Model):
def __unicode__(self): def __unicode__(self):
return unicode("%s-%s"% (self.name, self.id)) return unicode("%s-%s"% (self.name, self.id))
def mark_inactive(self, save=True):
'''Use instead of delete to rename and mark inactive.'''
if self.active:
if 'name' in self._meta.get_all_field_names():
self.name = "_deleted_%s_%s" % (now().isoformat(), self.name)
self.active = False
if save:
self.save()
class CommonModel(PrimordialModel): class CommonModel(PrimordialModel):
''' a base model where the name is unique ''' ''' a base model where the name is unique '''

View File

@@ -117,6 +117,8 @@ class AcomInventoryTest(BaseCommandTest):
host = inventory.hosts.create(name='host-%02d-%02d.example.com' % (n, x), host = inventory.hosts.create(name='host-%02d-%02d.example.com' % (n, x),
inventory=inventory, inventory=inventory,
variables=variables) variables=variables)
if x in (3, 7):
host.mark_inactive()
hosts.append(host) hosts.append(host)
self.hosts.extend(hosts) self.hosts.extend(hosts)
groups = [] groups = []
@@ -128,6 +130,8 @@ class AcomInventoryTest(BaseCommandTest):
group = inventory.groups.create(name='group-%d' % x, group = inventory.groups.create(name='group-%d' % x,
inventory=inventory, inventory=inventory,
variables=variables) variables=variables)
if x == 2:
group.mark_inactive()
groups.append(group) groups.append(group)
group.hosts.add(hosts[x]) group.hosts.add(hosts[x])
group.hosts.add(hosts[x + 5]) group.hosts.add(hosts[x + 5])
@@ -146,19 +150,25 @@ class AcomInventoryTest(BaseCommandTest):
def test_list_with_inventory_id_as_argument(self): def test_list_with_inventory_id_as_argument(self):
inventory = self.inventories[0] inventory = self.inventories[0]
self.assertTrue(inventory.active)
result, stdout, stderr = self.run_command('acom_inventory', list=True, result, stdout, stderr = self.run_command('acom_inventory', list=True,
inventory_id=inventory.pk) inventory_id=inventory.pk)
self.assertEqual(result, None) self.assertEqual(result, None)
data = json.loads(stdout) data = json.loads(stdout)
self.assertEqual(set(data.keys()), groups = inventory.groups.filter(active=True)
set(inventory.groups.values_list('name', flat=True))) groupnames = groups.values_list('name', flat=True)
self.assertEqual(set(data.keys()), set(groupnames))
# Groups for this inventory should only have hosts, and no group # Groups for this inventory should only have hosts, and no group
# variable data or parent/child relationships. # variable data or parent/child relationships.
for k,v in data.items(): for k,v in data.items():
self.assertTrue(isinstance(v, (list, tuple))) self.assertTrue(isinstance(v, (list, tuple)))
group = inventory.groups.get(name=k) group = inventory.groups.get(active=True, name=k)
self.assertEqual(set(v), hosts = group.hosts.filter(active=True)
set(group.hosts.values_list('name', flat=True))) hostnames = hosts.values_list('name', flat=True)
self.assertEqual(set(v), set(hostnames))
for group in inventory.groups.filter(active=False):
self.assertFalse(group.name in data.keys(),
'deleted group %s should not be in data' % group)
# Command line argument for inventory ID should take precedence over # Command line argument for inventory ID should take precedence over
# environment variable. # environment variable.
inventory_pks = set(map(lambda x: x.pk, self.inventories)) inventory_pks = set(map(lambda x: x.pk, self.inventories))
@@ -171,32 +181,38 @@ class AcomInventoryTest(BaseCommandTest):
def test_list_with_inventory_id_in_environment(self): def test_list_with_inventory_id_in_environment(self):
inventory = self.inventories[1] inventory = self.inventories[1]
self.assertTrue(inventory.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', list=True) result, stdout, stderr = self.run_command('acom_inventory', list=True)
self.assertEqual(result, None) self.assertEqual(result, None)
data = json.loads(stdout) data = json.loads(stdout)
self.assertEqual(set(data.keys()), groups = inventory.groups.filter(active=True)
set(inventory.groups.values_list('name', flat=True))) groupnames = groups.values_list('name', flat=True)
self.assertEqual(set(data.keys()), set(groupnames))
# Groups for this inventory should have hosts, variable data, and one # Groups for this inventory should have hosts, variable data, and one
# parent/child relationship. # parent/child relationship.
for k,v in data.items(): for k,v in data.items():
self.assertTrue(isinstance(v, dict)) self.assertTrue(isinstance(v, dict))
group = inventory.groups.get(name=k) group = inventory.groups.get(active=True, name=k)
self.assertEqual(set(v.get('hosts', [])), hosts = group.hosts.filter(active=True)
set(group.hosts.values_list('name', flat=True))) hostnames = hosts.values_list('name', flat=True)
self.assertEqual(set(v.get('hosts', [])), set(hostnames))
if group.variables: if group.variables:
self.assertEqual(v.get('vars', {}), self.assertEqual(v.get('vars', {}),
json.loads(group.variables)) json.loads(group.variables))
if k == 'group-3': if k == 'group-3':
self.assertEqual(set(v.get('children', [])), children = group.children.filter(active=True)
set(group.children.values_list('name', flat=True))) childnames = children.values_list('name', flat=True)
self.assertEqual(set(v.get('children', [])), set(childnames))
else: else:
self.assertFalse('children' in v) self.assertFalse('children' in v)
def test_valid_host(self): def test_valid_host(self):
# Host without variable data. # Host without variable data.
inventory = self.inventories[0] inventory = self.inventories[0]
self.assertTrue(inventory.active)
host = inventory.hosts.all()[2] host = inventory.hosts.all()[2]
self.assertTrue(host.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', result, stdout, stderr = self.run_command('acom_inventory',
host=host.name) host=host.name)
@@ -205,7 +221,9 @@ class AcomInventoryTest(BaseCommandTest):
self.assertEqual(data, {}) self.assertEqual(data, {})
# Host with variable data. # Host with variable data.
inventory = self.inventories[1] inventory = self.inventories[1]
host = inventory.hosts.all()[3] self.assertTrue(inventory.active)
host = inventory.hosts.all()[4]
self.assertTrue(host.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', result, stdout, stderr = self.run_command('acom_inventory',
host=host.name) host=host.name)
@@ -216,7 +234,9 @@ class AcomInventoryTest(BaseCommandTest):
def test_invalid_host(self): def test_invalid_host(self):
# Valid host, but not part of the specified inventory. # Valid host, but not part of the specified inventory.
inventory = self.inventories[0] inventory = self.inventories[0]
self.assertTrue(inventory.active)
host = Host.objects.exclude(inventory=inventory)[0] host = Host.objects.exclude(inventory=inventory)[0]
self.assertTrue(host.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', result, stdout, stderr = self.run_command('acom_inventory',
host=host.name) host=host.name)
@@ -250,8 +270,18 @@ class AcomInventoryTest(BaseCommandTest):
self.assertTrue(isinstance(result, CommandError)) self.assertTrue(isinstance(result, CommandError))
self.assertEqual(json.loads(stdout), {}) self.assertEqual(json.loads(stdout), {})
def test_with_deleted_inventory(self):
inventory = self.inventories[0]
inventory.mark_inactive()
self.assertFalse(inventory.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', list=True)
self.assertTrue(isinstance(result, CommandError))
self.assertEqual(json.loads(stdout), {})
def test_without_list_or_host_argument(self): def test_without_list_or_host_argument(self):
inventory = self.inventories[0] inventory = self.inventories[0]
self.assertTrue(inventory.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory') result, stdout, stderr = self.run_command('acom_inventory')
self.assertTrue(isinstance(result, CommandError)) self.assertTrue(isinstance(result, CommandError))
@@ -259,6 +289,7 @@ class AcomInventoryTest(BaseCommandTest):
def test_with_both_list_and_host_arguments(self): def test_with_both_list_and_host_arguments(self):
inventory = self.inventories[0] inventory = self.inventories[0]
self.assertTrue(inventory.active)
os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk) os.environ['ACOM_INVENTORY_ID'] = str(inventory.pk)
result, stdout, stderr = self.run_command('acom_inventory', list=True, result, stdout, stderr = self.run_command('acom_inventory', list=True,
host='blah') host='blah')