discover

in source/code/plugins/in_wlm_discovery.rb [43:151]


    def discover
      is_azure_vm = get_vm_metadata()
      if is_azure_vm
        omi_lib = WLM::WLMOMIDiscoveryCollector.new(@omi_mapping_path)
        discovery_data = omi_lib.get_discovery_data()
        wlm_formatter = WLM::WLMDataFormatter.new(@wlm_class_file)
        discovery_data.each do |wclass|
          if wclass["class_name"].to_s == "Universal Linux Computer"
            wclass["discovery_data"][0]["CSName"] = OMS::Common.get_fully_qualified_domain_name
          end
          discovery_xml = wlm_formatter.get_discovery_xml(wclass)
          instance = {}
          instance["Host"] = OMS::Common.get_fully_qualified_domain_name
          instance["OSType"] = "Linux"
          instance["ObjectName"] = wclass["class_name"]
          instance["EncodedDataItem"] = Base64.strict_encode64(discovery_xml)
          wrapper = {
            "DataType"=>"WLM_LINUX_INSTANCE_DATA_BLOB",
            "IPName"=>"InfrastructureInsights",
            "DataItems"=>[instance]
          }
          router.emit("oms.wlm.discovery", Time.now.to_f, wrapper)
        end 
        update_discovery_time(Time.now.to_i)
        $log.debug "Discovery data for #{@omi_mapping_path} generated successfully"
      end
    end 

    def run_periodic
      begin
        timeout_value = @default_timeout
        last_discovery_time = Time.at(get_last_discovery_time.to_i)
        if(last_discovery_time.to_i > 0)
          next_discovery_time = last_discovery_time + @default_timeout
          current_time = Time.now
          if(current_time >= next_discovery_time)
            discover
          else
            timeout_value = next_discovery_time - current_time
          end 
        else
          discover
        end 
        @mutex.lock
        done = @finished
        until done
          $log.debug "#{timeout_value} seconds befor next discovery"
          @condition.wait(@mutex, timeout_value)
          timeout_value = @default_timeout
          done = @finished
          @mutex.unlock
          if !done
            discover
          end
          @mutex.lock
        end 
        @mutex.unlock
        rescue => e
          $log.error "Error generating discovery data #{e}"
        end 
    end 

    def update_discovery_time(time)
      begin
        time_file = File.open(@discovery_time_file, "w")
        time_file.write(time.to_s)
      rescue => e
        $log.debug "Error updating last discovery time #{e}"
      ensure
        time_file.close unless time_file.nil?
      end 
    end 

    def get_last_discovery_time()
      begin
        last_discovery_time = File.open(@discovery_time_file, &:readline)
        return last_discovery_time.strip()
      rescue => e
        $log.debug "Error reading last discovery time #{e}"
        return ""
      end 
    end 

    def get_vm_metadata()
      begin
        url_metadata="http://169.254.169.254/metadata/instance?api-version=#{@metadata_api_version}"
        metadata_json = open(url_metadata,"Metadata"=>"true").read
        metadata_instance = { 
          "EncodedVMMetadata" => Base64.strict_encode64(metadata_json),
          "Hostname" => OMS::Common.get_fully_qualified_domain_name,
          "ApiVersion" => @metadata_api_version
        }
        wrapper = {
          "DataType"=>"WLM_LINUX_VM_METADATA_BLOB",
          "IPName"=>"InfrastructureInsights",
          "DataItems"=>[metadata_instance]
        }
        router.emit("oms.wlm.vm.metadata", Time.now.to_f, wrapper)
      rescue => e
        $log.error "Error sending VM metadata #{e}"
        return false
      end 
      return true
    end 

  end 

end