akurkin/rancher-api

View on GitHub
lib/rancher/api/models/instance/action.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'faye/websocket'
require 'eventmachine'

module Rancher
  module Api
    class Instance
      # Few possible actions are:
      #   - execute shell command
      #   - render logs
      #   - restart
      #
      class Action
        include Her::Model

        attributes :token, :url, :response

        def run!
          uri = URI.parse(url)
          uri.userinfo = "#{Rancher::Api.configuration.access_key}:#{Rancher::Api.configuration.secret_key}"
          uri.query = "token=#{token}"

          self.response = []

          EM.run do
            # 15 seconds timeout in case of slow operation
            #
            EM.add_timer(15) do
              EM.stop
            end

            ws = Faye::WebSocket::Client.new(uri.to_s)

            ws.on :message do |event|
              response << Base64.decode64(event.data)
            end

            ws.on :close do |_event|
              ws = nil
              EM.stop
            end
          end

          self.response = response.join

          self
        end
      end
    end
  end
end