Class: Wakame::Service::ServiceInstance

Inherits:
Wakame::StatusDB::Model show all
Includes:
ThreadImmutable
Defined in:
lib/wakame/service.rb

Overview

The data model represents a service instance. Status transition: STATUS_INIT -> [STATUS_OFFLINE|STATUS_ONLINE|STATUS_FAIL] -> STATUS_END Progress status: STATUS_NONE, STATUS_MIGRATING, STATUS_PROPAGATING,

Constant Summary

Constants included from AttributeHelper

AttributeHelper::CLASS_TYPE_KEY, AttributeHelper::CONVERT_CLASSES, AttributeHelper::PRIMITIVE_CLASSES

Instance Method Summary collapse

Methods included from ThreadImmutable

#bind_thread, included, #target_thread, #target_thread?, #thread_check

Methods inherited from Wakame::StatusDB::Model

#delete, #dirty?, #id, inherited, #new_record?, #on_after_delete, #on_after_load, #on_before_delete, #on_before_load, #reload, #save

Methods included from AttributeHelper

#dump_attrs, #retrieve_attr_attribute

Instance Method Details

#bind_cloud_host(new_cloud_host) ⇒ Object



816
817
818
819
820
821
822
823
824
825
826
# File 'lib/wakame/service.rb', line 816

def bind_cloud_host(new_cloud_host)
  return if !self.resource.require_agent || self.cloud_host_id == new_cloud_host.id
  raise "The host (#{new_cloud_host.id}) was assigned same service already: #{resource.class}" if new_cloud_host.has_resource_type?(resource)
  
  unbind_cloud_host

  self.cloud_host_id = new_cloud_host.id
  self.save
  
  ED.fire_event(Event::ServiceBoundHost.new(self, new_cloud_host))
end

#bind_cluster(cluster) ⇒ Object



876
877
878
879
880
881
882
883
884
# File 'lib/wakame/service.rb', line 876

def bind_cluster(cluster)
  return if self.cluster_id == cluster.id

  unbind_cluster
  self.cluster_id = cluster.id
  self.save

  ED.fire_event(Event::ServiceBoundCluster.new(self, cluster))
end

#bind_resource(resource) ⇒ Object



847
848
849
850
851
852
853
854
855
# File 'lib/wakame/service.rb', line 847

def bind_resource(resource)
  return if self.resource_id == resource.id

  unbind_resource
  self.resource_id = resource.id
  self.save

  #ED.fire_event(Event::ServiceBoundCluster.new(self, cluster))
end

#child_instancesObject



913
914
915
916
917
918
919
920
921
# File 'lib/wakame/service.rb', line 913

def child_instances
  ary = []
  self.cluster.dg.children(resource.class).each { |r|
    self.cluster.each_instance(r.class){ |i|
      ary << i
    }
  }
  ary.flatten
end

#cloud_hostObject



810
811
812
813
814
# File 'lib/wakame/service.rb', line 810

def cloud_host
  raise "The associated resource is not needed to have agent." unless self.resource.require_agent
    
  self.cloud_host_id.nil? ? nil : CloudHost.find(self.cloud_host_id)
end

#clusterObject



871
872
873
874
# File 'lib/wakame/service.rb', line 871

def cluster
  return nil if self.cluster_id.nil?
  ServiceCluster.find(self.cluster_id)
end

#export_bindingObject



899
900
901
# File 'lib/wakame/service.rb', line 899

def export_binding
  binding
end

#parent_instancesObject



903
904
905
906
907
908
909
910
911
# File 'lib/wakame/service.rb', line 903

def parent_instances
  ary = []
  self.cluster.dg.parents(resource.class).each { |r|
    self.cluster.each_instance(r.class){ |i|
      ary << i
    }
  }
  ary.flatten
end

#resourceObject



842
843
844
845
# File 'lib/wakame/service.rb', line 842

def resource
  return nil if self.resource_id.nil?
  Resource.find(self.resource_id)
end

#unbind_cloud_hostObject



829
830
831
832
833
834
835
836
837
838
839
# File 'lib/wakame/service.rb', line 829

def unbind_cloud_host
  return if self.cloud_host_id.nil?

  old_item = self.cloud_host
  self.cloud_host_id = nil
  
  self.save

  ED.fire_event(Event::ServiceUnboundHost.new(self, old_item))
  old_item
end

#unbind_clusterObject



887
888
889
890
891
892
893
894
895
896
# File 'lib/wakame/service.rb', line 887

def unbind_cluster
  return if self.cluster_id.nil?
  old_item = self.cluster_id

  self.cluster_id = nil
  self.save

  ED.fire_event(Event::ServiceUnboundCluster.new(self, old_item))
  old_item
end

#unbind_resourceObject



858
859
860
861
862
863
864
865
866
867
# File 'lib/wakame/service.rb', line 858

def unbind_resource
  return if self.resource_id.nil?
  old_item = self.resource_id

  self.resource_id = nil
  self.save

  #ED.fire_event(Event::ServiceUnboundCluster.new(self, old_item))
  old_item
end

#update_status(new_status, changed_at = Time.now, fail_message = nil) ⇒ Object



782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
# File 'lib/wakame/service.rb', line 782

def update_status(new_status, changed_at=Time.now, fail_message=nil)
  if @status != new_status
    prev_status = @status
    @status = new_status
    @status_changed_at = changed_at
    
    self.save

    event = Event::ServiceStatusChanged.new(self.id, resource, new_status, prev_status)
    event.time = @status_changed_at.dup
    ED.fire_event(event)

    tmp_event = nil
    if prev_status != Service::STATUS_ONLINE && new_status == Service::STATUS_ONLINE
      tmp_event = Event::ServiceOnline.new(self.id, self.resource)
      tmp_event.time = @status_changed_at.dup
    elsif prev_status != Service::STATUS_OFFLINE && new_status == Service::STATUS_OFFLINE
      tmp_event = Event::ServiceOffline.new(self.id, self.resource)
      tmp_event.time = @status_changed_at.dup
    elsif prev_status != Service::STATUS_FAIL && new_status == Service::STATUS_FAIL
      tmp_event = Event::ServiceFailed.new(self.id, self.resource, fail_message)
      tmp_event.time = @status_changed_at.dup
    end
    ED.fire_event(tmp_event) if tmp_event

  end
end