Class: OpenC3::TriggerGroupMicroservice

Inherits:
Microservice show all
Defined in:
lib/openc3/microservices/trigger_group_microservice.rb

Overview

The trigger microservice starts a manager then gets the activities from the sorted set in redis and updates the schedule for the manager. Timeline will then wait for an update on the timeline stream this will trigger an update again to the schedule.

Constant Summary collapse

TOPIC_LOOKUP =

This lookup is mapping all the different trigger notifications which are primarily sent by notify in TriggerModel

{
  'error' => :no_op, # Sent by TriggerGroupWorker
  'created' => :created_trigger_event,
  'updated' => :rebuild_trigger_event,
  'deleted' => :deleted_trigger_event,
  'enabled' => :updated_trigger_event,
  'disabled' => :updated_trigger_event,
  'true' => :no_op, # Sent by TriggerGroupWorker
  'false' => :no_op, # Sent by TriggerGroupWorker
}

Instance Attribute Summary collapse

Attributes inherited from Microservice

#count, #custom, #error, #logger, #microservice_status_thread, #secrets, #state

Instance Method Summary collapse

Methods inherited from Microservice

#as_json, #microservice_cmd, run, #setup_microservice_topic

Constructor Details

#initialize(*args) ⇒ TriggerGroupMicroservice

Returns a new instance of TriggerGroupMicroservice.



608
609
610
611
612
613
614
615
616
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 608

def initialize(*args)
  super(*args)
  # The name is passed in via the trigger_group_model as "#{scope}__TRIGGER_GROUP__#{name}"
  @group = @name.split('__')[2]
  @share = TriggerGroupShare.new(scope: @scope)
  @manager = TriggerGroupManager.new(name: @name, logger: @logger, scope: @scope, group: @group, share: @share)
  @manager_thread = nil
  @read_topic = true
end

Instance Attribute Details

#groupObject (readonly)

Returns the value of attribute group.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def group
  @group
end

#managerObject (readonly)

Returns the value of attribute manager.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def manager
  @manager
end

#manager_threadObject (readonly)

Returns the value of attribute manager_thread.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def manager_thread
  @manager_thread
end

#nameObject (readonly)

Returns the value of attribute name.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def name
  @name
end

#scopeObject (readonly)

Returns the value of attribute scope.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def scope
  @scope
end

#shareObject (readonly)

Returns the value of attribute share.



594
595
596
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 594

def share
  @share
end

Instance Method Details

#block_for_updatesObject



632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 632

def block_for_updates
  @read_topic = true
  while @read_topic && !@cancel_thread
    begin
      AutonomicTopic.read_topics(@topics) do |_topic, _msg_id, msg_hash, _redis|
        break if @cancel_thread
        @logger.debug "TriggerGroupMicroservice block_for_updates: #{msg_hash}"
        # Process trigger notifications created by TriggerModel notify
        if msg_hash['type'] == 'trigger'
          data = JSON.parse(msg_hash['data'], :allow_nan => true, :create_additions => true)
          public_send(TOPIC_LOOKUP[msg_hash['kind']], data)
        end
      end
    rescue StandardError => e
      @logger.error "TriggerGroupMicroservice failed to read topics #{@topics}\n#{e.formatted}"
    end
  end
end

#created_trigger_event(data) ⇒ Object

Add the trigger to the share.



656
657
658
659
660
661
662
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 656

def created_trigger_event(data)
  @logger.debug "TriggerGroupMicroservice created_trigger_event #{data}"
  if data['group'] == @group
    @share.trigger_base.add(trigger: data)
    @manager.refresh()
  end
end

#deleted_trigger_event(data) ⇒ Object

Remove the trigger from the share.



682
683
684
685
686
687
688
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 682

def deleted_trigger_event(data)
  @logger.debug "TriggerGroupMicroservice deleted_trigger_event #{data}"
  if data['group'] == @group
    @share.trigger_base.remove(trigger: data)
    @manager.refresh()
  end
end

#no_op(data) ⇒ Object



651
652
653
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 651

def no_op(data)
  @logger.debug "TriggerGroupMicroservice web socket event: #{data}"
end

#rebuild_trigger_event(data) ⇒ Object

When a trigger is updated it could change items which modifies topics and potentially adds or removes topics so refresh everything just to be safe



673
674
675
676
677
678
679
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 673

def rebuild_trigger_event(data)
  @logger.debug "TriggerGroupMicroservice rebuild_trigger_event #{data}"
  if data['group'] == @group
    @share.trigger_base.update(trigger: data)
    @read_topic = false
  end
end

#runObject



618
619
620
621
622
623
624
625
626
627
628
629
630
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 618

def run
  @logger.info "TriggerGroupMicroservice running"
  @manager_thread = Thread.new { @manager.run }
  loop do
    triggers = TriggerModel.all(scope: @scope, group: @group)
    @share.trigger_base.rebuild(triggers: triggers)
    @manager.refresh() # Everytime we do a full base update we refesh the manager
    break if @cancel_thread
    block_for_updates()
    break if @cancel_thread
  end
  @logger.info "TriggerGroupMicroservice exiting"
end

#shutdownObject



690
691
692
693
694
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 690

def shutdown
  @read_topic = false
  @manager.shutdown()
  super
end

#updated_trigger_event(data) ⇒ Object



664
665
666
667
668
669
# File 'lib/openc3/microservices/trigger_group_microservice.rb', line 664

def updated_trigger_event(data)
  @logger.debug "TriggerGroupMicroservice updated_trigger_event #{data}"
  if data['group'] == @group
    @share.trigger_base.update(trigger: data)
  end
end