implement GetSites()
[plcapi.git] / PLC / Sites.py
1 from types import StringTypes
2 import string
3
4 from PLC.Faults import *
5 from PLC.Parameter import Parameter, Mixed
6 from PLC.NovaObject import NovaObject, NovaObjects
7 from PLC.Slices import Slice, Slices
8 #from PLC.Persons import Person, Persons
9
10 class Site:
11     """
12     Representation of a row in the sites table. To use, optionally
13     instantiate with a dict of values. Update as you would a
14     dict. Commit to the database with sync().
15     """
16
17     fields = {
18         'enabled': Parameter(bool, "Has been enabled"),
19         'id': Parameter(int, "Site identifier"),
20         'name': Parameter(str, "Full site name", max = 254),
21         'description': Parameter(str, "Description", max = 254),
22         #'max_slices': Parameter(int, "Maximum number of slices that the site is able to create"),
23         #'max_slivers': Parameter(int, "Maximum number of slivers that the site is able to create"),
24         'person_ids': Parameter([int], "List of account identifiers"),
25         'slice_ids': Parameter([int], "List of slice identifiers"),
26         'pcu_ids': Parameter([int], "List of PCU identifiers"),
27         'node_ids': Parameter([int], "List of site node identifiers"),
28         }
29
30     def delete(self, commit = True):
31         """
32         Delete existing site.
33         """
34
35         assert 'site_id' in self
36
37         # Delete accounts of all people at the site who are not
38         # members of at least one other non-deleted site.
39         persons = Persons(self.api, self['person_ids'])
40         for person in persons:
41             delete = True
42
43             person_sites = Sites(self.api, person['site_ids'])
44             for person_site in person_sites:
45                 if person_site['site_id'] != self['site_id']:
46                     delete = False
47                     break
48
49             if delete:
50                 person.delete(commit = False)
51
52         # Delete all site addresses
53         addresses = Addresses(self.api, self['address_ids'])
54         for address in addresses:
55             address.delete(commit = False)
56
57         # Delete all site slices
58         slices = Slices(self.api, self['slice_ids'])
59         for slice in slices:
60             slice.delete(commit = False)
61
62         # Delete all site PCUs
63         pcus = PCUs(self.api, self['pcu_ids'])
64         for pcu in pcus:
65             pcu.delete(commit = False)
66
67         # Delete all site nodes
68         nodes = Nodes(self.api, self['node_ids'])
69         for node in nodes:
70             node.delete(commit = False)
71
72         # Clean up miscellaneous join tables
73         for table in self.join_tables:
74             self.api.db.do("DELETE FROM %s WHERE site_id = %d" % \
75                            (table, self['site_id']))
76
77         # Mark as deleted
78         self['deleted'] = True
79         self.sync(commit)
80
81 class Sites(NovaObjects):
82     """
83     Representation of row(s) from the sites table in the
84     database.
85     """
86
87     def __init__(self, api, site_filter = None, columns = None):
88         self.api = api 
89         self.fields = Site.fields
90         if not site_filter:
91             sites = self.api.client_shell.keystone.tenants.findall()
92         elif isintance(site_filter, StringTypes):
93             sites = [self.api.client_shell.keystone.tenants.find(id=site_filter)]
94         elif isintance(site_filter, StringTypes):
95             sites = [self.api.client_shell.keystone.tenants.find(**site_filter)]
96         elif isinstance(site_filter, (list, tuple, set)):
97             sites = self.api.client_shell.keystone.tenants.findall()
98             sites = [site for site in sites if site.id in site_filter]
99         else:
100             raise PLCInvalidArgument, "Wrong site filter %s" % site_filter         
101         self.extend(sites)