Revision e0c7f0ba test/pgerakios.py
b/test/pgerakios.py | ||
---|---|---|
1 |
#!/usr/bin/python |
|
1 |
#!/usr/bin/env python
|
|
2 | 2 |
import sys |
3 | 3 |
import os |
4 | 4 |
from commissioning.clients.http import HTTP_API_Client, init_logger_stderr |
5 | 5 |
from commissioning import QuotaholderAPI |
6 | 6 |
import random |
7 |
import copy |
|
7 | 8 |
import inspect |
8 | 9 |
|
10 |
|
|
9 | 11 |
init_logger_stderr('mylogger', level='INFO') |
10 | 12 |
|
11 | 13 |
def environ_get(key, default_value=''): |
... | ... | |
122 | 124 |
policies = {} |
123 | 125 |
|
124 | 126 |
@staticmethod |
127 |
def copy(policy): |
|
128 |
return copy.deepcopy(policy) |
|
129 |
|
|
130 |
@staticmethod |
|
131 |
def union(policy1,policy2): |
|
132 |
return copy(policy1) |
|
133 |
|
|
134 |
@staticmethod |
|
125 | 135 |
def get(name): |
126 | 136 |
#TODO: |
127 | 137 |
exn("Not implemented") |
... | ... | |
255 | 265 |
ResourceState = enum('DIRTY', 'LOADED') |
256 | 266 |
|
257 | 267 |
@staticmethod |
268 |
def copy(resource): |
|
269 |
return copy.copy(resource) |
|
270 |
|
|
271 |
@staticmethod |
|
258 | 272 |
def allDirty(resourceList): |
259 | 273 |
for r in resourceList: |
260 | 274 |
r.setDirty() |
... | ... | |
327 | 341 |
else: |
328 | 342 |
il2 = [(r.entity.entityName,r.resourceName,r.entity.entityKey,r.policy.policyName) for r in rl2] |
329 | 343 |
ol2 = Resource.con().set_holding(context=Resource.Context,set_holding=il2) |
330 |
|
|
344 |
|
|
331 | 345 |
rejectedList = [] |
332 | 346 |
|
333 | 347 |
|
... | ... | |
396 | 410 |
self.policy = policy |
397 | 411 |
self.setDirty(True) |
398 | 412 |
|
413 |
def setFromPolicy(self): |
|
414 |
self.set(quantity=self.policy.quantity,capacity=self.policy.capacity) |
|
415 |
|
|
399 | 416 |
def quantity(self, query=False): |
400 | 417 |
if(query): |
401 | 418 |
self.load() |
... | ... | |
404 | 421 |
|
405 | 422 |
|
406 | 423 |
def load(self,dirtyOnly=True): |
424 |
if(not self.policy.isDummy()): |
|
425 |
self.policy.load() |
|
407 | 426 |
return Resource.loadMany([self],dirtyOnly) == [] |
408 | 427 |
|
409 | 428 |
def save(self,dirtyOnly=True): |
... | ... | |
454 | 473 |
return not (self.__eq__(other)) |
455 | 474 |
|
456 | 475 |
|
476 |
def inverse(self): |
|
477 |
ret = copy.copy(self) |
|
478 |
ret.resources_quant = [(r,-q) for r,q in ret.resources_quant] |
|
479 |
return ret |
|
480 |
|
|
457 | 481 |
def canChange(self): |
458 | 482 |
return self.state == Commission.CommissionState.NOT_ISSUED |
459 | 483 |
|
... | ... | |
502 | 526 |
allEntities = {} |
503 | 527 |
|
504 | 528 |
@staticmethod |
505 |
def get(name="", key="", parent=None):
|
|
529 |
def getClass(className,name="", key="", parent=None):
|
|
506 | 530 |
e = Entity.allEntities.get(name) |
507 | 531 |
if(e == None): |
508 |
e = Entity()
|
|
532 |
e = locals()[className]()
|
|
509 | 533 |
if(name == "system" or name == ""): |
510 | 534 |
e.set("system", "", None) |
511 | 535 |
else: |
512 | 536 |
cexn(parent == None, "Entity.get of a non-existent entity with name {0} and no parent.", name) |
513 |
cexn(not isinstance(parent, Entity), "Entity.get parent of {0} is not an Entity!", name) |
|
537 |
#cexn(not isinstance(parent, Entity), "Entity.get parent of {0} is not an Entity!", name)
|
|
514 | 538 |
e.set(name, key, parent) |
515 | 539 |
Entity.allEntities[name] = e |
516 | 540 |
|
517 | 541 |
return e |
518 | 542 |
|
519 | 543 |
@staticmethod |
544 |
def get(name="", key="", parent=None): |
|
545 |
Entity.get("Entity",name,key,parent) |
|
546 |
|
|
547 |
|
|
548 |
@staticmethod |
|
520 | 549 |
def list(): |
521 | 550 |
return [v for k, v in Entity.allEntities.iteritems()] |
522 | 551 |
|
... | ... | |
593 | 622 |
# cexn(self != Entity.allEntities.get(self.entityName),"Entity {0} does not exist in global dict",self.entityName) |
594 | 623 |
pass |
595 | 624 |
|
625 |
def getChildren(self): |
|
626 |
list = Entity.con().list_entities(context=Entity.Context,entity=self.entityName,key=self.entityKey) |
|
627 |
return [Entity.get(e,"",self) for e in list] |
|
628 |
|
|
596 | 629 |
def reset(self): |
597 | 630 |
self.set(None, None, None) |
598 | 631 |
|
... | ... | |
684 | 717 |
return Commission.denyAll(valid) == [] |
685 | 718 |
|
686 | 719 |
|
720 |
def clearFinished(self): |
|
721 |
self.commissions = [c for c in self.commissions() if(c.canChange())] |
|
722 |
|
|
723 |
######################################################################################################### |
|
724 |
|
|
725 |
class ResourceHolder(Entity): |
|
726 |
|
|
727 |
root = Entity.get("pgerakios", "key1",Entity.get()) |
|
728 |
resourceNames = ["pithos","cyclades.vm","cyclades.cpu","cyclades.mem"] |
|
729 |
|
|
730 |
def __init__(self): |
|
731 |
super(Entity,self).__init__() |
|
732 |
self.commission = Commission(self) |
|
733 |
for r in ResourceHolder.resourceNames: |
|
734 |
self.addResource(r) |
|
735 |
|
|
736 |
def newCommission(self): |
|
737 |
self.commission = Commission(self) |
|
738 |
return self.commission |
|
739 |
|
|
740 |
def loadResources(self): |
|
741 |
self.getResource(True) |
|
742 |
|
|
743 |
def commit(self): |
|
744 |
self.issue() |
|
745 |
return self.commission.accept() |
|
746 |
|
|
747 |
def reject(self): |
|
748 |
self.issue() |
|
749 |
return self.commission.reject() |
|
750 |
|
|
751 |
def release(self): |
|
752 |
if(not self.commission.canChange()): |
|
753 |
exn("The joinGroup commission is not finalized! Nothing to do.") |
|
754 |
# commit the inverse stuff (send stuff back to groups) |
|
755 |
self.commission = self.commission.inverse() |
|
756 |
b = self.commit() |
|
757 |
self.newCommission() |
|
758 |
# Remove entity |
|
759 |
return b and super(ResourceHolder,self).release() |
|
760 |
|
|
761 |
class Group(ResourceHolder): |
|
762 |
|
|
763 |
groupRoot = Entity.getClass("Group","group","group",ResourceHolder.root) |
|
764 |
systemGroupName = "system" |
|
765 |
systemGroupKey = "system" |
|
766 |
|
|
767 |
@staticmethod |
|
768 |
def getSystemGroup(self): |
|
769 |
return Group.get(Group.systemGroupName,Group.systemGroupKey) |
|
770 |
|
|
771 |
@staticmethod |
|
772 |
def listGroups(): |
|
773 |
return Group.groupRoot.getChildren() |
|
774 |
|
|
775 |
@staticmethod |
|
776 |
def get(name,key): |
|
777 |
ret = Entity.getClass("Group",name,key,Group.groupRoot) |
|
778 |
if(name == Group.systemGroupName): |
|
779 |
ret.makeSystem() |
|
780 |
elif(ret.exists(True) == False): |
|
781 |
ret.drawResources() |
|
782 |
return ret |
|
783 |
|
|
784 |
def __init__(self): |
|
785 |
super(ResourceHolder,self).__init__() |
|
786 |
self.users = [] |
|
787 |
self.userResourcePolicies = {} |
|
788 |
self.initializedSystem = False |
|
789 |
|
|
790 |
# load policies for groups |
|
791 |
self.loadGroupResourcePolicies() |
|
792 |
# load policies for users |
|
793 |
self.loadUserResourcePolicies() |
|
794 |
|
|
795 |
def loadGroupResourcePolicies(self): |
|
796 |
for r in self.getResources(): |
|
797 |
r.policy.load() |
|
798 |
|
|
799 |
def loadUserResourcePolicies(self): |
|
800 |
for r in self.resourceNames: |
|
801 |
self.userResourcePolicies[r] = Policy.get("{0}.{1}".format(self.entityName,r)) |
|
802 |
|
|
803 |
|
|
804 |
def getUserPolicyFor(self,resourceName): |
|
805 |
return self.userResourcePolicies[resourceName] |
|
806 |
|
|
807 |
def getUserPolicies(self): |
|
808 |
return self.userResourcePolicies |
|
809 |
|
|
810 |
def makeSystem(self): |
|
811 |
if(self.initializedSystem): |
|
812 |
return |
|
813 |
#TODO: create system resources here |
|
814 |
self.initializedSystem = True |
|
815 |
|
|
816 |
|
|
817 |
def drawResources(self): |
|
818 |
for r in self.getResources(): |
|
819 |
self.commission.addResource(r,r.policy.quantity) |
|
820 |
# |
|
821 |
self.commission.commit() |
|
822 |
|
|
823 |
def savePolicyQuantities(self,**kwargs): |
|
824 |
res = self.getResources() |
|
825 |
policies = [] |
|
826 |
for name,quantity in kwargs: |
|
827 |
r = self.getResource(name) |
|
828 |
r.policy.quantity = quantity |
|
829 |
policies.append(r) |
|
830 |
Policy.save(policies) |
|
831 |
|
|
832 |
|
|
833 |
class User(ResourceHolder): |
|
834 |
|
|
835 |
userRoot = Entity.getClass("User","user","user",ResourceHolder.root) |
|
836 |
|
|
837 |
@staticmethod |
|
838 |
def listUsers(): |
|
839 |
return User.userRoot.getChildren() |
|
840 |
|
|
841 |
@staticmethod |
|
842 |
def get(name,key): |
|
843 |
return Entity.getClass("User",name,key,User.userRoot) |
|
844 |
|
|
845 |
def __init__(self): |
|
846 |
super(ResourceHolder,self).__init__(None) |
|
847 |
self.groups = [] |
|
848 |
self.loadPolicy() |
|
849 |
|
|
850 |
|
|
851 |
def reload(self): |
|
852 |
# order does matter! |
|
853 |
self.clearFinished() |
|
854 |
self.reject() |
|
855 |
self.loadResources() |
|
856 |
self.loadPolicies() |
|
857 |
|
|
858 |
def loadPolices(self): |
|
859 |
dict = {} |
|
860 |
for g in self.groups: |
|
861 |
for r in self.resourceNames: |
|
862 |
p = g.getUserPolicyFor(r.name) |
|
863 |
if(dict[r.name] == None): |
|
864 |
dict[r.name] = Policy.copy(p) |
|
865 |
else: |
|
866 |
dict[r.name] = Policy.union(dict[r.name],p) |
|
867 |
|
|
868 |
# Change user policy to dummy !!! its a copy of the group policy so |
|
869 |
# we can modify its fields |
|
870 |
for r in self.getResources(): |
|
871 |
dict[r.name].setDummy(True) |
|
872 |
r.setPolicy(dict[r.name]) |
|
873 |
## FIXME: THIS IS NOT CORRECT |
|
874 |
r.setFromPolicy() |
|
875 |
|
|
876 |
|
|
877 |
def joinGroup(self,group): |
|
878 |
self.groups.append(group) |
|
879 |
self.groups.users.append(self) |
|
880 |
# |
|
881 |
for r in self.getResources(): |
|
882 |
groupUserPolicy = group.getUserPolicyFor(r.resourceName) |
|
883 |
self.commission.addResource(r,groupUserPolicy.quantity) |
|
884 |
self.commit() |
|
885 |
|
|
886 |
|
|
887 |
# Main program |
|
888 |
|
|
889 |
try: |
|
890 |
|
|
891 |
# Group1 |
|
892 |
group1 = Group.get("group1","group1") |
|
893 |
|
|
894 |
#["pithos","cyclades.vm","cyclades.cpu","cyclades.mem"] |
|
895 |
group1.savePolicyQuantities('pithos'=10,'cyclades.vm'=2,'cyclades.mem'=3) |
|
896 |
|
|
897 |
|
|
898 |
user1 = User.get("prodromos", "key1") |
|
899 |
user1.joinGroup(group1) |
|
900 |
|
|
901 |
finally: |
|
902 |
for e in Entity.list(): |
|
903 |
if(e.entityName != "system" and e.entityName != "pgerakios"): |
|
904 |
e.release() |
|
905 |
|
|
906 |
|
|
907 |
|
|
908 |
|
|
909 |
|
|
910 |
printf("Hello world!") |
|
911 |
|
|
912 |
exit(0) |
|
913 |
|
|
914 |
|
|
687 | 915 |
# Main program |
688 | 916 |
root = Entity.get() |
689 | 917 |
#TODO: implement Entity.get recursively !! using get_entity !!!! |
Also available in: Unified diff