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