You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2011/02/28 10:43:19 UTC

RHEV-M driver fixes

Hi,

This is just 'bugfix' patch for RHEV-M driver in Deltacloud.
Things fixed:

  * Error reporting from backend
  * Realms collection
  * Configuration
    (provider URL is now no longer defined in driver itself but in config/drivers.yaml

Also I did some small cosmetic changes to Deltacloud UI. Because ID's of
RHEV-M machines are UUID string (longer than 20 chars), I used smart
shortening for those (abcd...a123a). Also I replaced states with nice graphic.
Current state is accessible on mouse-over and inside instance details.

  -- Michal


Re: [PATCH core] RHEV-M fixes (realms, client). Instance UI enhancements (images, ID shortening)

Posted by Michal Fojtik <mf...@redhat.com>.
On 01/03/11 18:07 +0100, Tomas Sedovic wrote:
>ACK

Pushed, thanks for testing this Tomas!

   -- Michal

>
>On 02/28/2011 10:43 AM, mfojtik@redhat.com wrote:
>>From: Michal Fojtik<mf...@redhat.com>
>>
>>---
>>  server/bin/deltacloudd                             |    1 +
>>  server/config/drivers.yaml                         |    3 ++
>>  .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   24 +++++++++++++++++--
>>  .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   20 +++++++++-------
>>  .../lib/deltacloud/helpers/application_helper.rb   |   12 ++++++++++
>>  server/public/images/pending.png                   |  Bin 0 ->  792 bytes
>>  server/public/images/running.png                   |  Bin 0 ->  740 bytes
>>  server/public/images/stopped.png                   |  Bin 0 ->  779 bytes
>>  server/views/instances/index.html.haml             |    6 ++--
>>  9 files changed, 51 insertions(+), 15 deletions(-)
>>  create mode 100644 server/public/images/pending.png
>>  create mode 100644 server/public/images/running.png
>>  create mode 100644 server/public/images/stopped.png
>>
>>diff --git a/server/bin/deltacloudd b/server/bin/deltacloudd
>>index 70be6ca..addb1f5 100755
>>--- a/server/bin/deltacloudd
>>+++ b/server/bin/deltacloudd
>>@@ -105,6 +105,7 @@ else
>>    argv_opts<<  ['--rackup', 'config.ru' ]
>>    argv_opts<<  ['--chdir', dirname ]
>>    argv_opts<<  ['-e', options[:env] ]
>>+  argv_opts<<  ['--timeout', '60']
>>    argv_opts<<  ['--threaded', '-D', '--stats', '/stats']
>>
>>    argv_opts.flatten!
>>diff --git a/server/config/drivers.yaml b/server/config/drivers.yaml
>>index 3f34521..d028ca0 100644
>>--- a/server/config/drivers.yaml
>>+++ b/server/config/drivers.yaml
>>@@ -5,6 +5,9 @@
>>    :name: Mock
>>  :rhevm:
>>    :name: RHEVM
>>+  :entrypoints:
>>+    default:
>>+      default: "https://rhev-dc.lab.eng.brq.redhat.com:8443/rhevm-api-powershell"
>>  :rimuhosting:
>>    :name: RimuHosting
>>  :opennebula:
>>diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
>>index 09c025f..c1c7161 100644
>>--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
>>+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
>>@@ -25,6 +25,15 @@ require 'json'
>>  module RHEVM
>>
>>    class FixtureNotFound<  Exception; end
>>+  class ConnectionError<  StandardError
>>+    attr_reader :code, :cause, :details
>>+    def initialize(code, cause, message, details)
>>+      super(message)
>>+      @code = code
>>+      @cause = cause
>>+      @details = details
>>+    end
>>+  end
>>
>>    class Client
>>
>>@@ -51,7 +60,7 @@ module RHEVM
>>        opts ||= {}
>>        if @@COLLECTIONS.include?(method_name.to_sym)
>>          if opts[:id]
>>-          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}#{opts[:id]}"))
>>+          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}/#{opts[:id]}"))
>>            element = method_name.to_s
>>            element = 'data_centers' if method_name.eql?(:datacenters)
>>            @current_element = element
>>@@ -105,7 +114,12 @@ module RHEVM
>>        if ENV['RACK_ENV'] == 'test'
>>          response = mock_request(:get, uri, {}, headers)
>>        else
>>-        response = RestClient.get(uri, headers).to_s
>>+        puts "[RHEV-M] #{uri}"
>>+        begin
>>+          response = RestClient.get(uri, headers).to_s
>>+        rescue Exception =>  e
>>+          raise ConnectionError::new(500, "GET #{uri}", "#{e.message} (GET #{uri})", e.backtrace)
>>+        end
>>        end
>>        response
>>      end
>>@@ -127,7 +141,11 @@ module RHEVM
>>
>>      def discover_entry_points()
>>        return if @discovered
>>-      doc = Nokogiri.XML(get(@base_uri))
>>+      begin
>>+        doc = Nokogiri.XML(get(@base_uri))
>>+      rescue Exception =>  e
>>+        raise ConnectionError::new(500, "RHEV-M Connection Error (#{@base_uri})", "#{e.message} (#{@base_uri})", e.backtrace)
>>+      end
>>        doc.xpath('api/link').each() do |link|
>>          @entry_points[link['rel']] = @host + link['href']
>>        end
>>diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
>>index 8b4282f..3fd5365 100644
>>--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
>>+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
>>@@ -72,7 +72,7 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>>    # or setting provider using HTTP header X-Deltacloud-Provider to URL.
>>    #
>>    def provider_uri
>>-    'https://10.34.2.122:8443/rhevm-api-powershell'
>>+    Deltacloud::Drivers::driver_config[:rhevm][:entrypoints]['default']['default']
>>    end
>>
>>    define_instance_states do
>>@@ -203,7 +203,9 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>>
>>    def new_client(credentials)
>>      url = (Thread.current[:provider] || ENV['API_PROVIDER'] || provider_uri)
>>-    ::RHEVM::Client.new(credentials.user, credentials.password, url)
>>+    safely do
>>+      ::RHEVM::Client.new(credentials.user, credentials.password, url)
>>+    end
>>    end
>>
>>    def convert_instance(client, inst)
>>@@ -299,13 +301,13 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>>    # Disabling this error catching will lead to more verbose messages
>>    # on console (eg. response from RHEV-M API (so far I didn't figure our
>>    # how to pass those message to our exception handling tool)
>>-  #def catched_exceptions_list
>>-  #  {
>>-  #    :auth =>  RestClient::Unauthorized,
>>-  #    :error =>  RestClient::InternalServerError,
>>-  #    :glob =>  [ /RestClient::(\w+)/ ]
>>-  #  }
>>-  #end
>>+  def catched_exceptions_list
>>+    {
>>+      :auth =>  RestClient::Unauthorized,
>>+      :error =>  RestClient::InternalServerError,
>>+      :glob =>  [ /(RestClient|RHEVM)::(\w+)/ ]
>>+    }
>>+  end
>>
>>  end
>>
>>diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
>>index f1909b2..191a0c9 100644
>>--- a/server/lib/deltacloud/helpers/application_helper.rb
>>+++ b/server/lib/deltacloud/helpers/application_helper.rb
>>@@ -186,4 +186,16 @@ module ApplicationHelper
>>      end
>>    end
>>
>>+  def image_for_state(state)
>>+    state_img = "stopped" if (state!='RUNNING' or state!='PENDING')
>>+    "<img src='/images/#{state.downcase}.png' title='#{state}'/>"
>>+  end
>>+
>>+  def truncate_words(text, length = 10)
>>+    return nil unless text
>>+    return text if text.length<=length
>>+    end_string = "...#{text[(text.length-(length/2))..text.length]}"
>>+    "#{text[0..(length/2)]}#{end_string}"
>>+  end
>>+
>>  end
>>diff --git a/server/public/images/pending.png b/server/public/images/pending.png
>>new file mode 100644
>>index 0000000000000000000000000000000000000000..6753441a11065d1e2b10104dd0e59db34842856f
>>GIT binary patch
>>literal 792
>>zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
>>zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!x=BPqRCwC#R!>M2Q5gT;%<MnM(RHvj
>>z6VVDf2$fjW!RQYjB82MDAv$ylT8M5P+EWyi9Xdo2NYtf6bm>qe(qYN4OHpD4LV~g;
>>zySBEjy0h!%t~1m3y&Yv;(iL~Y%e>{szIpHW?f2uo@B7U%(==f#hX7kV90861M}Sn0
>>zz!+Qg*cf_o*z{EQ7)(5FLcv2Aegsn=V2kO{RL}X3xU|Y#*7F)x&WMTxh>bU1_0}lL
>>zrBiJ!u)nDus@x*qSjg${HJX6_kqJm?+LNi9XM(t_+bKZ8<S!f4y3^OX+F>aE2f~pI
>>zL{m$g(^MltSE~#i4PLkx9)|c#^6AvAvzM1eR4RZ4t~@%b?ra;le)0f3`#uljbBiEh
>>z^$6DK82B4Y2EZ=A2QKcdg}ZORK=S90W77|UgN6KNMMdah>W<sz+FRkxSQ_G)Jk)wb
>>zsK(=$T>=NqX^r-XLtN%>yhE{ebb$|C-p+vE50TkCC|2SsJOZBun$sHX5r?=SxjT7m
>>zrCor-&9JB=ngKG-1V&Z=?_u)m0M2EFMsV99fZuc~XJFL}YbGxiL0pT+>=3{^VLq$#
>>zW8O&D5VyoXDiUCt3#lP3J=d{aRY5m&SW5%t6a^7}C6hogrG~WGBFtrn!}mvHG4Nmk
>>z$S#Q&p0@-(UWgLs5SL;o)(!#Lx&Ft43$gLn??*<!OKs<Kf$WjE6B1}nYqUok;!+I7
>>zmc8DM7!iIch?c<B-X5iSPxqnS&Ct579z3ps6))y>i2P2#r?E-UCP(|G9|l9XJb}>4
>>z8PP_qm@?IJ*FACJi0@!`5R|%o%b}d2&3?;%?(0pxd;S5RqKJ9Bta#;Rgpd&`q8?Fg
>>zt$~#&jYuGph>YDYqm@U?UVWCyu%h<QS$CfQU$5g$kM(j$l>|Hg2^|5B06WHC0R{m2
>>W(HoU0sdYgB0000<MNUMnLSTZ#=yb^d
>>
>>literal 0
>>HcmV?d00001
>>
>>diff --git a/server/public/images/running.png b/server/public/images/running.png
>>new file mode 100644
>>index 0000000000000000000000000000000000000000..f74a91436191dc62eb6ad4316c2e6807fb1ed17d
>>GIT binary patch
>>literal 740
>>zcmV<A0vr8_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
>>zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!hDk(0RCwC#R^LlgVHkeCbIy*fri-~u
>>zjM+t$P!K^ELaXe?q91q{{R2VLO$FXqf(WHI1$Gl&RR2J9V?V&WQLJE)6@fxUNL%7G
>>zQ)hEqTkZ6|=bWh%@eI$2L7Wes?d<)Ym-qS3_kGVhp=lb*IV6;MxB^@Ou7I)&P^<_-
>>zh@zj(ooJM{phuH%qTpdn5qS*dGiV>|LWDv^?zWNH2`eXDB|tvajXr<X){7?(oyURt
>>zMtIe2`b0Xrgt2G@FWx^wVlj1p;5u3<{KrWF3Kf4`8w|EwK64YX#A}RCKgB|NPUmd*
>>z2C#qUIfVR2aPN5s;@@W<4BWt_f(W|;#Ib8QUbn|Lbfu*WucEz}NyZ@YYcH&jkf)Ct
>>zUkKs)tGL_WiTFgaY4{FCjQX0bL+J5V<JRfJ7w~TCA?8ytRM5#$WtuR-&m7}9<}kM+
>>zfNsup;ud&?2jRLMm6%G7L7`$YWl3wmF`i=%bA^I1=i0snG*o`o)0sDrWoyL+uDLy`
>>z69V*OnEVxmB1$tB=86?Pwgu=47BW%D#Mbf_T*=@H;hYm{xfI_1m^1cR-v()Y@EmiP
>>z%Q<TeX|n>dlcVVUGC>7sRf@8{2)(#saG1+Eoa=;u^!O8u%zs0FWYj32(&h3fE7y>p
>>zImUC$VJ_!zuI2WYVnp;+N!Z=ghMwvW&Nl1=YHMi4<}Lr71L8Bl$4~V7V|X@v8|@VS
>>zO89AIM5S6WtrLF2uD#7TN^PK3t-`_O9VSY45g(`>^nD)0ONvYq5>8q1ax)@u_X!Y!
>>z1fLm$Stv=EC2)gSa=IC<_8E`qa4L%1LDt;!+`nqan;sk0Q0yeT{|Q|I|Am0R0t^5@
>>WHt<xS!(=1?0000<MNUMnLSTYd-B(%w
>>
>>literal 0
>>HcmV?d00001
>>
>>diff --git a/server/public/images/stopped.png b/server/public/images/stopped.png
>>new file mode 100644
>>index 0000000000000000000000000000000000000000..b6cfd0b8f00132d106c0e214e8d0225015feb91e
>>GIT binary patch
>>literal 779
>>zcmV+m1N8ifP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
>>zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!tw}^dRCwC#R?lk_Q4pT@_D7PosWnX_
>>zp{4DiSRz%?OOT2ck$Nb^vlr<>v?%@o{R6aDK`KQoh!;;D4D?b&A{8{3fLaKtB{a1f
>>zj4{UaS7>(goY`z^qO>W^N<i}9BiVW1WWF~uZ#GN_0rgxQ>bx2P8Uh*u>MlU8MqrFp
>>zJU;jP{4E?NBq7dk4>98CjD^;UFn&244Wp@Iy6rXWShY!5CP11!<C}7}wqEPHa1mU-
>>z0g##;#)iJJ37P0Tth{^ytGV2x;WyDSGFvG?#^BG|Jf6V7^;=MgeSm!U6=>g*r8IVU
>>z!R{XdrT;k0Kb(Z@*VOdz+vtsL5w!|n)2I5*9XrwyI(hRp<bzM4u(E{t!0K_cg^EQC
>>zrGe7b3--Vjc=zBw#8T;@(a6WSQhZTU6Dpmme5dEq2yBIBK*v+_re@#{2XLFM1p1CP
>>z+9M8ey{dGVe66?z4!gt$54X30o`_>W45ngGS*ZlsaE~~|wQ)X3zBS(hTq-4ye~N>w
>>z+Cfm-D{n@5y92}05Z6q)YJ~s>jDyJjFit6U3;w&Q3@-T?z7_~DPF%zvm27q>R%u#p
>>za)B|+CZWh_dL+A%#}e2;#(GP;fcA((T=MyIARSb|)@&+!FOf_E$NEwLNm2f4LbA~w
>>zafnMk<ZFe1&B^$exy9UiFcMwB0E*F!B_XN-BQt2DJ>n3Te8{(Ib@wxf@WYAdd3^fl
>>zM8C^9(%0J!Znqmd$ZR1^gLFC#i%ZK8%dF0fMi$1=nn0{p8$|mZ#S-EWqVsCE=WM|1
>>z8f%xO6JqC@0DRZ<_rYXl>dA8IH9meu{IqHm@4So<%?K9)j}I-T4a`7mh%_RDShxCR
>>z1Z9U+%n7HK-E(0!9M!z=uU^LoUVFumYjJM;Cu|7#F9iG&U;vZq6mJi1`DFkA002ov
>>JPDHLkV1j$QW{&^>
>>
>>literal 0
>>HcmV?d00001
>>
>>diff --git a/server/views/instances/index.html.haml b/server/views/instances/index.html.haml
>>index d728ec5..d0ada19 100644
>>--- a/server/views/instances/index.html.haml
>>+++ b/server/views/instances/index.html.haml
>>@@ -14,17 +14,17 @@
>>      - @instances.each do |instance|
>>        %tr
>>          %td
>>-          = link_to instance.id, instance_url( instance.id )
>>+          = link_to truncate_words(instance.id), instance_url( instance.id )
>>          %td
>>            = link_to instance.owner_id, images_url
>>          %td
>>            = instance.name
>>          %td
>>-          = link_to instance.image_id, image_url( instance.image_id )
>>+          = link_to truncate_words(instance.image_id), image_url( instance.image_id )
>>          %td
>>            = instance.hardware_profile ? link_to(instance.hardware_profile, hardware_profile_url( instance.instance_profile.id )) : 'default'
>>          %td
>>-          = instance.state
>>+          = image_for_state(instance.state)
>>          %td
>>            -instance.actions.each do |action|
>>              =link_to_action action, self.send(:"#{action}_instance_url", instance.id), instance_action_method(action)
>

-- 
--------------------------------------------------------
Michal Fojtik, mfojtik@redhat.com
Deltacloud API: http://deltacloud.org
--------------------------------------------------------

Re: [PATCH core] RHEV-M fixes (realms, client). Instance UI enhancements (images, ID shortening)

Posted by Tomas Sedovic <ts...@redhat.com>.
ACK

On 02/28/2011 10:43 AM, mfojtik@redhat.com wrote:
> From: Michal Fojtik<mf...@redhat.com>
>
> ---
>   server/bin/deltacloudd                             |    1 +
>   server/config/drivers.yaml                         |    3 ++
>   .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   24 +++++++++++++++++--
>   .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   20 +++++++++-------
>   .../lib/deltacloud/helpers/application_helper.rb   |   12 ++++++++++
>   server/public/images/pending.png                   |  Bin 0 ->  792 bytes
>   server/public/images/running.png                   |  Bin 0 ->  740 bytes
>   server/public/images/stopped.png                   |  Bin 0 ->  779 bytes
>   server/views/instances/index.html.haml             |    6 ++--
>   9 files changed, 51 insertions(+), 15 deletions(-)
>   create mode 100644 server/public/images/pending.png
>   create mode 100644 server/public/images/running.png
>   create mode 100644 server/public/images/stopped.png
>
> diff --git a/server/bin/deltacloudd b/server/bin/deltacloudd
> index 70be6ca..addb1f5 100755
> --- a/server/bin/deltacloudd
> +++ b/server/bin/deltacloudd
> @@ -105,6 +105,7 @@ else
>     argv_opts<<  ['--rackup', 'config.ru' ]
>     argv_opts<<  ['--chdir', dirname ]
>     argv_opts<<  ['-e', options[:env] ]
> +  argv_opts<<  ['--timeout', '60']
>     argv_opts<<  ['--threaded', '-D', '--stats', '/stats']
>
>     argv_opts.flatten!
> diff --git a/server/config/drivers.yaml b/server/config/drivers.yaml
> index 3f34521..d028ca0 100644
> --- a/server/config/drivers.yaml
> +++ b/server/config/drivers.yaml
> @@ -5,6 +5,9 @@
>     :name: Mock
>   :rhevm:
>     :name: RHEVM
> +  :entrypoints:
> +    default:
> +      default: "https://rhev-dc.lab.eng.brq.redhat.com:8443/rhevm-api-powershell"
>   :rimuhosting:
>     :name: RimuHosting
>   :opennebula:
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> index 09c025f..c1c7161 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> @@ -25,6 +25,15 @@ require 'json'
>   module RHEVM
>
>     class FixtureNotFound<  Exception; end
> +  class ConnectionError<  StandardError
> +    attr_reader :code, :cause, :details
> +    def initialize(code, cause, message, details)
> +      super(message)
> +      @code = code
> +      @cause = cause
> +      @details = details
> +    end
> +  end
>
>     class Client
>
> @@ -51,7 +60,7 @@ module RHEVM
>         opts ||= {}
>         if @@COLLECTIONS.include?(method_name.to_sym)
>           if opts[:id]
> -          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}#{opts[:id]}"))
> +          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}/#{opts[:id]}"))
>             element = method_name.to_s
>             element = 'data_centers' if method_name.eql?(:datacenters)
>             @current_element = element
> @@ -105,7 +114,12 @@ module RHEVM
>         if ENV['RACK_ENV'] == 'test'
>           response = mock_request(:get, uri, {}, headers)
>         else
> -        response = RestClient.get(uri, headers).to_s
> +        puts "[RHEV-M] #{uri}"
> +        begin
> +          response = RestClient.get(uri, headers).to_s
> +        rescue Exception =>  e
> +          raise ConnectionError::new(500, "GET #{uri}", "#{e.message} (GET #{uri})", e.backtrace)
> +        end
>         end
>         response
>       end
> @@ -127,7 +141,11 @@ module RHEVM
>
>       def discover_entry_points()
>         return if @discovered
> -      doc = Nokogiri.XML(get(@base_uri))
> +      begin
> +        doc = Nokogiri.XML(get(@base_uri))
> +      rescue Exception =>  e
> +        raise ConnectionError::new(500, "RHEV-M Connection Error (#{@base_uri})", "#{e.message} (#{@base_uri})", e.backtrace)
> +      end
>         doc.xpath('api/link').each() do |link|
>           @entry_points[link['rel']] = @host + link['href']
>         end
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> index 8b4282f..3fd5365 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> @@ -72,7 +72,7 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>     # or setting provider using HTTP header X-Deltacloud-Provider to URL.
>     #
>     def provider_uri
> -    'https://10.34.2.122:8443/rhevm-api-powershell'
> +    Deltacloud::Drivers::driver_config[:rhevm][:entrypoints]['default']['default']
>     end
>
>     define_instance_states do
> @@ -203,7 +203,9 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>
>     def new_client(credentials)
>       url = (Thread.current[:provider] || ENV['API_PROVIDER'] || provider_uri)
> -    ::RHEVM::Client.new(credentials.user, credentials.password, url)
> +    safely do
> +      ::RHEVM::Client.new(credentials.user, credentials.password, url)
> +    end
>     end
>
>     def convert_instance(client, inst)
> @@ -299,13 +301,13 @@ class RHEVMDriver<  Deltacloud::BaseDriver
>     # Disabling this error catching will lead to more verbose messages
>     # on console (eg. response from RHEV-M API (so far I didn't figure our
>     # how to pass those message to our exception handling tool)
> -  #def catched_exceptions_list
> -  #  {
> -  #    :auth =>  RestClient::Unauthorized,
> -  #    :error =>  RestClient::InternalServerError,
> -  #    :glob =>  [ /RestClient::(\w+)/ ]
> -  #  }
> -  #end
> +  def catched_exceptions_list
> +    {
> +      :auth =>  RestClient::Unauthorized,
> +      :error =>  RestClient::InternalServerError,
> +      :glob =>  [ /(RestClient|RHEVM)::(\w+)/ ]
> +    }
> +  end
>
>   end
>
> diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
> index f1909b2..191a0c9 100644
> --- a/server/lib/deltacloud/helpers/application_helper.rb
> +++ b/server/lib/deltacloud/helpers/application_helper.rb
> @@ -186,4 +186,16 @@ module ApplicationHelper
>       end
>     end
>
> +  def image_for_state(state)
> +    state_img = "stopped" if (state!='RUNNING' or state!='PENDING')
> +    "<img src='/images/#{state.downcase}.png' title='#{state}'/>"
> +  end
> +
> +  def truncate_words(text, length = 10)
> +    return nil unless text
> +    return text if text.length<=length
> +    end_string = "...#{text[(text.length-(length/2))..text.length]}"
> +    "#{text[0..(length/2)]}#{end_string}"
> +  end
> +
>   end
> diff --git a/server/public/images/pending.png b/server/public/images/pending.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..6753441a11065d1e2b10104dd0e59db34842856f
> GIT binary patch
> literal 792
> zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
> zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!x=BPqRCwC#R!>M2Q5gT;%<MnM(RHvj
> z6VVDf2$fjW!RQYjB82MDAv$ylT8M5P+EWyi9Xdo2NYtf6bm>qe(qYN4OHpD4LV~g;
> zySBEjy0h!%t~1m3y&Yv;(iL~Y%e>{szIpHW?f2uo@B7U%(==f#hX7kV90861M}Sn0
> zz!+Qg*cf_o*z{EQ7)(5FLcv2Aegsn=V2kO{RL}X3xU|Y#*7F)x&WMTxh>bU1_0}lL
> zrBiJ!u)nDus@x*qSjg${HJX6_kqJm?+LNi9XM(t_+bKZ8<S!f4y3^OX+F>aE2f~pI
> zL{m$g(^MltSE~#i4PLkx9)|c#^6AvAvzM1eR4RZ4t~@%b?ra;le)0f3`#uljbBiEh
> z^$6DK82B4Y2EZ=A2QKcdg}ZORK=S90W77|UgN6KNMMdah>W<sz+FRkxSQ_G)Jk)wb
> zsK(=$T>=NqX^r-XLtN%>yhE{ebb$|C-p+vE50TkCC|2SsJOZBun$sHX5r?=SxjT7m
> zrCor-&9JB=ngKG-1V&Z=?_u)m0M2EFMsV99fZuc~XJFL}YbGxiL0pT+>=3{^VLq$#
> zW8O&D5VyoXDiUCt3#lP3J=d{aRY5m&SW5%t6a^7}C6hogrG~WGBFtrn!}mvHG4Nmk
> z$S#Q&p0@-(UWgLs5SL;o)(!#Lx&Ft43$gLn??*<!OKs<Kf$WjE6B1}nYqUok;!+I7
> zmc8DM7!iIch?c<B-X5iSPxqnS&Ct579z3ps6))y>i2P2#r?E-UCP(|G9|l9XJb}>4
> z8PP_qm@?IJ*FACJi0@!`5R|%o%b}d2&3?;%?(0pxd;S5RqKJ9Bta#;Rgpd&`q8?Fg
> zt$~#&jYuGph>YDYqm@U?UVWCyu%h<QS$CfQU$5g$kM(j$l>|Hg2^|5B06WHC0R{m2
> W(HoU0sdYgB0000<MNUMnLSTZ#=yb^d
>
> literal 0
> HcmV?d00001
>
> diff --git a/server/public/images/running.png b/server/public/images/running.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..f74a91436191dc62eb6ad4316c2e6807fb1ed17d
> GIT binary patch
> literal 740
> zcmV<A0vr8_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
> zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!hDk(0RCwC#R^LlgVHkeCbIy*fri-~u
> zjM+t$P!K^ELaXe?q91q{{R2VLO$FXqf(WHI1$Gl&RR2J9V?V&WQLJE)6@fxUNL%7G
> zQ)hEqTkZ6|=bWh%@eI$2L7Wes?d<)Ym-qS3_kGVhp=lb*IV6;MxB^@Ou7I)&P^<_-
> zh@zj(ooJM{phuH%qTpdn5qS*dGiV>|LWDv^?zWNH2`eXDB|tvajXr<X){7?(oyURt
> zMtIe2`b0Xrgt2G@FWx^wVlj1p;5u3<{KrWF3Kf4`8w|EwK64YX#A}RCKgB|NPUmd*
> z2C#qUIfVR2aPN5s;@@W<4BWt_f(W|;#Ib8QUbn|Lbfu*WucEz}NyZ@YYcH&jkf)Ct
> zUkKs)tGL_WiTFgaY4{FCjQX0bL+J5V<JRfJ7w~TCA?8ytRM5#$WtuR-&m7}9<}kM+
> zfNsup;ud&?2jRLMm6%G7L7`$YWl3wmF`i=%bA^I1=i0snG*o`o)0sDrWoyL+uDLy`
> z69V*OnEVxmB1$tB=86?Pwgu=47BW%D#Mbf_T*=@H;hYm{xfI_1m^1cR-v()Y@EmiP
> z%Q<TeX|n>dlcVVUGC>7sRf@8{2)(#saG1+Eoa=;u^!O8u%zs0FWYj32(&h3fE7y>p
> zImUC$VJ_!zuI2WYVnp;+N!Z=ghMwvW&Nl1=YHMi4<}Lr71L8Bl$4~V7V|X@v8|@VS
> zO89AIM5S6WtrLF2uD#7TN^PK3t-`_O9VSY45g(`>^nD)0ONvYq5>8q1ax)@u_X!Y!
> z1fLm$Stv=EC2)gSa=IC<_8E`qa4L%1LDt;!+`nqan;sk0Q0yeT{|Q|I|Am0R0t^5@
> WHt<xS!(=1?0000<MNUMnLSTYd-B(%w
>
> literal 0
> HcmV?d00001
>
> diff --git a/server/public/images/stopped.png b/server/public/images/stopped.png
> new file mode 100644
> index 0000000000000000000000000000000000000000..b6cfd0b8f00132d106c0e214e8d0225015feb91e
> GIT binary patch
> literal 779
> zcmV+m1N8ifP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
> zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!tw}^dRCwC#R?lk_Q4pT@_D7PosWnX_
> zp{4DiSRz%?OOT2ck$Nb^vlr<>v?%@o{R6aDK`KQoh!;;D4D?b&A{8{3fLaKtB{a1f
> zj4{UaS7>(goY`z^qO>W^N<i}9BiVW1WWF~uZ#GN_0rgxQ>bx2P8Uh*u>MlU8MqrFp
> zJU;jP{4E?NBq7dk4>98CjD^;UFn&244Wp@Iy6rXWShY!5CP11!<C}7}wqEPHa1mU-
> z0g##;#)iJJ37P0Tth{^ytGV2x;WyDSGFvG?#^BG|Jf6V7^;=MgeSm!U6=>g*r8IVU
> z!R{XdrT;k0Kb(Z@*VOdz+vtsL5w!|n)2I5*9XrwyI(hRp<bzM4u(E{t!0K_cg^EQC
> zrGe7b3--Vjc=zBw#8T;@(a6WSQhZTU6Dpmme5dEq2yBIBK*v+_re@#{2XLFM1p1CP
> z+9M8ey{dGVe66?z4!gt$54X30o`_>W45ngGS*ZlsaE~~|wQ)X3zBS(hTq-4ye~N>w
> z+Cfm-D{n@5y92}05Z6q)YJ~s>jDyJjFit6U3;w&Q3@-T?z7_~DPF%zvm27q>R%u#p
> za)B|+CZWh_dL+A%#}e2;#(GP;fcA((T=MyIARSb|)@&+!FOf_E$NEwLNm2f4LbA~w
> zafnMk<ZFe1&B^$exy9UiFcMwB0E*F!B_XN-BQt2DJ>n3Te8{(Ib@wxf@WYAdd3^fl
> zM8C^9(%0J!Znqmd$ZR1^gLFC#i%ZK8%dF0fMi$1=nn0{p8$|mZ#S-EWqVsCE=WM|1
> z8f%xO6JqC@0DRZ<_rYXl>dA8IH9meu{IqHm@4So<%?K9)j}I-T4a`7mh%_RDShxCR
> z1Z9U+%n7HK-E(0!9M!z=uU^LoUVFumYjJM;Cu|7#F9iG&U;vZq6mJi1`DFkA002ov
> JPDHLkV1j$QW{&^>
>
> literal 0
> HcmV?d00001
>
> diff --git a/server/views/instances/index.html.haml b/server/views/instances/index.html.haml
> index d728ec5..d0ada19 100644
> --- a/server/views/instances/index.html.haml
> +++ b/server/views/instances/index.html.haml
> @@ -14,17 +14,17 @@
>       - @instances.each do |instance|
>         %tr
>           %td
> -          = link_to instance.id, instance_url( instance.id )
> +          = link_to truncate_words(instance.id), instance_url( instance.id )
>           %td
>             = link_to instance.owner_id, images_url
>           %td
>             = instance.name
>           %td
> -          = link_to instance.image_id, image_url( instance.image_id )
> +          = link_to truncate_words(instance.image_id), image_url( instance.image_id )
>           %td
>             = instance.hardware_profile ? link_to(instance.hardware_profile, hardware_profile_url( instance.instance_profile.id )) : 'default'
>           %td
> -          = instance.state
> +          = image_for_state(instance.state)
>           %td
>             -instance.actions.each do |action|
>               =link_to_action action, self.send(:"#{action}_instance_url", instance.id), instance_action_method(action)


[PATCH core] RHEV-M fixes (realms, client). Instance UI enhancements (images, ID shortening)

Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>

---
 server/bin/deltacloudd                             |    1 +
 server/config/drivers.yaml                         |    3 ++
 .../lib/deltacloud/drivers/rhevm/rhevm_client.rb   |   24 +++++++++++++++++--
 .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb   |   20 +++++++++-------
 .../lib/deltacloud/helpers/application_helper.rb   |   12 ++++++++++
 server/public/images/pending.png                   |  Bin 0 -> 792 bytes
 server/public/images/running.png                   |  Bin 0 -> 740 bytes
 server/public/images/stopped.png                   |  Bin 0 -> 779 bytes
 server/views/instances/index.html.haml             |    6 ++--
 9 files changed, 51 insertions(+), 15 deletions(-)
 create mode 100644 server/public/images/pending.png
 create mode 100644 server/public/images/running.png
 create mode 100644 server/public/images/stopped.png

diff --git a/server/bin/deltacloudd b/server/bin/deltacloudd
index 70be6ca..addb1f5 100755
--- a/server/bin/deltacloudd
+++ b/server/bin/deltacloudd
@@ -105,6 +105,7 @@ else
   argv_opts << ['--rackup', 'config.ru' ]
   argv_opts << ['--chdir', dirname ]
   argv_opts << ['-e', options[:env] ]
+  argv_opts << ['--timeout', '60']
   argv_opts << ['--threaded', '-D', '--stats', '/stats']
 
   argv_opts.flatten!
diff --git a/server/config/drivers.yaml b/server/config/drivers.yaml
index 3f34521..d028ca0 100644
--- a/server/config/drivers.yaml
+++ b/server/config/drivers.yaml
@@ -5,6 +5,9 @@
   :name: Mock
 :rhevm: 
   :name: RHEVM
+  :entrypoints:
+    default:
+      default: "https://rhev-dc.lab.eng.brq.redhat.com:8443/rhevm-api-powershell"
 :rimuhosting: 
   :name: RimuHosting
 :opennebula: 
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
index 09c025f..c1c7161 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
@@ -25,6 +25,15 @@ require 'json'
 module RHEVM
 
   class FixtureNotFound < Exception; end
+  class ConnectionError < StandardError
+    attr_reader :code, :cause, :details
+    def initialize(code, cause, message, details)
+      super(message)
+      @code = code
+      @cause = cause
+      @details = details
+    end
+  end
 
   class Client
 
@@ -51,7 +60,7 @@ module RHEVM
       opts ||= {}
       if @@COLLECTIONS.include?(method_name.to_sym)
         if opts[:id]
-          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}#{opts[:id]}"))
+          object = Nokogiri::XML(get("#{@entry_points[method_name.to_s]}/#{opts[:id]}"))
           element = method_name.to_s
           element = 'data_centers' if method_name.eql?(:datacenters)
           @current_element = element
@@ -105,7 +114,12 @@ module RHEVM
       if ENV['RACK_ENV'] == 'test'
         response = mock_request(:get, uri, {}, headers)
       else
-        response = RestClient.get(uri, headers).to_s
+        puts "[RHEV-M] #{uri}"
+        begin
+          response = RestClient.get(uri, headers).to_s
+        rescue Exception => e
+          raise ConnectionError::new(500, "GET #{uri}", "#{e.message} (GET #{uri})", e.backtrace)
+        end
       end
       response
     end
@@ -127,7 +141,11 @@ module RHEVM
 
     def discover_entry_points()
       return if @discovered
-      doc = Nokogiri.XML(get(@base_uri))
+      begin
+        doc = Nokogiri.XML(get(@base_uri))
+      rescue Exception => e
+        raise ConnectionError::new(500, "RHEV-M Connection Error (#{@base_uri})", "#{e.message} (#{@base_uri})", e.backtrace)
+      end
       doc.xpath('api/link').each() do |link|
         @entry_points[link['rel']] = @host + link['href']
       end
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index 8b4282f..3fd5365 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -72,7 +72,7 @@ class RHEVMDriver < Deltacloud::BaseDriver
   # or setting provider using HTTP header X-Deltacloud-Provider to URL.
   #
   def provider_uri
-    'https://10.34.2.122:8443/rhevm-api-powershell'
+    Deltacloud::Drivers::driver_config[:rhevm][:entrypoints]['default']['default']
   end
 
   define_instance_states do
@@ -203,7 +203,9 @@ class RHEVMDriver < Deltacloud::BaseDriver
 
   def new_client(credentials)
     url = (Thread.current[:provider] || ENV['API_PROVIDER'] || provider_uri)
-    ::RHEVM::Client.new(credentials.user, credentials.password, url)
+    safely do
+      ::RHEVM::Client.new(credentials.user, credentials.password, url)
+    end
   end
 
   def convert_instance(client, inst)
@@ -299,13 +301,13 @@ class RHEVMDriver < Deltacloud::BaseDriver
   # Disabling this error catching will lead to more verbose messages
   # on console (eg. response from RHEV-M API (so far I didn't figure our
   # how to pass those message to our exception handling tool)
-  #def catched_exceptions_list
-  #  {
-  #    :auth => RestClient::Unauthorized,
-  #    :error => RestClient::InternalServerError,
-  #    :glob => [ /RestClient::(\w+)/ ]
-  #  }
-  #end
+  def catched_exceptions_list
+    {
+      :auth => RestClient::Unauthorized,
+      :error => RestClient::InternalServerError,
+      :glob => [ /(RestClient|RHEVM)::(\w+)/ ]
+    }
+  end
 
 end
 
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index f1909b2..191a0c9 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -186,4 +186,16 @@ module ApplicationHelper
     end
   end
 
+  def image_for_state(state)
+    state_img = "stopped" if (state!='RUNNING' or state!='PENDING')
+    "<img src='/images/#{state.downcase}.png' title='#{state}'/>"
+  end
+
+  def truncate_words(text, length = 10)
+    return nil unless text
+    return text if text.length<=length
+    end_string = "...#{text[(text.length-(length/2))..text.length]}"
+    "#{text[0..(length/2)]}#{end_string}"
+  end
+
 end
diff --git a/server/public/images/pending.png b/server/public/images/pending.png
new file mode 100644
index 0000000000000000000000000000000000000000..6753441a11065d1e2b10104dd0e59db34842856f
GIT binary patch
literal 792
zcmV+z1LypSP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!x=BPqRCwC#R!>M2Q5gT;%<MnM(RHvj
z6VVDf2$fjW!RQYjB82MDAv$ylT8M5P+EWyi9Xdo2NYtf6bm>qe(qYN4OHpD4LV~g;
zySBEjy0h!%t~1m3y&Yv;(iL~Y%e>{szIpHW?f2uo@B7U%(==f#hX7kV90861M}Sn0
zz!+Qg*cf_o*z{EQ7)(5FLcv2Aegsn=V2kO{RL}X3xU|Y#*7F)x&WMTxh>bU1_0}lL
zrBiJ!u)nDus@x*qSjg${HJX6_kqJm?+LNi9XM(t_+bKZ8<S!f4y3^OX+F>aE2f~pI
zL{m$g(^MltSE~#i4PLkx9)|c#^6AvAvzM1eR4RZ4t~@%b?ra;le)0f3`#uljbBiEh
z^$6DK82B4Y2EZ=A2QKcdg}ZORK=S90W77|UgN6KNMMdah>W<sz+FRkxSQ_G)Jk)wb
zsK(=$T>=NqX^r-XLtN%>yhE{ebb$|C-p+vE50TkCC|2SsJOZBun$sHX5r?=SxjT7m
zrCor-&9JB=ngKG-1V&Z=?_u)m0M2EFMsV99fZuc~XJFL}YbGxiL0pT+>=3{^VLq$#
zW8O&D5VyoXDiUCt3#lP3J=d{aRY5m&SW5%t6a^7}C6hogrG~WGBFtrn!}mvHG4Nmk
z$S#Q&p0@-(UWgLs5SL;o)(!#Lx&Ft43$gLn??*<!OKs<Kf$WjE6B1}nYqUok;!+I7
zmc8DM7!iIch?c<B-X5iSPxqnS&Ct579z3ps6))y>i2P2#r?E-UCP(|G9|l9XJb}>4
z8PP_qm@?IJ*FACJi0@!`5R|%o%b}d2&3?;%?(0pxd;S5RqKJ9Bta#;Rgpd&`q8?Fg
zt$~#&jYuGph>YDYqm@U?UVWCyu%h<QS$CfQU$5g$kM(j$l>|Hg2^|5B06WHC0R{m2
W(HoU0sdYgB0000<MNUMnLSTZ#=yb^d

literal 0
HcmV?d00001

diff --git a/server/public/images/running.png b/server/public/images/running.png
new file mode 100644
index 0000000000000000000000000000000000000000..f74a91436191dc62eb6ad4316c2e6807fb1ed17d
GIT binary patch
literal 740
zcmV<A0vr8_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!hDk(0RCwC#R^LlgVHkeCbIy*fri-~u
zjM+t$P!K^ELaXe?q91q{{R2VLO$FXqf(WHI1$Gl&RR2J9V?V&WQLJE)6@fxUNL%7G
zQ)hEqTkZ6|=bWh%@eI$2L7Wes?d<)Ym-qS3_kGVhp=lb*IV6;MxB^@Ou7I)&P^<_-
zh@zj(ooJM{phuH%qTpdn5qS*dGiV>|LWDv^?zWNH2`eXDB|tvajXr<X){7?(oyURt
zMtIe2`b0Xrgt2G@FWx^wVlj1p;5u3<{KrWF3Kf4`8w|EwK64YX#A}RCKgB|NPUmd*
z2C#qUIfVR2aPN5s;@@W<4BWt_f(W|;#Ib8QUbn|Lbfu*WucEz}NyZ@YYcH&jkf)Ct
zUkKs)tGL_WiTFgaY4{FCjQX0bL+J5V<JRfJ7w~TCA?8ytRM5#$WtuR-&m7}9<}kM+
zfNsup;ud&?2jRLMm6%G7L7`$YWl3wmF`i=%bA^I1=i0snG*o`o)0sDrWoyL+uDLy`
z69V*OnEVxmB1$tB=86?Pwgu=47BW%D#Mbf_T*=@H;hYm{xfI_1m^1cR-v()Y@EmiP
z%Q<TeX|n>dlcVVUGC>7sRf@8{2)(#saG1+Eoa=;u^!O8u%zs0FWYj32(&h3fE7y>p
zImUC$VJ_!zuI2WYVnp;+N!Z=ghMwvW&Nl1=YHMi4<}Lr71L8Bl$4~V7V|X@v8|@VS
zO89AIM5S6WtrLF2uD#7TN^PK3t-`_O9VSY45g(`>^nD)0ONvYq5>8q1ax)@u_X!Y!
z1fLm$Stv=EC2)gSa=IC<_8E`qa4L%1LDt;!+`nqan;sk0Q0yeT{|Q|I|Am0R0t^5@
WHt<xS!(=1?0000<MNUMnLSTYd-B(%w

literal 0
HcmV?d00001

diff --git a/server/public/images/stopped.png b/server/public/images/stopped.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6cfd0b8f00132d106c0e214e8d0225015feb91e
GIT binary patch
literal 779
zcmV+m1N8ifP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!tw}^dRCwC#R?lk_Q4pT@_D7PosWnX_
zp{4DiSRz%?OOT2ck$Nb^vlr<>v?%@o{R6aDK`KQoh!;;D4D?b&A{8{3fLaKtB{a1f
zj4{UaS7>(goY`z^qO>W^N<i}9BiVW1WWF~uZ#GN_0rgxQ>bx2P8Uh*u>MlU8MqrFp
zJU;jP{4E?NBq7dk4>98CjD^;UFn&244Wp@Iy6rXWShY!5CP11!<C}7}wqEPHa1mU-
z0g##;#)iJJ37P0Tth{^ytGV2x;WyDSGFvG?#^BG|Jf6V7^;=MgeSm!U6=>g*r8IVU
z!R{XdrT;k0Kb(Z@*VOdz+vtsL5w!|n)2I5*9XrwyI(hRp<bzM4u(E{t!0K_cg^EQC
zrGe7b3--Vjc=zBw#8T;@(a6WSQhZTU6Dpmme5dEq2yBIBK*v+_re@#{2XLFM1p1CP
z+9M8ey{dGVe66?z4!gt$54X30o`_>W45ngGS*ZlsaE~~|wQ)X3zBS(hTq-4ye~N>w
z+Cfm-D{n@5y92}05Z6q)YJ~s>jDyJjFit6U3;w&Q3@-T?z7_~DPF%zvm27q>R%u#p
za)B|+CZWh_dL+A%#}e2;#(GP;fcA((T=MyIARSb|)@&+!FOf_E$NEwLNm2f4LbA~w
zafnMk<ZFe1&B^$exy9UiFcMwB0E*F!B_XN-BQt2DJ>n3Te8{(Ib@wxf@WYAdd3^fl
zM8C^9(%0J!Znqmd$ZR1^gLFC#i%ZK8%dF0fMi$1=nn0{p8$|mZ#S-EWqVsCE=WM|1
z8f%xO6JqC@0DRZ<_rYXl>dA8IH9meu{IqHm@4So<%?K9)j}I-T4a`7mh%_RDShxCR
z1Z9U+%n7HK-E(0!9M!z=uU^LoUVFumYjJM;Cu|7#F9iG&U;vZq6mJi1`DFkA002ov
JPDHLkV1j$QW{&^>

literal 0
HcmV?d00001

diff --git a/server/views/instances/index.html.haml b/server/views/instances/index.html.haml
index d728ec5..d0ada19 100644
--- a/server/views/instances/index.html.haml
+++ b/server/views/instances/index.html.haml
@@ -14,17 +14,17 @@
     - @instances.each do |instance|
       %tr
         %td
-          = link_to instance.id, instance_url( instance.id )
+          = link_to truncate_words(instance.id), instance_url( instance.id )
         %td
           = link_to instance.owner_id, images_url
         %td
           = instance.name
         %td
-          = link_to instance.image_id, image_url( instance.image_id )
+          = link_to truncate_words(instance.image_id), image_url( instance.image_id )
         %td
           = instance.hardware_profile ? link_to(instance.hardware_profile, hardware_profile_url( instance.instance_profile.id )) : 'default'
         %td
-          = instance.state
+          = image_for_state(instance.state)
         %td
           -instance.actions.each do |action|
             =link_to_action action, self.send(:"#{action}_instance_url", instance.id), instance_action_method(action)
-- 
1.7.4