Merge branch 'master' of ssh://git.planet-lab.org/git/plstackapi
[plstackapi.git] / planetstack / core / xoslib / objects / sliceplus.py
1 from core.models.slice import Slice
2 from plus import PlusObjectMixin
3
4 class SlicePlus(Slice, PlusObjectMixin):
5     class Meta:
6         proxy = True
7
8     def getSliceInfo(self, user=None):
9         used_sites = {}
10         used_deployments = {}
11         sliverCount = 0
12         for sliver in self.slivers.all():
13             site = sliver.node.site_deployment.site
14             deployment = sliver.node.site_deployment.deployment
15             used_sites[site.name] = used_sites.get(site.name, 0) + 1
16             used_deployments[deployment.name] = used_deployments.get(deployment.name, 0) + 1
17             sliverCount = sliverCount + 1
18
19         roles = []
20         if (user!=None):
21             roles = [x.role.role for x in self.sliceprivileges.filter(user=user)]
22
23         return {"sitesUsed": used_sites,
24                 "deploymentsUsed": used_deployments,
25                 "sliverCount": sliverCount,
26                 "siteCount": len(used_sites.keys()),
27                 "roles": roles}
28
29     @property
30     def site_allocation(self):
31         return self.getSliceInfo()["sitesUsed"]
32
33     @site_allocation.setter
34     def site_allocation(self, value):
35         print "XXX set sitesUsed to", value
36
37     @property
38     def network_ports(self):
39         # XXX this assumes there is only one network that can have ports bound
40         # to it for a given slice. This is intended for the tenant view, which
41         # will obey this field.
42         networkPorts = ""
43         for networkSlice in self.networkslices.all():
44             network = networkSlice.network
45             if network.ports:
46                 networkPorts = network.ports
47
48         return networkPorts
49
50     @network_ports.setter
51     def network_ports(self, value):
52         print "XXX set networkPorts to", value
53
54     @staticmethod
55     def select_by_user(user):
56         if user.is_admin:
57             qs = SlicePlus.objects.all()
58         else:
59             slice_ids = [sp.slice.id for sp in SlicePrivilege.objects.filter(user=user)]
60             qs = SlicePlus.objects.filter(id__in=slice_ids)
61         return qs