Class: OMF::SFA::AM::AMScheduler
- Inherits:
-
Base::LObject
- Object
- Base::LObject
- OMF::SFA::AM::AMScheduler
- Defined in:
- lib/omf-sfa/am/am_scheduler.rb
Overview
This class implements a default resource scheduler
Instance Method Summary collapse
-
#create_resource(resource_descr, type_to_create, oproperties, authorizer) ⇒ OResource
Create a resource of specific type given its description in a hash.
-
#get_nil_account ⇒ OAccount
It returns the default account, normally used for admin account.
-
#initialize ⇒ AMScheduler
constructor
A new instance of AMScheduler.
-
#lease_component(lease, component) ⇒ Boolean
Accept or reject the reservation of the component.
-
#release_resource(resource, authorizer) ⇒ Boolean
Releases/destroys the given resource.
Constructor Details
Instance Method Details
#create_resource(resource_descr, type_to_create, oproperties, authorizer) ⇒ OResource
Create a resource of specific type given its description in a hash. If the type or the resource is physical then we create a clone of itself and assign it to the user who asked for it (conceptually a physical resource even though it is exclusive, is never given to the user but instead we provide him a clone of the resource). If the type is a ‘lease’ then we normally create a lease object.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/omf-sfa/am/am_scheduler.rb', line 30 def create_resource(resource_descr, type_to_create, oproperties, ) debug "create_resource: resource_descr:'#{resource_descr}' type_to_create:'#{type_to_create}' oproperties:'#{oproperties}' authorizer:'#{.inspect}'" if type_to_create.eql?('node') desc = resource_descr.dup desc[:account] = get_nil_account() type = type_to_create.camelize base_resource = eval("OMF::SFA::Resource::#{type}").first(desc) if base_resource.nil? || !base_resource.available raise UnknownResourceException.new "Resource '#{desc.inspect}' is not available or doesn't exist" end # create a clone vr = base_resource.clone vr.account = .account vr.provided_by = base_resource vr.save base_resource.provides << vr base_resource.save return vr elsif type_to_create.eql?('OLease') resource_descr[:resource_type] = type_to_create lease = OMF::SFA::Resource::OLease.create(resource_descr) lease.valid_from = oproperties[:valid_from] lease.valid_until = oproperties[:valid_until] #lease.status = :pending raise UnavailableResourceException.new "Cannot create '#{resource_descr.inspect}'" unless lease.save return lease else raise "Uknown type of resource '#{type_to_create}'. Expected one of 'Node' or 'OLease'" end end |
#get_nil_account ⇒ OAccount
It returns the default account, normally used for admin account.
135 136 137 |
# File 'lib/omf-sfa/am/am_scheduler.rb', line 135 def get_nil_account() @nil_account end |
#lease_component(lease, component) ⇒ Boolean
Accept or reject the reservation of the component
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/omf-sfa/am/am_scheduler.rb', line 107 def lease_component(lease, component) # TODO: Implement a basic FCFS for the competing leases of a component. # Basic Component provides itself(clones) so many times as the accepted leases on it. debug "lease_component: lease:'#{lease.name}' to component:'#{component.name}'" base = component.provided_by base.leases.each do |l| if (lease.valid_from >= l.valid_until || lease.valid_until <= l.valid_from) #all ok, do nothing elsif (lease.valid_from <= l.valid_from && lease.valid_until > l.valid_from)#overlapping time raise UnavailableResourceException.new "Cannot lease '#{component.name}', because it is unavailable for the requested time." elsif (lease.valid_from >= l.valid_from && lease.valid_from <= l.valid_until)#overlapping time raise UnavailableResourceException.new "Cannot lease '#{component.name}', because it is unavailable for the requested time." end end lease.status = "accepted" base.leases << lease base.save component.leases << lease component.save #@am_liaison.enable_lease(lease, component) return true end |
#release_resource(resource, authorizer) ⇒ Boolean
Releases/destroys the given resource
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/omf-sfa/am/am_scheduler.rb', line 74 def release_resource(resource, ) debug "release_resource: resource-> '#{resource.to_json}'" unless resource.is_a? OMF::SFA::Resource::OResource raise "Expected OResource but got '#{resource.inspect}'" end base = resource.provided_by unless resource.leases.empty? base.leases.each do |l| if (l.id == resource.leases.first.id) time = Time.now if (l.valid_until <= time) l.status = "past" else l.status = "cancelled" end end end msg = resource.leases.first.component_leases.destroy! raise "Failed to destroy component_leases" unless msg end resource = resource.destroy! raise "Failed to destroy resource" unless resource resource end |