deltacloud-core 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/Rakefile +1 -24
  2. data/lib/deltacloud/base_driver/features.rb +15 -0
  3. data/lib/deltacloud/base_driver/mock_driver.rb +37 -0
  4. data/lib/deltacloud/drivers/ec2/ec2_driver.rb +70 -48
  5. data/lib/deltacloud/drivers/gogrid/gogrid_driver.rb +97 -14
  6. data/lib/deltacloud/drivers/{rimu/rimu_hosting_client.rb → rimuhosting/rimuhosting_client.rb} +5 -8
  7. data/lib/deltacloud/drivers/{rimu/rimu_hosting_driver.rb → rimuhosting/rimuhosting_driver.rb} +6 -5
  8. data/lib/deltacloud/drivers/terremark/terremark_driver.rb +261 -0
  9. data/lib/deltacloud/hardware_profile.rb +22 -0
  10. data/lib/deltacloud/helpers/application_helper.rb +18 -0
  11. data/lib/deltacloud/helpers/conversion_helper.rb +2 -3
  12. data/lib/deltacloud/method_serializer.rb +84 -0
  13. data/lib/drivers.rb +4 -3
  14. data/lib/sinatra/accept_media_types.rb +128 -0
  15. data/lib/sinatra/respond_to.rb +23 -16
  16. data/public/javascripts/application.js +30 -0
  17. data/public/javascripts/jquery-1.4.2.min.js +154 -0
  18. data/server.rb +23 -21
  19. data/support/fedora/deltacloudd +68 -0
  20. data/support/fedora/rubygem-deltacloud-core.spec +91 -0
  21. data/views/instances/index.html.haml +2 -1
  22. data/views/instances/index.xml.haml +3 -3
  23. data/views/instances/new.html.haml +9 -3
  24. data/views/instances/show.html.haml +2 -1
  25. data/views/instances/show.xml.haml +16 -3
  26. data/views/layout.html.haml +2 -0
  27. metadata +19 -37
  28. data/lib/converters/xml_converter.rb +0 -133
  29. data/public/javascripts/controls.js +0 -963
  30. data/public/javascripts/dragdrop.js +0 -973
  31. data/public/javascripts/effects.js +0 -1128
  32. data/public/javascripts/prototype.js +0 -4320
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'optparse'
5
+ require 'thin'
6
+
7
+ options = {
8
+ :env => 'production'
9
+ }
10
+ optparse = OptionParser.new do |opts|
11
+
12
+ opts.banner = <<BANNER
13
+ Usage:
14
+ deltacloudd -i <driver> [options]
15
+
16
+ Options:
17
+ BANNER
18
+ opts.on( '-i', '--driver DRIVER', 'Driver to use') do |driver|
19
+ ENV["API_DRIVER"] = driver
20
+ end
21
+ opts.on( '-r', '--hostname HOSTNAME',
22
+ 'Bind to HOST address (default: localhost)') do |host|
23
+ ENV["API_HOST"] = host
24
+ end
25
+ opts.on( '-p', '--port PORT', 'Use PORT (default: 3001)') do |port|
26
+ ENV["API_PORT"] = port
27
+ end
28
+ opts.on( '-e', '--env ENV', 'Environment (default: "development")') { |env| options[:env] = env }
29
+ opts.on( '-h', '--help', '') { options[:help] = true }
30
+ end
31
+
32
+ optparse.parse!
33
+
34
+ if options[:help]
35
+ puts optparse
36
+ exit(0)
37
+ end
38
+
39
+ unless ENV["API_DRIVER"]
40
+ puts "You need to specify a driver to use (-i <driver>)"
41
+ exit(1)
42
+ end
43
+
44
+ ENV["API_HOST"] = "localhost" unless ENV["API_HOST"]
45
+ ENV["API_PORT"] = "3001" unless ENV["API_PORT"]
46
+
47
+ dirname="#{File.dirname(__FILE__)}/.."
48
+
49
+ argv_opts = ARGV.clone
50
+ argv_opts << ['start'] unless Thin::Runner.commands.include?(options[0])
51
+ argv_opts << ['--address', ENV["API_HOST"] ]
52
+ argv_opts << ['--port', ENV["API_PORT"] ]
53
+ argv_opts << ['--rackup', 'config.ru' ]
54
+ argv_opts << ['--chdir', dirname ]
55
+ argv_opts << ['-e', options[:env] ]
56
+ argv_opts << ['--threaded', '-D', '--stats', '/stats']
57
+
58
+ argv_opts.flatten!
59
+
60
+ puts "Starting Deltacloud API :: #{ENV["API_DRIVER"]} :: http://#{ENV["API_HOST"]}:#{ENV["API_PORT"]}/api"
61
+ puts
62
+
63
+ thin = Thin::Runner.new(argv_opts)
64
+ begin
65
+ thin.run!
66
+ rescue Exception => e
67
+ puts "ERROR: #{e.message}"
68
+ end
@@ -0,0 +1,91 @@
1
+ %global ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']")
2
+ %global gemdir %(ruby -rubygems -e 'puts Gem::dir' 2>/dev/null)
3
+ %global gemname deltacloud-core
4
+ %global geminstdir %{gemdir}/gems/%{gemname}-%{version}
5
+
6
+ Summary: Deltacloud REST API
7
+ Name: rubygem-%{gemname}
8
+ Version: 0.0.1
9
+ Release: 2%{?dist}
10
+ Group: Development/Languages
11
+ License: ASL 2.0 and MIT
12
+ URL: http://www.deltacloud.org
13
+ Source0: http://gems.rubyforge.org/gems/%{gemname}-%{version}.gem
14
+ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
15
+ Requires: rubygems
16
+ Requires: ruby(abi) = 1.8
17
+ Requires: rubygem(eventmachine) >= 0.12.10
18
+ Requires: rubygem(haml) >= 2.2.17
19
+ Requires: rubygem(sinatra) >= 0.9.4
20
+ Requires: rubygem(rack) >= 1.0.0
21
+ Requires: rubygem(thin) >= 1.2.5
22
+ Requires: rubygem(builder) >= 2.1.2
23
+ Requires: rubygem(json) >= 1.2.3
24
+ BuildRequires: ruby-json >= 1.1.9
25
+ BuildRequires: rubygem(rake) >= 0.8.7
26
+ BuildRequires: rubygem(rack-test) >= 0.4.0
27
+ BuildRequires: rubygem(cucumber) >= 0.4.0
28
+ BuildRequires: rubygem(rcov) >= 0.9.6
29
+ BuildRequires: rubygems
30
+ BuildRequires: ruby(abi) = 1.8
31
+ BuildArch: noarch
32
+ Provides: rubygem(%{gemname}) = %{version}
33
+
34
+ %description
35
+ The Deltacloud API is built as a service-based REST API.
36
+ You do not directly link a Deltacloud library into your program to use it.
37
+ Instead, a client speaks the Deltacloud API over HTTP to a server
38
+ which implements the REST interface.
39
+
40
+ %prep
41
+
42
+ %build
43
+
44
+ %install
45
+ rm -rf %{buildroot}
46
+ mkdir -p %{buildroot}%{gemdir}
47
+ gem install --local --install-dir %{buildroot}%{gemdir} \
48
+ --force --rdoc %{SOURCE0}
49
+ mkdir -p %{buildroot}/%{_bindir}
50
+ mv %{buildroot}%{geminstdir}/support/fedora/deltacloudd %{buildroot}/%{geminstdir}/bin
51
+ mv %{buildroot}%{gemdir}/bin/* %{buildroot}/%{_bindir}
52
+ rmdir %{buildroot}%{gemdir}/bin
53
+ find %{buildroot}%{geminstdir}/bin -type f | xargs chmod a+x
54
+
55
+ # Needs json_pure gem / not available in Fedora yet
56
+ #%check
57
+ #pushd %{buildroot}%{geminstdir}
58
+ #cucumber features/*.feature
59
+ #popd
60
+
61
+ %clean
62
+ rm -rf %{buildroot}
63
+
64
+ %files
65
+ %defattr(-, root, root, -)
66
+ %{_bindir}/deltacloudd
67
+ %{gemdir}/gems/%{gemname}-%{version}/bin
68
+ %{gemdir}/gems/%{gemname}-%{version}/lib
69
+ %{gemdir}/gems/%{gemname}-%{version}/public/favicon.ico
70
+ %{gemdir}/gems/%{gemname}-%{version}/public/images
71
+ %{gemdir}/gems/%{gemname}-%{version}/public/stylesheets
72
+ %{gemdir}/gems/%{gemname}-%{version}/tests
73
+ %{gemdir}/gems/%{gemname}-%{version}/views
74
+ %{gemdir}/gems/%{gemname}-%{version}/Rakefile
75
+ %{gemdir}/gems/%{gemname}-%{version}/*.rb
76
+ %{gemdir}/gems/%{gemname}-%{version}/config.ru
77
+ %doc %{gemdir}/gems/%{gemname}-%{version}/support/fedora
78
+ %doc %{gemdir}/gems/%{gemname}-%{version}/COPYING
79
+ %doc %{gemdir}/doc/%{gemname}-%{version}
80
+ %{gemdir}/cache/%{gemname}-%{version}.gem
81
+ %{gemdir}/specifications/%{gemname}-%{version}.gemspec
82
+ # MIT
83
+ %{gemdir}/gems/%{gemname}-%{version}/public/javascripts
84
+
85
+ %changelog
86
+ * Mon Apr 26 2010 Michal Fojtik <mfojtik@packager> - 0.0.1-1
87
+ - Initial package
88
+
89
+ * Mon Apr 26 2010 Michal Fojtik <mfojtik@packager> - 0.0.1-2
90
+ - Fixed broken dependencies
91
+ - Added new launcher for Fedora
@@ -26,4 +26,5 @@
26
26
  %td
27
27
  = instance.state
28
28
  %td
29
- = instance.actions.collect { |a| link_to(a, self.send("#{a}_instance_url", instance.id), :method => :post)}.join(' ')
29
+ -instance.actions.each do |action|
30
+ =link_to action, self.send(:"#{action}_instance_url", instance.id), :class => instance_action_method(action)
@@ -14,10 +14,10 @@
14
14
  %property{:kind => 'fixed', :name => p, :value => v, :unit => Deltacloud::HardwareProfile::unit(p)}
15
15
  %actions
16
16
  - instance.actions.compact.each do |action|
17
- %link{:rel => action, :href => self.send("#{action}_instance_url", instance.id)}
18
- - haml_tag :"public-addresses" do
17
+ %link{:rel => action, :href => self.send("#{action}_instance_url", instance.id), :method => instance_action_method(action)}
18
+ %public-addresses
19
19
  - instance.public_addresses.each do |address|
20
20
  %address #{address}
21
- - haml_tag :"private-addresses" do
21
+ %private-addresses
22
22
  - instance.private_addresses.each do |address|
23
23
  %address #{address}
@@ -5,9 +5,15 @@
5
5
 
6
6
  %form{ :action => instances_url, :method => :post }
7
7
  %input{ :name => :image_id, :type => :hidden, :value => @instance.image_id }/
8
- %label
9
- Instance Name:
10
- %input{ :name => 'name', :size => 30 }/
8
+ %p
9
+ %label
10
+ Instance Name:
11
+ %input{ :name => 'name', :size => 30 }/
12
+ -if driver_has_feature?(:authentication_key)
13
+ %p
14
+ %label
15
+ Instance Keyname:
16
+ %input{:name => 'keyname', :size => 30 }
11
17
  - if !@hardware_profiles.empty?
12
18
  %h3 What size machine?
13
19
  - for hwp in @hardware_profiles
@@ -39,4 +39,5 @@
39
39
  %di
40
40
  %dt
41
41
  %dd
42
- = @instance.actions.collect { |action| link_to(action, "/api/instances/#{@instance.id}/#{action}") }.join("&nbsp;")
42
+ -@instance.actions.each do |action|
43
+ =link_to action, self.send(:"#{action}_instance_url", @instance.id), :class => instance_action_method(action)
@@ -17,12 +17,25 @@
17
17
  %property{:kind => 'fixed', :name => p, :value => v, :unit => Deltacloud::HardwareProfile::unit(p)}
18
18
  %actions
19
19
  - @instance.actions.compact.each do |instance_action|
20
- %link{:rel => instance_action, :href => self.send("#{instance_action}_instance_url", @instance.id)}
21
- - haml_tag :"public-addresses" do
20
+ %link{:rel => instance_action, :method => instance_action_method(instance_action), :href => self.send("#{instance_action}_instance_url", @instance.id)}
21
+ %public-addresses
22
22
  - @instance.public_addresses.each do |address|
23
23
  %address<
24
24
  =address
25
- - haml_tag :"private-addresses" do
25
+ %private-addresses
26
26
  - @instance.private_addresses.each do |address|
27
27
  %address<
28
28
  =address
29
+ - if driver_has_auth_features?
30
+ %authentication{ :type => driver_auth_feature_name }
31
+ - if @instance.authn_feature_failed?
32
+ %error #{@instance.authn_error}
33
+ - else
34
+ - if driver_auth_feature_name == 'password'
35
+ %login
36
+ %username #{@instance.username}
37
+ %password #{@instance.password}
38
+ - if driver_auth_feature_name == 'key'
39
+ %login
40
+ %keyname #{@instance.keyname}
41
+
@@ -8,6 +8,8 @@
8
8
  /[if lt IE 8]
9
9
  = stylesheet_link_tag '/stylesheets/compiled/ie.css', :media => 'screen, projection'
10
10
  = stylesheet_link_tag '/stylesheets/compiled/application.css', :media => 'screen, projection'
11
+ %script{:type => "text/javascript", :src => "/javascripts/jquery-1.4.2.min.js" }
12
+ %script{:type => "text/javascript", :src => "/javascripts/application.js" }
11
13
  %body
12
14
  #wrapper
13
15
  #header
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deltacloud-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Red Hat, Inc.
@@ -9,19 +9,9 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-23 00:00:00 +02:00
12
+ date: 2010-06-09 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rake
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 0.8.7
24
- version:
25
15
  - !ruby/object:Gem::Dependency
26
16
  name: eventmachine
27
17
  type: :runtime
@@ -73,44 +63,34 @@ dependencies:
73
63
  version: 1.2.5
74
64
  version:
75
65
  - !ruby/object:Gem::Dependency
76
- name: rerun
77
- type: :runtime
78
- version_requirement:
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: 0.5.2
84
- version:
85
- - !ruby/object:Gem::Dependency
86
- name: builder
66
+ name: json
87
67
  type: :runtime
88
68
  version_requirement:
89
69
  version_requirements: !ruby/object:Gem::Requirement
90
70
  requirements:
91
71
  - - ">="
92
72
  - !ruby/object:Gem::Version
93
- version: 2.1.2
73
+ version: 1.2.3
94
74
  version:
95
75
  - !ruby/object:Gem::Dependency
96
- name: json
76
+ name: rerun
97
77
  type: :runtime
98
78
  version_requirement:
99
79
  version_requirements: !ruby/object:Gem::Requirement
100
80
  requirements:
101
81
  - - ">="
102
82
  - !ruby/object:Gem::Version
103
- version: 1.2.3
83
+ version: 0.5.2
104
84
  version:
105
85
  - !ruby/object:Gem::Dependency
106
- name: rack-accept-media-types
107
- type: :runtime
86
+ name: rake
87
+ type: :development
108
88
  version_requirement:
109
89
  version_requirements: !ruby/object:Gem::Requirement
110
90
  requirements:
111
91
  - - ">="
112
92
  - !ruby/object:Gem::Version
113
- version: "0.9"
93
+ version: 0.8.7
114
94
  version:
115
95
  - !ruby/object:Gem::Dependency
116
96
  name: compass
@@ -175,10 +155,13 @@ files:
175
155
  - config.ru
176
156
  - server.rb
177
157
  - deltacloud.rb
178
- - lib/converters/xml_converter.rb
158
+ - support/fedora/deltacloudd
159
+ - support/fedora/rubygem-deltacloud-core.spec
160
+ - lib/drivers.rb
179
161
  - lib/deltacloud/base_driver.rb
180
162
  - lib/deltacloud/base_driver/base_driver.rb
181
163
  - lib/deltacloud/base_driver/features.rb
164
+ - lib/deltacloud/base_driver/mock_driver.rb
182
165
  - lib/deltacloud/drivers/ec2/ec2_driver.rb
183
166
  - lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
184
167
  - lib/deltacloud/drivers/gogrid/gogrid_client.rb
@@ -190,8 +173,9 @@ files:
190
173
  - lib/deltacloud/drivers/rackspace/rackspace_client.rb
191
174
  - lib/deltacloud/drivers/rackspace/rackspace_driver.rb
192
175
  - lib/deltacloud/drivers/rhevm/rhevm_driver.rb
193
- - lib/deltacloud/drivers/rimu/rimu_hosting_client.rb
194
- - lib/deltacloud/drivers/rimu/rimu_hosting_driver.rb
176
+ - lib/deltacloud/drivers/terremark/terremark_driver.rb
177
+ - lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
178
+ - lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
195
179
  - lib/deltacloud/hardware_profile.rb
196
180
  - lib/deltacloud/helpers.rb
197
181
  - lib/deltacloud/helpers/application_helper.rb
@@ -206,12 +190,13 @@ files:
206
190
  - lib/deltacloud/models/instance_profile.rb
207
191
  - lib/deltacloud/state_machine.rb
208
192
  - lib/deltacloud/validation.rb
193
+ - lib/deltacloud/method_serializer.rb
209
194
  - lib/sinatra/lazy_auth.rb
210
195
  - lib/sinatra/rabbit.rb
211
196
  - lib/sinatra/respond_to.rb
212
197
  - lib/sinatra/static_assets.rb
213
198
  - lib/sinatra/url_for.rb
214
- - lib/drivers.rb
199
+ - lib/sinatra/accept_media_types.rb
215
200
  - views/accounts/index.html.haml
216
201
  - views/accounts/show.html.haml
217
202
  - views/api/show.html.haml
@@ -264,10 +249,7 @@ files:
264
249
  - public/images/rails.png
265
250
  - public/images/topbar-bg.png
266
251
  - public/javascripts/application.js
267
- - public/javascripts/controls.js
268
- - public/javascripts/dragdrop.js
269
- - public/javascripts/effects.js
270
- - public/javascripts/prototype.js
252
+ - public/javascripts/jquery-1.4.2.min.js
271
253
  - public/stylesheets/compiled/application.css
272
254
  - public/stylesheets/compiled/ie.css
273
255
  - public/stylesheets/compiled/print.css
@@ -1,133 +0,0 @@
1
- #
2
- # Copyright (C) 2009 Red Hat, Inc.
3
- #
4
- # This library is free software; you can redistribute it and/or
5
- # modify it under the terms of the GNU Lesser General Public
6
- # License as published by the Free Software Foundation; either
7
- # version 2.1 of the License, or (at your option) any later version.
8
- #
9
- # This library is distributed in the hope that it will be useful,
10
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
- # Lesser General Public License for more details.
13
- #
14
- # You should have received a copy of the GNU Lesser General Public
15
- # License along with this library; if not, write to the Free Software
16
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
-
18
- module Converters
19
-
20
- ( ALIASES = {
21
- :owner=>nil,
22
- :volume=>:storage_volume,
23
- } ) unless defined?( ALIASES )
24
-
25
- def self.url_type(type)
26
- type = type.to_sym
27
- return ALIASES[type] if ( ALIASES.keys.include?( type ) )
28
- type
29
- end
30
-
31
- def self.tag_name(type)
32
- tag_name = type.to_s
33
- tag_name.gsub( /_/, '-' )
34
- end
35
-
36
- class XMLConverter
37
- def initialize(link_builder, type)
38
- @link_builder = link_builder
39
- @type = type
40
- end
41
-
42
- def convert(obj, builder=nil)
43
- builder ||= Builder::XmlMarkup.new( :indent=>2 )
44
- if ( obj.is_a?( Array ) )
45
- builder.__send__( @type.to_s.pluralize.gsub( /_/, '-' ).to_sym ) do
46
- obj.each do |e|
47
- convert( e, builder )
48
- end
49
- end
50
- else
51
- case ( obj )
52
- when Image
53
- builder.image( :href=>@link_builder.send( :image_url, obj.id ) ) {
54
- builder.id( obj.id )
55
- builder.owner_id( obj.owner_id )
56
- builder.name( obj.name )
57
- builder.description( obj.description )
58
- builder.architecture( obj.architecture )
59
- }
60
- when Realm
61
- builder.realm( :href=>@link_builder.send( :realm_url, obj.id ) ) {
62
- builder.id( obj.id )
63
- builder.name( obj.name )
64
- builder.state( obj.state )
65
- if ( obj.limit == :unlimited )
66
- builder.limit()
67
- else
68
- builder.limit( obj.limit )
69
- end
70
- }
71
- when Instance
72
- builder.instance( :href=>@link_builder.send( :instance_url, obj.id ) ) {
73
- builder.id( obj.id )
74
- builder.name( obj.name )
75
- builder.owner_id( obj.owner_id )
76
- builder.image( :href=>@link_builder.send( :image_url, obj.image_id ) )
77
- builder.__send__( 'hardware-profile', :href=>@link_builder.send( :hardware_profile_url, obj.instance_profile.name) ) do
78
- builder.id( obj.instance_profile.name )
79
- obj.instance_profile.overrides.each do |p, v|
80
- u = ::Deltacloud::HardwareProfile::unit(p)
81
- builder.property( :kind=>:fixed, :name=>p, :unit=>u, :value=>v )
82
- end
83
- end
84
- builder.realm( :href=>@link_builder.send( :realm_url, obj.realm_id ) ) if obj.realm_id
85
- builder.state( obj.state )
86
- builder.actions {
87
- if ( obj.actions )
88
- obj.actions.each do |action|
89
- builder.link( :rel=>action, :href=>@link_builder.send( "#{action}_instance_url", obj.id ) )
90
- end
91
- end
92
- }
93
- builder.__send__( 'public-addresses' ) {
94
- obj.public_addresses.each do |address|
95
- builder.address( address )
96
- end
97
- }
98
- builder.__send__( 'private-addresses' ) {
99
- obj.private_addresses.each do |address|
100
- builder.address( address )
101
- end
102
- }
103
- }
104
- when StorageVolume
105
- builder.__send__('storage-volume', :href=>@link_builder.send( :storage_volume_url, obj.id )) {
106
- builder.id( obj.id )
107
- builder.created( obj.created )
108
- builder.state( obj.state )
109
- builder.capacity( obj.capacity )
110
- builder.device( obj.device )
111
- if ( obj.instance_id )
112
- builder.instance( :href=>@link_builder.send( :instance_url, obj.instance_id ) )
113
- else
114
- builder.instance()
115
- end
116
- }
117
- when StorageSnapshot
118
- builder.__send__('storage-snapshot', :href=>@link_builder.send( :storage_snapshot_url, obj.id )) {
119
- builder.id( obj.id )
120
- builder.created( obj.created )
121
- builder.state( obj.state )
122
- if ( obj.storage_volume_id )
123
- builder.__send__('storage-volume', :href=>@link_builder.send( :storage_volume_url, obj.storage_volume_id ) )
124
- else
125
- builder.__send( 'storage-volume' )
126
- end
127
- }
128
- end
129
- end
130
- return builder.target!
131
- end
132
- end
133
- end