occi-cli 4.1.0 → 4.2.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,4 +5,10 @@ gemspec
5
5
  group :development do
6
6
  gem 'warbler', :git => 'git://github.com/jruby/warbler.git', :ref => 'ce3ce4df137504822e4cbb9399dee7e7dd767c44'
7
7
  gem 'rubygems-tasks', :git => 'git://github.com/postmodern/rubygems-tasks.git'
8
+ gem "rspec"
9
+ gem "rake"
10
+ gem "builder"
11
+ gem "simplecov"
12
+ gem "yard"
13
+ gem "yard-rspec"
8
14
  end
data/README.md CHANGED
@@ -14,20 +14,30 @@ Requirements
14
14
  * RubyGems have to be installed
15
15
  * Rake has to be installed (e.g., `gem install rake`)
16
16
 
17
- ### Libraries/packages
18
- * libxslt1-dev/libxslt-devel
19
- * libxml2-dev/libxml2-devel
17
+ ### Dependencies
18
+ * `libxslt1-dev` or `libxslt-devel`
19
+ * `libxml2-dev`or `libxml2-devel`
20
20
 
21
21
  ### Examples
22
- For distros based on Debian:
22
+ #### For distros based on Debian:
23
23
  ~~~
24
24
  apt-get install ruby rubygems ruby-dev libxslt1-dev libxml2-dev
25
25
  ~~~
26
+ ~~~
27
+ ruby -v
28
+ ~~~
29
+
30
+ **Unless you have Ruby >= 1.9.3, please, go to [rOCCI-cli#RVM](#rvm) and install RVM with a newer Ruby version.**
26
31
 
27
- For distros based on RHEL:
32
+ #### For distros based on RHEL:
28
33
  ~~~
29
34
  yum install libxml2-devel libxslt-devel ruby-devel openssl-devel gcc gcc-c++ ruby rubygems
30
35
  ~~~
36
+ ~~~
37
+ ruby -v
38
+ ~~~
39
+
40
+ **Unless you have Ruby >= 1.9.3, please, go to [rOCCI-cli#RVM](#rvm) and install RVM with a newer Ruby version.**
31
41
 
32
42
  To use rOCCI-cli with Java, you need JRE 6 or 7. To build rOCCI-cli for Java, you need JDK 6 or 7.
33
43
 
@@ -51,13 +61,8 @@ To install the most recent beta version
51
61
  ### From source (dev)
52
62
 
53
63
  **Installation from source should never be your first choice! Especially, if you are not familiar with RVM, Bundler, Rake and other dev tools for Ruby!**
54
- **However, if you wish to contribute to our project, this is the right way to start.**
55
-
56
- To use rOCCI-cli from source it is very much recommended to use RVM. [Install RVM](https://rvm.io/rvm/install/) with
57
64
 
58
- curl -L https://get.rvm.io | bash -s stable --ruby
59
- rvm install 1.9.3
60
- rvm use 1.9.3 --default
65
+ **However, if you wish to contribute to our project, this is the right way to start.**
61
66
 
62
67
  To build and install the bleeding edge version from master
63
68
 
@@ -70,11 +75,7 @@ To build and install the bleeding edge version from master
70
75
 
71
76
  ### From source, for Java
72
77
 
73
- To use rOCCI-cli with Java it is very much recommended to use RVM. [Install RVM](https://rvm.io/rvm/install/) with
74
-
75
- curl -L https://get.rvm.io | bash -s stable --ruby
76
- rvm install jruby
77
- rvm use jruby --default
78
+ **Notice:** In order to build rOCCI-cli for Java, you need working jRuby installation. We recommend using [rOCCI-cli#RVM](#rvm).
78
79
 
79
80
  To build a Java jar file from master use
80
81
 
@@ -86,7 +87,25 @@ To build a Java jar file from master use
86
87
 
87
88
  For Linux / Mac OS X you can create a OCCI Java executable from the jar file using
88
89
 
89
- sudo echo '#!/usr/bin/java -jar' | cat - occi.jar > occi ; sudo chmod +x occi
90
+ sudo echo '#!/usr/bin/java -jar' | cat - occi-cli.jar > occi ; sudo chmod +x occi
91
+
92
+ ### RVM
93
+
94
+ **Notice:** Follow the RVM installation guide linked below, we recommend using the default 'Single-User installation'.
95
+
96
+ **Warning:** NEVER install RVM as root! If you choose the 'Multi-User installation', use a different user account with sudo access instead!
97
+
98
+ * [Installing RVM](https://rvm.io/rvm/install#explained)
99
+ * Install Ruby
100
+
101
+ ~~~
102
+ rvm requirements
103
+ rvm install 1.9.3
104
+ rvm use 1.9.3 --default
105
+ ~~~
106
+ ~~~
107
+ ruby -v
108
+ ~~~
90
109
 
91
110
  Usage
92
111
  -----
data/bin/occi CHANGED
@@ -15,13 +15,11 @@
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
17
  require 'rubygems'
18
- require 'occi-cli'
19
18
  require 'pp'
20
19
  require 'highline/import'
21
20
  require 'openssl'
22
21
 
23
- extend Occi::Api::Dsl
24
- extend Occi::Cli::Helpers
22
+ require 'occi-cli'
25
23
 
26
24
  # get arguments and validate/parse them to an ostruct
27
25
  options = Occi::Cli::OcciOpts.parse ARGV
@@ -144,7 +142,11 @@ begin
144
142
  options.resource = nil
145
143
 
146
144
  # offer just the resource types we will be able to process
147
- menu_resources = Occi::Cli::ResourceOutputFactory.allowed_resource_types
145
+ menu_resources = []
146
+ menu_resources << resource_type_identifiers.select { |i| i.include?("infrastructure#") }
147
+ menu_resources << ["http://schemas.ogf.org/occi/infrastructure#os_tpl", "http://schemas.ogf.org/occi/infrastructure#resource_tpl"]
148
+ menu_resources.flatten!
149
+ menu_resources.uniq!
148
150
 
149
151
  # separate menus from each other
150
152
  say("\n")
@@ -241,17 +243,12 @@ begin
241
243
  number_of_mixins = ask("How many mixins do you wish me to mix into this resource? ",
242
244
  Integer) { |q| q.in = 0..2 }
243
245
 
244
- options.mixins = {}
246
+ options.mixins = Occi::Core::Mixins.new
245
247
  (1..number_of_mixins).each do |mixin_number|
246
- mixin = ask("What mixin should I mix in? ") { |q| q.validate = /^\S+?#\S+$/ }
248
+ mixin = ask("What mixin should I mix in? ") { |q| q.validate = Occi::Cli::OcciOpts::MIXIN_REGEXP }
247
249
  parts = mixin.split("#")
248
250
 
249
- # TODO: find a way to remove this OCCI-OS compatibility hack
250
- parts[0] = 'os_tpl' if parts[0] == 'os'
251
- parts[0] = 'resource_tpl' if parts[0] == 'resource'
252
-
253
- options.mixins[parts[0]] = [] unless options.mixins[parts[0]]
254
- options.mixins[parts[0]] << parts[1]
251
+ options.mixins << Occi::Core::Mixin.new("#{parts[0]}#", parts[1])
255
252
  end
256
253
  end
257
254
  }
@@ -0,0 +1,5 @@
1
+ module Occi::Cli::Errors
2
+
3
+ class FormatterInputTypeError < ArgumentError; end
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ module Occi::Cli::Errors
2
+
3
+ class FormatterOutputTypeError < ArgumentError; end
4
+
5
+ end
@@ -0,0 +1,4 @@
1
+ module Occi::Cli::Errors; end
2
+
3
+ # load all
4
+ Dir[File.join(File.dirname(__FILE__), 'errors', '*.rb')].each { |file| require file.gsub('.rb', '') }
@@ -0,0 +1,5 @@
1
+ module Occi::Cli::Helpers::CommonHelper
2
+
3
+ # nothing here
4
+
5
+ end
@@ -0,0 +1,103 @@
1
+ module Occi::Cli::Helpers::CreateHelper
2
+
3
+ def helper_create(options, output = nil)
4
+ location = nil
5
+
6
+ if resource_types.include?(options.resource) || resource_type_identifiers.include?(options.resource)
7
+ Occi::Log.debug "#{options.resource.inspect} is a resource type."
8
+ raise "Not yet implemented!" unless options.resource.include? "compute"
9
+
10
+ res = resource options.resource
11
+
12
+ Occi::Log.debug "Creating #{options.resource.inspect}:\n#{res.inspect}"
13
+
14
+ helper_attach_links(options, res)
15
+ helper_attach_mixins(options, res)
16
+ helper_attach_context_vars(options, res)
17
+
18
+ # TODO: set other attributes
19
+ # TODO: OCCI-OS uses occi.compute.hostname instead of title
20
+ res.title = options.attributes[:title]
21
+ res.hostname = options.attributes[:title]
22
+
23
+ Occi::Log.debug "Creating #{options.resource.inspect}:\n#{res.inspect}"
24
+
25
+ location = create res
26
+ else
27
+ Occi::Log.warn "I have no idea what #{options.resource.inspect} is ..."
28
+ raise "Unknown resource #{options.resource.inspect}, there is nothing to create here!"
29
+ end
30
+
31
+ return location if output.nil?
32
+
33
+ puts location
34
+ end
35
+
36
+ def helper_attach_links(options, res)
37
+ return unless options.links
38
+ Occi::Log.debug "with links: #{options.links.inspect}"
39
+
40
+ options.links.each do |link|
41
+ if link.start_with? options.endpoint
42
+ link.gsub!(options.endpoint.chomp('/'), '')
43
+ end
44
+
45
+ if link.include? "/storage/"
46
+ Occi::Log.debug "Adding storagelink to #{options.resource.inspect}"
47
+ res.storagelink link
48
+ elsif link.include? "/network/"
49
+ Occi::Log.debug "Adding networkinterface to #{options.resource.inspect}"
50
+ res.networkinterface link
51
+ else
52
+ raise "Unknown link type #{link.inspect}, stopping here!"
53
+ end
54
+ end
55
+ end
56
+
57
+ def helper_attach_mixins(options, res)
58
+ return unless options.mixins
59
+ Occi::Log.debug "with mixins: #{options.mixins}"
60
+
61
+ options.mixins.to_a.each do |mxn|
62
+ Occi::Log.debug "Adding mixin #{mxn.inspect} to #{options.resource.inspect}"
63
+ res.mixins << mxn
64
+ end
65
+ end
66
+
67
+ def helper_attach_context_vars(options, res)
68
+ # TODO: find a better/universal way to do contextualization
69
+ return unless options.context_vars
70
+ Occi::Log.debug "with context variables: #{options.context_vars}"
71
+
72
+ options.context_vars.each_pair do |var, val|
73
+ schema = nil
74
+ mxn_attrs = Occi::Core::Attributes.new
75
+
76
+ case var
77
+ when :public_key
78
+ schema = "http://schemas.openstack.org/instance/credentials#"
79
+ mxn_attrs['org.openstack.credentials.publickey.name'] = {}
80
+ mxn_attrs['org.openstack.credentials.publickey.data'] = {}
81
+ when :user_data
82
+ schema = "http://schemas.openstack.org/compute/instance#"
83
+ mxn_attrs['org.openstack.compute.user_data'] = {}
84
+ else
85
+ schema = "http://schemas.ogf.org/occi/core#"
86
+ end
87
+
88
+ mxn = Occi::Core::Mixin.new(schema, var.to_s, 'OS contextualization mixin', mxn_attrs)
89
+ res.mixins << mxn
90
+
91
+ case var
92
+ when :public_key
93
+ res.attributes['org.openstack.credentials.publickey.name'] = 'Public SSH key'
94
+ res.attributes['org.openstack.credentials.publickey.data'] = val
95
+ when :user_data
96
+ res.attributes['org.openstack.compute.user_data'] = val
97
+ else
98
+ # do nothing
99
+ end
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,23 @@
1
+ module Occi::Cli::Helpers::DeleteHelper
2
+
3
+ def helper_delete(options, output = nil)
4
+ unless resource_types.include?(options.resource) || resource_type_identifiers.include?(options.resource) || options.resource.start_with?(options.endpoint) || options.resource.start_with?('/')
5
+ message = "Resource #{options.resource.inspect} cannot be deleted!"
6
+
7
+ Occi::Log.error message
8
+ raise ArgumentError, message
9
+ end
10
+
11
+ if delete(options.resource)
12
+ Occi::Log.info "Resource #{options.resource.inspect} successfully removed!"
13
+ else
14
+ message = "Failed to remove resource #{options.resource.inspect}!"
15
+
16
+ Occi::Log.error message
17
+ raise message
18
+ end
19
+
20
+ true
21
+ end
22
+
23
+ end
@@ -0,0 +1,28 @@
1
+ module Occi::Cli::Helpers::DescribeHelper
2
+
3
+ def helper_describe(options, output = nil)
4
+ if resource_types.include?(options.resource) || resource_type_identifiers.include?(options.resource) || options.resource.start_with?(options.endpoint) || options.resource.start_with?('/')
5
+ Occi::Log.debug "#{options.resource.inspect} is a resource type, type identifier or an actual resource."
6
+
7
+ found = Occi::Core::Resources.new
8
+ found.merge describe(options.resource)
9
+ elsif mixin_types.include?(options.resource) || mixin_type_identifiers.include?(options.resource)
10
+ Occi::Log.debug "#{options.resourcre.inspect} is a mixin type or type identifier."
11
+
12
+ found = Occi::Core::Mixins.new
13
+ found.merge mixins(options.resource)
14
+ else
15
+ Occi::Log.error "I have no idea what #{options.resource.inspect} is ..."
16
+ raise "Unknown resource #{options.resource.inspect}, there is nothing to describe here!"
17
+ end
18
+
19
+ helper_describe_output(found, options, output)
20
+ end
21
+
22
+ def helper_describe_output(found, options, output)
23
+ return found unless output
24
+
25
+ puts output.format(found)
26
+ end
27
+
28
+ end
@@ -0,0 +1,26 @@
1
+ module Occi::Cli::Helpers::ListHelper
2
+
3
+ def helper_list(options, output = nil)
4
+ found = []
5
+
6
+ if resource_types.include?(options.resource) || resource_type_identifiers.include?(options.resource)
7
+ Occi::Log.debug "#{options.resource.inspect} is a resource type."
8
+ found = list options.resource
9
+ elsif mixin_types.include?(options.resource) || mixin_type_identifiers.include?(options.resource)
10
+ Occi::Log.debug "#{options.resource.inspect} is a mixin type."
11
+ found = mixin_list options.resource
12
+ else
13
+ Occi::Log.error "I have no idea what #{options.resource.inspect} is ..."
14
+ raise "Unknown resource #{options.resource.inspect}, there is nothing to list here!"
15
+ end
16
+
17
+ helper_list_output(found, options, output)
18
+ end
19
+
20
+ def helper_list_output(found, options, output)
21
+ return found unless output
22
+
23
+ puts output.format(found)
24
+ end
25
+
26
+ end
@@ -0,0 +1,7 @@
1
+ module Occi::Cli::Helpers::TriggerHelper
2
+
3
+ def helper_trigger(options, output = nil)
4
+ raise "Not yet implemented!"
5
+ end
6
+
7
+ end
@@ -1,212 +1,12 @@
1
1
  # a bunch of OCCI client helpers for bin/occi
2
- module Occi::Cli
3
- module Helpers
2
+ module Occi::Cli::Helpers; end
4
3
 
5
- def helper_list(options, output = nil)
6
- found = []
4
+ # load all
5
+ Dir[File.join(File.dirname(__FILE__), 'helpers', '*.rb')].each { |file| require file.gsub('.rb', '') }
7
6
 
8
- if resource_types.include? options.resource
9
- Occi::Log.debug "#{options.resource} is a resource type."
10
- found = list options.resource
11
- elsif mixin_types.include? options.resource
12
- Occi::Log.debug "#{options.resource} is a mixin type."
13
- found = mixins options.resource
14
- else
15
- Occi::Log.warn "I have no idea what #{options.resource} is ..."
16
- raise "Unknown resource #{options.resource}, there is nothing to list here!"
17
- end
18
-
19
- helper_list_output(found, options, output)
20
- end
21
-
22
- def helper_list_output(found, options, output)
23
- return found unless output
24
-
25
- helper_formatter_output(found, output, :locations, options.resource.to_sym)
26
-
27
- nil
28
- end
29
-
30
- def helper_describe(options, output = nil)
31
- found = []
32
-
33
- if resource_types.include?(options.resource) || options.resource.start_with?(options.endpoint) || options.resource.start_with?('/')
34
- Occi::Log.debug "#{options.resource} is a resource type or an actual resource."
35
-
36
- found = describe(options.resource)
37
- elsif mixin_types.include? options.resource
38
- Occi::Log.debug "#{options.resourcre} is a mixin type."
39
-
40
- mixins(options.resource).each do |mxn|
41
- mxn = mxn.split("#").last
42
- found << mixin(mxn, options.resource, true)
43
- end
44
- elsif mixin_types.include? options.resource.split('#').first
45
- Occi::Log.debug "#{options.resource} is a specific mixin type."
46
-
47
- mxn_type,mxn = options.resource.split('#')
48
- found << mixin(mxn, mxn_type, true)
49
- else
50
- Occi::Log.warn "I have no idea what #{options.resource} is ..."
51
- raise "Unknown resource #{options.resource}, there is nothing to describe here!"
52
- end
53
-
54
- helper_describe_output(found, options, output)
55
- end
56
-
57
- def helper_describe_output(found, options, output)
58
- return found unless output
59
-
60
- if options.resource.start_with? options.endpoint
61
- # resource contains full endpoint URI
62
- # e.g., http://localhost:3300/network/adfgadf-daf5a6df4afadf-adfad65f4ad
63
- resource_type = options.resource.split('/')[3].to_sym
64
- elsif options.resource.start_with? '/'
65
- # resource contains a path relative to endpoint URI
66
- # e.g., /network/adfgadf-daf5a6df4afadf-adfad65f4ad
67
- resource_type = options.resource.split('/')[1].to_sym
68
- elsif mixin_types.include? options.resource.split('#').first
69
- # resource contains a mixin with a type
70
- # e.g., os_tpl#debian6
71
- resource_type = options.resource.split('#').first.to_sym
72
- else
73
- # resource probably contains RAW resource_type
74
- resource_type = options.resource.to_sym
75
- end
76
-
77
- helper_formatter_output(found, output, :resources, resource_type)
78
-
79
- nil
80
- end
81
-
82
- def helper_create(options, output = nil)
83
- location = nil
84
-
85
- if resource_types.include? options.resource
86
- Occi::Log.debug "#{options.resource} is a resource type."
87
- raise "Not yet implemented!" unless options.resource.include? "compute"
88
-
89
- res = resource options.resource
90
-
91
- Occi::Log.debug "Creating #{options.resource}:\n#{res.inspect}"
92
-
93
- helper_attach_links(options, res)
94
- helper_attach_mixins(options, res)
95
- helper_attach_context_vars(options, res)
96
-
97
- # TODO: set other attributes
98
- # TODO: OCCI-OS uses occi.compute.hostname instead of title
99
- res.title = options.attributes[:title]
100
- res.hostname = options.attributes[:title]
101
-
102
- Occi::Log.debug "Creating #{options.resource}:\n#{res.inspect}"
103
-
104
- location = create res
105
- else
106
- Occi::Log.warn "I have no idea what #{options.resource} is ..."
107
- raise "Unknown resource #{options.resource}, there is nothing to create here!"
108
- end
109
-
110
- return location if output.nil?
111
-
112
- puts location
113
- end
114
-
115
- def helper_attach_links(options, res)
116
- return unless options.links
117
- Occi::Log.debug "with links: #{options.links}"
118
-
119
- options.links.each do |link|
120
- if link.start_with? options.endpoint
121
- link.gsub!(options.endpoint.chomp('/'), '')
122
- end
123
-
124
- if link.include? "/storage/"
125
- Occi::Log.debug "Adding storagelink to #{options.resource}"
126
- res.storagelink link
127
- elsif link.include? "/network/"
128
- Occi::Log.debug "Adding networkinterface to #{options.resource}"
129
- res.networkinterface link
130
- else
131
- raise "Unknown link type #{link}, stopping here!"
132
- end
133
- end
134
- end
135
-
136
- def helper_attach_mixins(options, res)
137
- return unless options.mixins
138
- Occi::Log.debug "with mixins: #{options.mixins}"
139
-
140
- options.mixins.keys.each do |type|
141
- Occi::Log.debug "Adding mixins of type #{type} to #{options.resource}"
142
-
143
- options.mixins[type].each do |name|
144
- mxn = mixin name, type
145
-
146
- raise "Unknown mixin #{type}##{name}, stopping here!" unless mxn
147
- Occi::Log.debug "Adding mixin #{mxn} to #{options.resource}"
148
- res.mixins << mxn
149
- end
150
- end
151
- end
152
-
153
- def helper_attach_context_vars(options, res)
154
- # TODO: find a better/universal way to do contextualization
155
- return unless options.context_vars
156
- Occi::Log.debug "with context variables: #{options.context_vars}"
157
-
158
- options.context_vars.each_pair do |var, val|
159
- schema = nil
160
- mxn_attrs = Occi::Core::Attributes.new
161
-
162
- case var
163
- when :public_key
164
- schema = "http://schemas.openstack.org/instance/credentials#"
165
- mxn_attrs['org.openstack.credentials.publickey.name'] = {}
166
- mxn_attrs['org.openstack.credentials.publickey.data'] = {}
167
- when :user_data
168
- schema = "http://schemas.openstack.org/compute/instance#"
169
- mxn_attrs['org.openstack.compute.user_data'] = {}
170
- else
171
- schema = "http://schemas.ogf.org/occi/core#"
172
- end
173
-
174
- mxn = Occi::Core::Mixin.new(schema, var.to_s, 'OS contextualization mixin', mxn_attrs)
175
- res.mixins << mxn
176
-
177
- case var
178
- when :public_key
179
- res.attributes['org.openstack.credentials.publickey.name'] = 'Public SSH key'
180
- res.attributes['org.openstack.credentials.publickey.data'] = val
181
- when :user_data
182
- res.attributes['org.openstack.compute.user_data'] = val
183
- else
184
- # do nothing
185
- end
186
- end
187
- end
188
-
189
- def helper_delete(options, output = nil)
190
- if delete(options.resource)
191
- Occi::Log.info "Resource #{options.resource} successfully removed!"
192
- else
193
- raise "Failed to remove resource #{options.resource}!"
194
- end
195
-
196
- true
197
- end
198
-
199
- def helper_trigger(options, output = nil)
200
- raise "Not yet implemented!"
201
- end
202
-
203
- def helper_formatter_output(found, output, format_symbol, resource_type)
204
- if Occi::Cli::ResourceOutputFactory.allowed_resource_types.include? resource_type
205
- puts output.format(found, format_symbol, resource_type)
206
- else
207
- Occi::Log.warn "Not printing, resource type [#{resource_type.to_s}] is not supported!"
208
- end
209
- end
210
-
211
- end
212
- end
7
+ extend Occi::Cli::Helpers::CommonHelper
8
+ extend Occi::Cli::Helpers::ListHelper
9
+ extend Occi::Cli::Helpers::DescribeHelper
10
+ extend Occi::Cli::Helpers::CreateHelper
11
+ extend Occi::Cli::Helpers::DeleteHelper
12
+ extend Occi::Cli::Helpers::TriggerHelper
@@ -15,6 +15,9 @@ module Occi::Cli
15
15
  LOG_OUTPUTS = [:stdout, :stderr].freeze
16
16
  ALLOWED_CONTEXT_VARS = [:public_key, :user_data].freeze
17
17
 
18
+ MIXIN_REGEXP = /^(https?:\/\/\S+?)#(\S+)$/
19
+ CONTEXT_REGEXP = ATTR_REGEXP = /^(.+?)=(.+)$/
20
+
18
21
  def self.parse(args, test_env = false)
19
22
 
20
23
  @@quiet = test_env
@@ -45,7 +48,7 @@ module Occi::Cli
45
48
 
46
49
  options.output_format = :plain
47
50
 
48
- options.mixins = nil
51
+ options.mixins = Occi::Core::Mixins.new
49
52
  options.links = nil
50
53
  options.attributes = nil
51
54
  options.context_vars = nil
@@ -66,7 +69,7 @@ occi --endpoint https://localhost:3300/ --action list --resource resource_tpl --
66
69
 
67
70
  occi --endpoint https://localhost:3300/ --action describe --resource os_tpl#debian6 --auth x509
68
71
 
69
- occi --endpoint https://localhost:3300/ --action create --resource compute --mixin os_tpl#debian6 --mixin resource_tpl#small --attributes title="My rOCCI VM" --auth x509
72
+ occi --endpoint https://localhost:3300/ --action create --resource compute --mixin os_tpl#debian6 --mixin resource_tpl#small --attribute title="My rOCCI VM" --auth x509
70
73
 
71
74
  occi --endpoint https://localhost:3300/ --action delete --resource /compute/65sd4f654sf65g4-s5fg65sfg465sfg-sf65g46sf5g4sdfg --auth x509}
72
75
 
@@ -163,22 +166,18 @@ occi --endpoint https://localhost:3300/ --action delete --resource /compute/65sd
163
166
  "--resource RESOURCE",
164
167
  String,
165
168
  "Resource to be queried (e.g. network, compute, storage etc.), required") do |resource|
166
- # TODO: find a way to remove this OCCI-OS compatibility hack
167
- resource = 'os_tpl' if resource == 'os'
168
- resource = 'resource_tpl' if resource == 'resource'
169
-
170
169
  options.resource = resource
171
170
  end
172
171
 
173
172
  opts.on("-t",
174
- "--attributes ATTRS",
173
+ "--attribute ATTRS",
175
174
  Array,
176
175
  "Comma separated attributes for new resources such as title=\"Name\", required") do |attributes|
177
- options.attributes = {}
176
+ options.attributes ||= {}
178
177
 
179
178
  attributes.each do |attribute|
180
- ary = /^(.+?)=(.+)$/.match(attribute).to_a.drop 1
181
- raise ArgumentError, "Attributes must always contain ATTR=VALUE pairs!" if ary.length != 2
179
+ ary = ATTR_REGEXP.match(attribute).to_a.drop 1
180
+ raise ArgumentError, "Attribute must always contain ATTR=VALUE pairs!" unless ary.length == 2
182
181
 
183
182
  options.attributes[ary[0].to_sym] = ary[1]
184
183
  end
@@ -187,12 +186,12 @@ occi --endpoint https://localhost:3300/ --action delete --resource /compute/65sd
187
186
  opts.on("-T",
188
187
  "--context CTX_VARS",
189
188
  Array,
190
- "Comma separated context variables for new compute resources such as SSH_KEY=\"ssh-rsa dfsdf...adfdf== user@localhost\"") do |context|
191
- options.context_vars = {}
189
+ "Comma separated context variables for new compute resources such as public_key=\"ssh-rsa dfsdf...adfdf== user@localhost\"") do |context|
190
+ options.context_vars ||= {}
192
191
 
193
192
  context.each do |ctx|
194
- ary = /^(.+?)=(.+)$/.match(ctx).to_a.drop 1
195
- raise ArgumentError, "Context variables must always contain ATTR=VALUE pairs!" if ary.length != 2
193
+ ary = CONTEXT_REGEXP.match(ctx).to_a.drop 1
194
+ raise ArgumentError, "Context variables must always contain ATTR=VALUE pairs!" unless ary.length == 2
196
195
 
197
196
  symbol = ary[0].to_sym
198
197
  if ALLOWED_CONTEXT_VARS.include?(symbol)
@@ -222,32 +221,29 @@ occi --endpoint https://localhost:3300/ --action delete --resource /compute/65sd
222
221
 
223
222
  opts.on("-M",
224
223
  "--mixin NAME",
225
- String,
226
- "Type and name of the mixin as TYPE#NAME (e.g. os_tpl#monitoring, resource_tpl#medium)") do |mixin|
227
- parts = /^(\S+?)#(\S+)$/.match(mixin)
228
- raise "Unknown mixin format! Use TYPE#NAME!" unless parts
229
-
230
- parts = parts.to_a.drop(1)
224
+ Array,
225
+ "Type and name of the mixin as SCHEME#NAME (e.g. http://localhost/os_tpl#monitoring, http://localhost/resource_tpl#medium)") do |mixins|
226
+ options.mixins ||= Occi::Core::Mixins.new
231
227
 
232
- # TODO: find a way to remove this OCCI-OS compatibility hack
233
- parts[0] = 'os_tpl' if parts[0] == 'os'
234
- parts[0] = 'resource_tpl' if parts[0] == 'resource'
228
+ mixins.each do |mixin|
229
+ parts = MIXIN_REGEXP.match(mixin).to_a.drop(1)
230
+ raise "Unknown mixin format #{mixin.inspect}! Use SCHEME#NAME!" unless parts.length == 2
235
231
 
236
- options.mixins = {} unless options.mixins
237
- options.mixins[parts[0]] = [] unless options.mixins[parts[0]]
238
- options.mixins[parts[0]] << parts[1]
232
+ options.mixins << Occi::Core::Mixin.new("#{parts[0]}#", parts[1])
233
+ end
239
234
  end
240
235
 
241
236
  opts.on("-j",
242
237
  "--link URI",
243
- String,
244
- "Link specified resource to the resource being created, only for action CREATE and resource COMPUTE") do |link|
245
- link_relative_path = URI(link).path
246
-
247
- raise ArgumentError, "Specified link URI is not valid!" unless link_relative_path.start_with? '/'
238
+ Array,
239
+ "Link specified resource to the resource being created, only for action CREATE and resource COMPUTE") do |links|
240
+ options.links ||= []
248
241
 
249
- options.links = [] unless options.links
250
- options.links << link_relative_path
242
+ links.each do |link|
243
+ link_relative_path = URI(link).path
244
+ raise ArgumentError, "Specified link URI is not valid!" unless link_relative_path.start_with? '/'
245
+ options.links << link_relative_path
246
+ end
251
247
  end
252
248
 
253
249
  opts.on("-g",
@@ -6,108 +6,83 @@ module Occi::Cli
6
6
  class ResourceOutputFactory
7
7
 
8
8
  @@allowed_formats = [:json, :plain, :json_pretty].freeze
9
- @@allowed_resource_types = [:compute, :storage, :network, :os_tpl, :resource_tpl].freeze
10
- @@allowed_data_types = [:locations, :resources].freeze
11
9
 
12
10
  attr_reader :output_format
13
11
 
14
12
  def initialize(output_format = :plain)
15
- raise "Unsupported output format!" unless @@allowed_formats.include? output_format
13
+ raise Occi::Cli::Errors::FormatterOutputTypeError,
14
+ "Format #{output_format.inspect} is not supported!" unless @@allowed_formats.include? output_format
16
15
  @output_format = output_format
17
16
  end
18
17
 
19
- def format(data, data_type, resource_type)
20
- raise "Data has to be in an array!" unless data.is_a? Array
21
- raise "Unsupported resource type! Got: #{resource_type.to_s}" unless @@allowed_resource_types.include? resource_type
22
- raise "Unsupported data type! Got: #{data_type.to_s}" unless @@allowed_data_types.include? data_type
23
-
24
- # validate incoming data
25
- if data_type == :resources
26
- data.each do |occi_collection|
27
- raise "I need the resources to be in a Collection!" unless occi_collection.respond_to? :as_json
28
- end
18
+ def format(data)
19
+ # construct a method name from data type and output format
20
+ if data.kind_of? Occi::Core::Resources
21
+ method = "resources_to_#{@output_format}".to_sym
22
+ elsif data.kind_of? Occi::Core::Mixins
23
+ method = "mixins_to_#{@output_format}".to_sym
24
+ elsif data.kind_of? Array
25
+ raise Occi::Cli::Errors::FormatterInputTypeError,
26
+ "Arrays with #{data.first.class.name.inspect} are not supported!" unless data.first.nil? || data.first.kind_of?(String)
27
+ method = "locations_to_#{@output_format}".to_sym
28
+ else
29
+ raise Occi::Cli::Errors::FormatterInputTypeError,
30
+ "Data format #{data.class.name.inspect} is not supported!"
29
31
  end
30
32
 
31
- # construct method name from data type and output format
32
- method = (data_type.to_s + "_to_" + output_format.to_s).to_sym
33
-
34
- send method, data, resource_type
33
+ send method, data
35
34
  end
36
35
 
37
36
  def self.allowed_formats
38
37
  @@allowed_formats
39
38
  end
40
39
 
41
- def self.allowed_resource_types
42
- @@allowed_resource_types
43
- end
44
-
45
- def self.allowed_data_types
46
- @@allowed_data_types
40
+ def resources_to_json(occi_resources)
41
+ # generate JSON document from Occi::Core::Resources
42
+ if @output_format == :json_pretty
43
+ JSON.pretty_generate occi_resources.as_json
44
+ else
45
+ JSON.generate occi_resources.as_json
46
+ end
47
47
  end
48
+ alias_method :resources_to_json_pretty, :resources_to_json
49
+ alias_method :mixins_to_json, :resources_to_json
50
+ alias_method :mixins_to_json_pretty, :resources_to_json
48
51
 
49
- def resources_to_json(occi_resources, resource_type)
50
- # generate JSON document from an array of JSON objects
52
+ def locations_to_json(url_locations)
53
+ # generate JSON document from an array of strings
51
54
  if @output_format == :json_pretty
52
- JSON.pretty_generate occi_resources
55
+ JSON.pretty_generate locations
53
56
  else
54
- JSON.generate occi_resources
57
+ JSON.generate locations
55
58
  end
56
59
  end
57
- alias_method :resources_to_json_pretty, :resources_to_json
60
+ alias_method :locations_to_json_pretty, :locations_to_json
58
61
 
59
- def resources_to_plain(occi_resources, resource_type)
62
+ def resources_to_plain(occi_resources)
60
63
  # using ERB templates for known resource and mixin types
61
- file = "#{File.expand_path('..', __FILE__)}/templates/#{resource_type.to_s}.erb"
64
+ file = "#{File.expand_path('..', __FILE__)}/templates/resources.erb"
62
65
  template = ERB.new(File.new(file).read, nil, '-')
63
66
 
64
- formatted_output = "\n"
65
-
66
- occi_resources.each do |occi_resource|
67
- json_resource = occi_resource.as_json
68
- next unless json_resource
69
-
70
- if json_resource.resources && json_resource.resources.first
71
- attributes = json_resource.resources.first.attributes
72
- next unless attributes && attributes.occi
73
-
74
- links = json_resource.links || []
75
- end
76
-
77
- formatted_output << template.result(binding)
78
- end
67
+ formatted_output = ""
68
+ formatted_output << template.result(binding) unless occi_resources.blank?
79
69
 
80
70
  formatted_output
81
71
  end
82
72
 
83
- def locations_to_json(url_locations, resource_type)
84
- # give all locatios a common key and convert to JSON
85
- locations = { resource_type => [] }
73
+ def mixins_to_plain(occi_resources)
74
+ # using ERB templates for known resource and mixin types
75
+ file = "#{File.expand_path('..', __FILE__)}/templates/mixins.erb"
76
+ template = ERB.new(File.new(file).read, nil, '-')
86
77
 
87
- url_locations.each do |location|
88
- location = location.split("/").last if [:os_tpl, :resource_tpl].include? resource_type
89
- locations[resource_type] << location
90
- end
78
+ formatted_output = ""
79
+ formatted_output << template.result(binding) unless occi_resources.blank?
91
80
 
92
- # generate JSON document from an array of strings
93
- if @output_format == :json_pretty
94
- JSON.pretty_generate locations
95
- else
96
- JSON.generate locations
97
- end
81
+ formatted_output
98
82
  end
99
- alias_method :locations_to_json_pretty, :locations_to_json
100
-
101
- def locations_to_plain(url_locations, resource_type)
102
- # just an attempt to make the array more readable
103
- output = "\n#{resource_type.to_s.capitalize} locations:\n"
104
-
105
- url_locations.each do |location|
106
- location = location.split("/").last if [:os_tpl, :resource_tpl].include? resource_type
107
- output << "\t" << location << "\n"
108
- end
109
83
 
110
- "#{output}\n"
84
+ def locations_to_plain(url_locations)
85
+ url_locations.join("\n")
111
86
  end
112
87
 
113
88
  end
@@ -0,0 +1,9 @@
1
+ <%- # We always get Occi::Core::Mixins -%>
2
+ <%- occi_resources.each do |mixin| -%>
3
+ [<%= mixin.type_identifier %>]
4
+ Title: <%= mixin.title %>
5
+ Term: <%= mixin.term %>
6
+ Location: <%= mixin.location %>
7
+
8
+
9
+ <%- end -%>
@@ -0,0 +1,25 @@
1
+ <%- # We always get Occi::Core::Resources -%>
2
+ <%- occi_resources.each do |resource| -%>
3
+ [<%= resource.kind.type_identifier %>]
4
+ <%- resource.attributes.names.each_pair do |attribute, value| -%>
5
+ <%= attribute %> = <%= value %>
6
+ <%- end -%>
7
+
8
+ <%- resource.links.each do |link| -%>
9
+ [<%= link.kind.type_identifier %>]
10
+ <%- link.attributes.names.each_pair do |attribute, value| -%>
11
+ <%= attribute %> = <%= value %>
12
+ <%- end -%>
13
+
14
+ <%- end -%>
15
+
16
+ <%- resource.mixins.each do |mixin| -%>
17
+ [<%= mixin.type_identifier %>]
18
+ Title: <%= mixin.title %>
19
+ Term: <%= mixin.term %>
20
+ Location: <%= mixin.location %>
21
+
22
+ <%- end -%>
23
+
24
+
25
+ <%- end -%>
@@ -1,5 +1,5 @@
1
1
  module Occi
2
2
  module Cli
3
- VERSION = "4.1.0" unless defined?(::Occi::Cli::VERSION)
3
+ VERSION = "4.2.0.beta.2" unless defined?(::Occi::Cli::VERSION)
4
4
  end
5
5
  end
data/lib/occi-cli.rb CHANGED
@@ -4,6 +4,12 @@ require 'occi-api'
4
4
  module Occi::Cli; end
5
5
 
6
6
  require 'occi/cli/version'
7
+ require 'occi/cli/errors'
7
8
  require 'occi/cli/occi_opts'
8
9
  require 'occi/cli/resource_output_factory'
10
+
11
+ # get DSL definitions
12
+ extend Occi::Api::Dsl
13
+
14
+ # include helpers
9
15
  require 'occi/cli/helpers'
data/occi-cli.gemspec CHANGED
@@ -19,18 +19,9 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = `git ls-files -- {test,spec}/*`.split("\n")
20
20
  gem.require_paths = ["lib"]
21
21
 
22
- gem.add_dependency 'occi-api', '~> 4.1.0'
22
+ gem.add_dependency 'occi-api', '= 4.2.0.beta.2'
23
23
  gem.add_dependency 'highline'
24
24
  gem.add_dependency 'json'
25
25
 
26
- gem.add_development_dependency "rspec"
27
- gem.add_development_dependency "rake"
28
- gem.add_development_dependency "builder"
29
- gem.add_development_dependency "simplecov"
30
- gem.add_development_dependency "yard"
31
- gem.add_development_dependency "yard-sinatra"
32
- gem.add_development_dependency "yard-rspec"
33
- gem.add_development_dependency "yard-cucumber"
34
-
35
26
  gem.required_ruby_version = ">= 1.9.3"
36
27
  end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,15 @@
1
1
  require 'rubygems'
2
- require 'occi-cli'
3
2
 
4
3
  # enable coverage reports
5
4
  if ENV['COVERAGE']
6
5
  require 'simplecov'
6
+
7
+ SimpleCov.add_filter "/spec/"
7
8
  SimpleCov.start
8
9
  end
9
10
 
11
+ require 'occi-cli'
12
+
10
13
  RSpec.configure do |c|
11
14
  # in RSpec 3 this will no longer be necessary.
12
15
  c.treat_symbols_as_metadata_keys_with_true_values = true
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: occi-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
5
- prerelease:
4
+ version: 4.2.0.beta.2
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Florian Feldhaus
@@ -11,24 +11,24 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-08-15 00:00:00.000000000 Z
14
+ date: 2013-12-04 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: occi-api
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
- - - ~>
21
+ - - '='
22
22
  - !ruby/object:Gem::Version
23
- version: 4.1.0
23
+ version: 4.2.0.beta.2
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  none: false
28
28
  requirements:
29
- - - ~>
29
+ - - '='
30
30
  - !ruby/object:Gem::Version
31
- version: 4.1.0
31
+ version: 4.2.0.beta.2
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: highline
34
34
  requirement: !ruby/object:Gem::Requirement
@@ -61,134 +61,6 @@ dependencies:
61
61
  - - ! '>='
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0'
64
- - !ruby/object:Gem::Dependency
65
- name: rspec
66
- requirement: !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ! '>='
70
- - !ruby/object:Gem::Version
71
- version: '0'
72
- type: :development
73
- prerelease: false
74
- version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ! '>='
78
- - !ruby/object:Gem::Version
79
- version: '0'
80
- - !ruby/object:Gem::Dependency
81
- name: rake
82
- requirement: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
88
- type: :development
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
- requirements:
93
- - - ! '>='
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- - !ruby/object:Gem::Dependency
97
- name: builder
98
- requirement: !ruby/object:Gem::Requirement
99
- none: false
100
- requirements:
101
- - - ! '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
- requirements:
109
- - - ! '>='
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
- - !ruby/object:Gem::Dependency
113
- name: simplecov
114
- requirement: !ruby/object:Gem::Requirement
115
- none: false
116
- requirements:
117
- - - ! '>='
118
- - !ruby/object:Gem::Version
119
- version: '0'
120
- type: :development
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- none: false
124
- requirements:
125
- - - ! '>='
126
- - !ruby/object:Gem::Version
127
- version: '0'
128
- - !ruby/object:Gem::Dependency
129
- name: yard
130
- requirement: !ruby/object:Gem::Requirement
131
- none: false
132
- requirements:
133
- - - ! '>='
134
- - !ruby/object:Gem::Version
135
- version: '0'
136
- type: :development
137
- prerelease: false
138
- version_requirements: !ruby/object:Gem::Requirement
139
- none: false
140
- requirements:
141
- - - ! '>='
142
- - !ruby/object:Gem::Version
143
- version: '0'
144
- - !ruby/object:Gem::Dependency
145
- name: yard-sinatra
146
- requirement: !ruby/object:Gem::Requirement
147
- none: false
148
- requirements:
149
- - - ! '>='
150
- - !ruby/object:Gem::Version
151
- version: '0'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- none: false
156
- requirements:
157
- - - ! '>='
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- - !ruby/object:Gem::Dependency
161
- name: yard-rspec
162
- requirement: !ruby/object:Gem::Requirement
163
- none: false
164
- requirements:
165
- - - ! '>='
166
- - !ruby/object:Gem::Version
167
- version: '0'
168
- type: :development
169
- prerelease: false
170
- version_requirements: !ruby/object:Gem::Requirement
171
- none: false
172
- requirements:
173
- - - ! '>='
174
- - !ruby/object:Gem::Version
175
- version: '0'
176
- - !ruby/object:Gem::Dependency
177
- name: yard-cucumber
178
- requirement: !ruby/object:Gem::Requirement
179
- none: false
180
- requirements:
181
- - - ! '>='
182
- - !ruby/object:Gem::Version
183
- version: '0'
184
- type: :development
185
- prerelease: false
186
- version_requirements: !ruby/object:Gem::Requirement
187
- none: false
188
- requirements:
189
- - - ! '>='
190
- - !ruby/object:Gem::Version
191
- version: '0'
192
64
  description: This gem is a client implementation of the Open Cloud Computing Interface
193
65
  in Ruby
194
66
  email:
@@ -213,14 +85,20 @@ files:
213
85
  - config/warble.rb
214
86
  - doc/macosx.md
215
87
  - lib/occi-cli.rb
88
+ - lib/occi/cli/errors.rb
89
+ - lib/occi/cli/errors/formatter_input_type_error.rb
90
+ - lib/occi/cli/errors/formatter_output_type_error.rb
216
91
  - lib/occi/cli/helpers.rb
92
+ - lib/occi/cli/helpers/common_helper.rb
93
+ - lib/occi/cli/helpers/create_helper.rb
94
+ - lib/occi/cli/helpers/delete_helper.rb
95
+ - lib/occi/cli/helpers/describe_helper.rb
96
+ - lib/occi/cli/helpers/list_helper.rb
97
+ - lib/occi/cli/helpers/trigger_helper.rb
217
98
  - lib/occi/cli/occi_opts.rb
218
99
  - lib/occi/cli/resource_output_factory.rb
219
- - lib/occi/cli/templates/compute.erb
220
- - lib/occi/cli/templates/network.erb
221
- - lib/occi/cli/templates/os_tpl.erb
222
- - lib/occi/cli/templates/resource_tpl.erb
223
- - lib/occi/cli/templates/storage.erb
100
+ - lib/occi/cli/templates/mixins.erb
101
+ - lib/occi/cli/templates/resources.erb
224
102
  - lib/occi/cli/version.rb
225
103
  - occi-cli.gemspec
226
104
  - spec/occi/cli/helpers_spec.rb
@@ -243,9 +121,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
243
121
  required_rubygems_version: !ruby/object:Gem::Requirement
244
122
  none: false
245
123
  requirements:
246
- - - ! '>='
124
+ - - ! '>'
247
125
  - !ruby/object:Gem::Version
248
- version: '0'
126
+ version: 1.3.1
249
127
  requirements: []
250
128
  rubyforge_project:
251
129
  rubygems_version: 1.8.25
@@ -1,22 +0,0 @@
1
- <%- # We always get a JSON -%>
2
- COMPUTE:
3
- ID: <%= attributes.occi.core.id %>
4
- TITLE: <%= attributes.occi.core.title || attributes.occi.compute.hostname %>
5
- STATE: <%= attributes.occi.compute.state %>
6
- MEMORY: <%= attributes.occi.compute.memory %> GB
7
- CORES: <%= attributes.occi.compute.cores %>
8
- LINKS:
9
- <%- links.each do |link| -%>
10
- <%- next unless link && link.attributes -%>
11
-
12
- LINK "<%= link.kind %>":
13
- ID: <%= link.attributes.occi.core.id %>
14
- TITLE: <%= link.attributes.occi.core.title || link.target.split('/').last %>
15
- TARGET: <%= link.target %>
16
- <% if link.attributes.occi.networkinterface %>
17
- IP ADDRESS: <%= link.attributes.occi.networkinterface.address %>
18
- MAC ADDRESS: <%= link.attributes.occi.networkinterface.mac %>
19
- <% elsif link.attributes.occi.storagelink %>
20
- MOUNT POINT: <%= link.attributes.occi.storagelink.deviceid %>
21
- <%- end -%>
22
- <% end if links %>
@@ -1,8 +0,0 @@
1
- <%- # We always get a JSON -%>
2
- NETWORK:
3
- ID: <%= attributes.occi.core.id %>
4
- TITLE: <%= attributes.occi.core.title || attributes.occi.network.label %>
5
- STATE: <%= attributes.occi.network.state %>
6
- ALLOCATION: <%= attributes.occi.network.allocation || (attributes.occi.networkinterface && attributes.occi.networkinterface.allocation) %>
7
- ADDRESS: <%= attributes.occi.network.address || (attributes.occi.networkinterface && attributes.occi.networkinterface.address) %>
8
-
@@ -1,6 +0,0 @@
1
- <%- # We always get a JSON -%>
2
- OS_TPL:
3
- TITLE: <%= json_resource.title %>
4
- TERM: <%= json_resource.term %>
5
- LOCATION: <%= json_resource.location %>
6
-
@@ -1,6 +0,0 @@
1
- <%- # We always get a JSON -%>
2
- RESOURCE_TPL:
3
- TITLE: <%= json_resource.title %>
4
- TERM: <%= json_resource.term %>
5
- LOCATION: <%= json_resource.location %>
6
-
@@ -1,7 +0,0 @@
1
- <%- # We always get a JSON -%>
2
- STORAGE:
3
- ID: <%= attributes.occi.core.id %>
4
- TITLE: <%= attributes.occi.core.title %>
5
- STATE: <%= attributes.occi.storage.state%>
6
- DESCRIPTION: <%= attributes.occi.core.summary %>
7
-