opennebula 5.12.9 → 6.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ActionManager.rb +1 -1
  3. data/lib/CommandManager.rb +1 -1
  4. data/lib/DriverExecHelper.rb +44 -28
  5. data/lib/OpenNebulaDriver.rb +8 -4
  6. data/lib/VirtualMachineDriver.rb +9 -2
  7. data/lib/cloud/CloudClient.rb +3 -3
  8. data/lib/datacenter.rb +1257 -0
  9. data/lib/datastore.rb +1025 -0
  10. data/lib/distributed_firewall.rb +280 -0
  11. data/lib/file_helper.rb +370 -0
  12. data/lib/host.rb +1517 -0
  13. data/lib/logical_port.rb +50 -0
  14. data/lib/logical_switch.rb +77 -0
  15. data/lib/memoize.rb +74 -0
  16. data/lib/models.rb +32 -0
  17. data/lib/models/role.rb +1126 -0
  18. data/lib/models/service.rb +709 -0
  19. data/lib/network.rb +699 -0
  20. data/lib/nsx_client.rb +144 -0
  21. data/lib/nsx_component.rb +28 -0
  22. data/lib/nsx_constants.rb +149 -0
  23. data/lib/nsx_driver.rb +78 -0
  24. data/lib/nsx_error.rb +77 -0
  25. data/lib/nsx_rule.rb +193 -0
  26. data/lib/nsxt_client.rb +176 -0
  27. data/lib/nsxt_dfw.rb +196 -0
  28. data/lib/nsxt_logical_port.rb +94 -0
  29. data/lib/nsxt_rule.rb +188 -0
  30. data/lib/nsxt_tz.rb +38 -0
  31. data/lib/nsxv_client.rb +176 -0
  32. data/lib/nsxv_dfw.rb +202 -0
  33. data/lib/nsxv_logical_port.rb +107 -0
  34. data/lib/nsxv_rule.rb +172 -0
  35. data/lib/nsxv_tz.rb +41 -0
  36. data/lib/opaque_network.rb +134 -0
  37. data/lib/opennebula.rb +5 -2
  38. data/lib/opennebula/acl.rb +1 -1
  39. data/lib/opennebula/acl_pool.rb +1 -1
  40. data/lib/opennebula/client.rb +10 -2
  41. data/lib/opennebula/cluster.rb +1 -1
  42. data/lib/opennebula/cluster_pool.rb +1 -1
  43. data/lib/opennebula/datastore.rb +1 -1
  44. data/lib/opennebula/datastore_pool.rb +1 -1
  45. data/lib/opennebula/document.rb +8 -29
  46. data/lib/opennebula/document_json.rb +42 -12
  47. data/lib/opennebula/document_pool.rb +1 -1
  48. data/lib/opennebula/document_pool_json.rb +1 -1
  49. data/lib/opennebula/error.rb +4 -1
  50. data/lib/opennebula/flow.rb +23 -0
  51. data/lib/opennebula/flow/grammar.rb +1195 -0
  52. data/lib/opennebula/flow/service_pool.rb +190 -0
  53. data/lib/opennebula/flow/service_template.rb +608 -0
  54. data/lib/opennebula/flow/service_template_ext.rb +84 -0
  55. data/lib/opennebula/flow/service_template_pool.rb +32 -0
  56. data/lib/opennebula/flow/validator.rb +499 -0
  57. data/lib/opennebula/group.rb +1 -1
  58. data/lib/opennebula/group_pool.rb +1 -1
  59. data/lib/opennebula/hook.rb +5 -12
  60. data/lib/opennebula/hook_log.rb +1 -1
  61. data/lib/opennebula/hook_pool.rb +1 -1
  62. data/lib/opennebula/host.rb +1 -1
  63. data/lib/opennebula/host_pool.rb +1 -1
  64. data/lib/opennebula/image.rb +19 -14
  65. data/lib/opennebula/image_pool.rb +1 -1
  66. data/lib/opennebula/ldap_auth.rb +1 -1
  67. data/lib/opennebula/ldap_auth_spec.rb +1 -1
  68. data/lib/opennebula/lockable_ext.rb +163 -0
  69. data/lib/opennebula/marketplace.rb +1 -1
  70. data/lib/opennebula/marketplace_pool.rb +1 -1
  71. data/lib/opennebula/marketplaceapp.rb +9 -119
  72. data/lib/opennebula/marketplaceapp_ext.rb +586 -0
  73. data/lib/opennebula/marketplaceapp_pool.rb +1 -1
  74. data/lib/opennebula/oneflow_client.rb +4 -3
  75. data/lib/opennebula/pool.rb +6 -3
  76. data/lib/opennebula/pool_element.rb +1 -1
  77. data/lib/opennebula/security_group.rb +1 -1
  78. data/lib/opennebula/security_group_pool.rb +1 -1
  79. data/lib/opennebula/server_cipher_auth.rb +1 -1
  80. data/lib/opennebula/server_x509_auth.rb +1 -1
  81. data/lib/opennebula/ssh_auth.rb +1 -1
  82. data/lib/opennebula/system.rb +1 -1
  83. data/lib/opennebula/template.rb +4 -13
  84. data/lib/opennebula/template_ext.rb +342 -0
  85. data/lib/opennebula/template_pool.rb +1 -1
  86. data/lib/opennebula/user.rb +26 -2
  87. data/lib/opennebula/user_pool.rb +1 -1
  88. data/lib/opennebula/utils.rb +1 -1
  89. data/lib/opennebula/vdc.rb +1 -1
  90. data/lib/opennebula/vdc_pool.rb +1 -1
  91. data/lib/opennebula/virtual_machine.rb +26 -206
  92. data/lib/opennebula/virtual_machine_ext.rb +469 -0
  93. data/lib/opennebula/virtual_machine_pool.rb +1 -1
  94. data/lib/opennebula/virtual_network.rb +4 -10
  95. data/lib/opennebula/virtual_network_pool.rb +1 -1
  96. data/lib/opennebula/virtual_router.rb +4 -12
  97. data/lib/opennebula/virtual_router_pool.rb +1 -1
  98. data/lib/opennebula/vm_group.rb +4 -11
  99. data/lib/opennebula/vm_group_pool.rb +1 -1
  100. data/lib/opennebula/vntemplate.rb +4 -13
  101. data/lib/opennebula/vntemplate_pool.rb +1 -1
  102. data/lib/opennebula/wait_ext.rb +257 -0
  103. data/lib/opennebula/x509_auth.rb +1 -1
  104. data/lib/opennebula/xml_element.rb +1 -1
  105. data/lib/opennebula/xml_pool.rb +1 -1
  106. data/lib/opennebula/xml_utils.rb +1 -1
  107. data/lib/opennebula/zone.rb +1 -1
  108. data/lib/opennebula/zone_pool.rb +1 -1
  109. data/lib/rest_client.rb +201 -0
  110. data/lib/scripts_common.rb +183 -0
  111. data/lib/transport_zone.rb +43 -0
  112. data/lib/vcenter_driver.rb +13 -12
  113. data/lib/vcenter_importer.rb +616 -0
  114. data/lib/vi_client.rb +281 -0
  115. data/lib/vi_helper.rb +313 -0
  116. data/lib/virtual_machine.rb +3477 -0
  117. data/lib/virtual_wire.rb +158 -0
  118. data/lib/vm_device.rb +80 -0
  119. data/lib/vm_disk.rb +202 -0
  120. data/lib/vm_folder.rb +69 -0
  121. data/lib/vm_helper.rb +30 -0
  122. data/lib/vm_monitor.rb +303 -0
  123. data/lib/vm_nic.rb +70 -0
  124. data/lib/vm_template.rb +1963 -0
  125. data/lib/vmm_importer.rb +121 -0
  126. metadata +140 -27
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -14,6 +14,7 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
+ require 'opennebula/lockable_ext'
17
18
  require 'opennebula/pool_element'
18
19
 
19
20
  module OpenNebula
@@ -54,13 +55,15 @@ module OpenNebula
54
55
 
55
56
  # Class constructor
56
57
  def initialize(xml, client)
58
+ LockableExt.make_lockable(self, HOOK_METHODS)
59
+
57
60
  super(xml, client)
58
61
 
59
62
  @client = client
60
63
  end
61
64
 
62
65
  #######################################################################
63
- # XML-RPC Methods for the Template Object
66
+ # XML-RPC Methods for the Hook Object
64
67
  #######################################################################
65
68
 
66
69
  # Retrieves the information of the given Hook.
@@ -146,16 +149,6 @@ module OpenNebula
146
149
  self['UID'].to_i
147
150
  end
148
151
 
149
- # Lock a Hook
150
- def lock(level)
151
- call(HOOK_METHODS[:lock], @pe_id, level)
152
- end
153
-
154
- # Unlock a Hook
155
- def unlock
156
- call(HOOK_METHODS[:unlock], @pe_id)
157
- end
158
-
159
152
  end
160
153
 
161
154
  end
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -14,8 +14,9 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
-
17
+ require 'opennebula/lockable_ext'
18
18
  require 'opennebula/pool_element'
19
+
19
20
  require 'fileutils'
20
21
 
21
22
  module OpenNebula
@@ -92,9 +93,9 @@ module OpenNebula
92
93
 
93
94
  # Class constructor
94
95
  def initialize(xml, client)
95
- super(xml,client)
96
+ LockableExt.make_lockable(self, IMAGE_METHODS)
96
97
 
97
- @client = client
98
+ super(xml,client)
98
99
  end
99
100
 
100
101
  #######################################################################
@@ -102,8 +103,8 @@ module OpenNebula
102
103
  #######################################################################
103
104
 
104
105
  # Retrieves the information of the given Image.
105
- def info()
106
- super(IMAGE_METHODS[:info], 'IMAGE')
106
+ def info(decrypt = false)
107
+ super(IMAGE_METHODS[:info], 'IMAGE', decrypt)
107
108
  end
108
109
 
109
110
  alias_method :info!, :info
@@ -298,14 +299,6 @@ module OpenNebula
298
299
  self['GID'].to_i
299
300
  end
300
301
 
301
- def lock(level)
302
- return call(IMAGE_METHODS[:lock], @pe_id, level)
303
- end
304
-
305
- def unlock()
306
- return call(IMAGE_METHODS[:unlock], @pe_id)
307
- end
308
-
309
302
  def public?
310
303
  if self['PERMISSIONS/GROUP_U'] == "1" || self['PERMISSIONS/OTHER_U'] == "1"
311
304
  true
@@ -314,6 +307,18 @@ module OpenNebula
314
307
  end
315
308
  end
316
309
 
310
+ def wait_state(state, timeout=120)
311
+ require 'opennebula/wait_ext'
312
+
313
+ extend OpenNebula::WaitExt
314
+
315
+ rc = wait(state, timeout)
316
+
317
+ return Error.new("Timeout expired for state #{state}.") unless rc
318
+
319
+ true
320
+ end
321
+
317
322
  private
318
323
 
319
324
  def set_enabled(enabled)
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # ---------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # ---------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -0,0 +1,163 @@
1
+ # -------------------------------------------------------------------------- #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
+ # #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
+ # not use this file except in compliance with the License. You may obtain #
6
+ # a copy of the License at #
7
+ # #
8
+ # http://www.apache.org/licenses/LICENSE-2.0 #
9
+ # #
10
+ # Unless required by applicable law or agreed to in writing, software #
11
+ # distributed under the License is distributed on an "AS IS" BASIS, #
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
13
+ # See the License for the specific language governing permissions and #
14
+ # limitations under the License. #
15
+ #--------------------------------------------------------------------------- #
16
+
17
+ require 'date'
18
+
19
+ require 'opennebula/document'
20
+ require 'opennebula/hook'
21
+ require 'opennebula/image'
22
+ require 'opennebula/marketplaceapp'
23
+ require 'opennebula/template'
24
+ require 'opennebula/virtual_machine'
25
+ require 'opennebula/virtual_network'
26
+ require 'opennebula/virtual_router'
27
+ require 'opennebula/vm_group'
28
+ require 'opennebula/vntemplate'
29
+
30
+ # Module to decorate Lockable classes with the following methods:
31
+ # - Lock
32
+ # - Unlock
33
+ # - Synchronize
34
+ #
35
+ # rubocop:disable Style/ClassAndModuleChildren
36
+ module OpenNebula::LockableExt
37
+
38
+ # Expire timeout for locking operation
39
+ LOCK_TIMEOUT = 120
40
+
41
+ def self.make_lockable(obj, methods)
42
+ obj.instance_variable_set(:@lock_method, methods[:lock])
43
+ obj.instance_variable_set(:@unlock_method, methods[:unlock])
44
+
45
+ obj.extend(OpenNebula::LockableExt)
46
+ end
47
+
48
+ def self.extend_object(obj)
49
+ lockable?(obj)
50
+
51
+ class << obj
52
+
53
+ # Locks the object
54
+ #
55
+ # @param level [Integer] Lock level
56
+ # @param test [Boolean] Check if the object is already locked
57
+ #
58
+ # use -> level = 1
59
+ # manage -> level = 2
60
+ # admin -> level = 3
61
+ # all -> level = 4
62
+ #
63
+ # @return [Integer, OpenNebula::Error]
64
+ # - Object ID if the lock was granted
65
+ # - Error otherwise
66
+ def lock(level, test = false)
67
+ return Error.new('ID not defined') unless @pe_id
68
+
69
+ @client.call(@lock_method, @pe_id, level, test)
70
+ end
71
+
72
+ # Unlocks this object
73
+ #
74
+ # @return [nil, OpenNebula::Error]
75
+ # - nil in case of success
76
+ # - Error otherwise
77
+ def unlock
78
+ @client.call(@unlock_method, @pe_id)
79
+ end
80
+
81
+ # Executes an operation with lock granted
82
+ #
83
+ # @param level [Integer] Lock level
84
+ #
85
+ # @return [Operation rc, OpenNebula::Error]
86
+ # - Operation return code
87
+ # - Error otherwise
88
+ def synchronize(level)
89
+ rc = lock(level, true)
90
+
91
+ if OpenNebula.is_error?(rc)
92
+ # If test check, core returns timestamp when it was locked
93
+ lock_time = Time.at(Integer(rc.message.split(' ')[1]))
94
+ c_time = Time.now
95
+
96
+ # If the timeout has not yet expired, return error
97
+ if (c_time - lock_time) < LOCK_TIMEOUT
98
+ return Error.new('Object is locked')
99
+ end
100
+
101
+ rc = lock(level)
102
+
103
+ return rc if OpenNebula.is_error?(rc)
104
+ end
105
+
106
+ ret = yield if block_given?
107
+
108
+ unless OpenNebula.is_error?(info)
109
+ rc = unlock
110
+
111
+ return rc if OpenNebula.is_error?(rc)
112
+ end
113
+
114
+ ret
115
+ end
116
+
117
+ end
118
+
119
+ super
120
+ end
121
+
122
+ # Check if object is lockable or not
123
+ #
124
+ # @param obj [Object or Class] Object to check class
125
+ def self.lockable?(obj)
126
+ # Lockable classes
127
+ lockable = [
128
+ OpenNebula::Document,
129
+ OpenNebula::Hook,
130
+ OpenNebula::Image,
131
+ OpenNebula::MarketPlaceApp,
132
+ OpenNebula::Template,
133
+ OpenNebula::VirtualMachine,
134
+ OpenNebula::VirtualNetwork,
135
+ OpenNebula::VirtualRouter,
136
+ OpenNebula::VMGroup,
137
+ OpenNebula::VNTemplate
138
+ ]
139
+
140
+ # Get obj class to find parents in lockable class
141
+ # rubocop:disable Style/TernaryParentheses
142
+ (obj.is_a? Class) ? o_class = obj : o_class = obj.class
143
+ # rubocop:enable Style/TernaryParentheses
144
+
145
+ found = false
146
+ i_class = o_class
147
+
148
+ while i_class
149
+ if lockable.include?(i_class)
150
+ found = true
151
+ break
152
+ end
153
+
154
+ i_class = i_class.superclass
155
+ end
156
+
157
+ return if found
158
+
159
+ raise StandardError, "Cannot extend #{o_class} with LockableExt"
160
+ end
161
+
162
+ end
163
+ # rubocop:enable Style/ClassAndModuleChildren
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2
+ # Copyright 2002-2021, OpenNebula Project, OpenNebula Systems #
3
3
  # #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you may #
5
5
  # not use this file except in compliance with the License. You may obtain #
@@ -14,6 +14,8 @@
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
+ require 'opennebula/lockable_ext'
18
+ require 'opennebula/marketplaceapp_ext'
17
19
  require 'opennebula/pool_element'
18
20
 
19
21
  module OpenNebula
@@ -47,7 +49,10 @@ module OpenNebula
47
49
  'DISABLED' => 'dis'
48
50
  }
49
51
 
50
- MARKETPLACEAPP_TYPES = %w{UNKNOWN IMAGE VMTEMPLATE SERVICE_TEMPLATE}
52
+ MARKETPLACEAPP_TYPES = %w{UNKNOWN
53
+ IMAGE
54
+ VMTEMPLATE
55
+ SERVICE_TEMPLATE}
51
56
 
52
57
  SHORT_MARKETPLACEAPP_TYPES = {
53
58
  'UNKNOWN' => 'unk',
@@ -75,6 +80,8 @@ module OpenNebula
75
80
 
76
81
  # Class constructor
77
82
  def initialize(xml, client)
83
+ LockableExt.make_lockable(self, MARKETPLACEAPP_METHODS)
84
+
78
85
  super(xml, client)
79
86
  end
80
87
 
@@ -158,92 +165,6 @@ module OpenNebula
158
165
  call(MARKETPLACEAPP_METHODS[:rename], @pe_id, name)
159
166
  end
160
167
 
161
- # Exports this app to a suitable OpenNebula object
162
- # @param appid [Integer] id of the marketplace app
163
- # @param options [Hash] to control the export behavior
164
- # dsid [Integer] datastore to save images
165
- # name [String] of the new object
166
- # vmtemplate_name [String] name for the VM Template, if the App has one
167
- #
168
- # @return [Hash, OpenNebula::Error] with the ID and type of the created
169
- # objects. Instead of an ID, the array may contain OpenNebula::Error with
170
- # specific object creation errors
171
- # { :vm => [ vm ids/OpenNebula::Error ],
172
- # :vmtemplate => [ vmtemplates ids/OpenNebula::Error ],
173
- # :image => [ vm ids/OpenNebula::Error ] }
174
- def export(options = {})
175
- rc = info
176
- return rc if OpenNebula.is_error?(rc)
177
- return Error.new('App is not READY') if state_str != 'READY'
178
-
179
- if options[:dsid].nil? && type_str != 'VMTEMPLATE'
180
- return Error.new('Missing datastore id')
181
- end
182
-
183
- return Error.new('Missing name to export app') if options[:name].nil?
184
-
185
- if !self['APPTEMPLATE64'].nil?
186
- tmpl = Base64.decode64(self['APPTEMPLATE64'])
187
- else
188
- tmpl = ''
189
- end
190
-
191
- name = options[:name] || "marketapp-#{id}"
192
- options[:vmtemplate_name] = name unless options[:vmtemplate_name]
193
-
194
- tmpl << "\n"
195
- tmpl << 'NAME="' << name << "\"\n"
196
- tmpl << 'FROM_APP="' << self['ID'] << "\"\n"
197
- tmpl << 'URL_ARGS="' << options[:url_args] << "\"\n" if options[:url_args]
198
-
199
- case type_str
200
- when 'IMAGE'
201
- image = Image.new(Image.build_xml, @client)
202
- rc = image.allocate(tmpl, options[:dsid])
203
-
204
- ds = OpenNebula::Datastore.new_with_id(options[:dsid], @client)
205
-
206
- rc_image = image.info
207
- rc_ds = ds.info
208
-
209
- image_error = OpenNebula.is_error?(rc_image)
210
- ds_error = OpenNebula.is_error?(rc_ds)
211
-
212
- xpath = 'TEMPLATE/DRIVER'
213
- format = self['FORMAT']
214
- type = ds[xpath]
215
-
216
- if !image_error && !ds_error
217
- if type == 'vcenter' && format == 'qcow2'
218
- image.replace('DEV_PREFIX' => 'sd')
219
- image.delete_element('TEMPLATE/FORMAT')
220
- image.delete_element('TEMPLATE/DRIVER')
221
-
222
- image.update(image.template_like_str("TEMPLATE"))
223
- elsif type == 'vcenter' && format != 'iso' && format != 'vmdk'
224
- image.replace('FORMAT' => 'vmdk')
225
- elsif type && type != 'vcenter' && format == 'vmdk'
226
- image.replace('FORMAT' => type)
227
- end
228
- end
229
-
230
- return { :image => [rc] } if OpenNebula.is_error?(rc)
231
-
232
- vmtpl_id = create_vmtemplate(options, image.id)
233
-
234
- return { :image => [image.id], :vmtemplate => [vmtpl_id] }
235
-
236
- when 'VMTEMPLATE'
237
- # TODO import all the images associated to a VMTEMPLATE app
238
- # current version only support no-image based apps (e.g. hybrid)
239
- vmtpl_id = create_vmtemplate(options)
240
-
241
- return { :image => [], :vmtemplate => [vmtpl_id] }
242
- else
243
- return Error.new("App type #{type_str} not supported")
244
- end
245
- end
246
-
247
168
  # Enables this app
248
169
  def enable
249
170
  call(MARKETPLACEAPP_METHODS[:enable], @pe_id, true)
@@ -288,37 +209,6 @@ module OpenNebula
288
209
  SHORT_MARKETPLACEAPP_STATES[state_str]
289
210
  end
290
211
 
291
- # Locked a MarketplaceApp
292
- def lock(level)
293
- call(MARKETPLACEAPP_METHODS[:lock], @pe_id, level)
294
- end
295
-
296
- # Unlocked a MarketplaceApp
297
- def unlock()
298
- call(MARKETPLACEAPP_METHODS[:unlock], @pe_id)
299
- end
300
-
301
- private
302
-
303
- # Creates a VM template based on the VMTEMPLATE64 attribute
304
- # @return [Integer, OpenNebula::Error] template id or error
305
- # TODO this method needs to be extended to support [image_ids]
306
- def create_vmtemplate(options, image_id = nil)
307
- return -1 if self['TEMPLATE/VMTEMPLATE64'].nil?
308
-
309
- tmpl = Base64.decode64(self['TEMPLATE/VMTEMPLATE64'])
310
-
311
- tmpl << "\nNAME=\"#{options[:vmtemplate_name]}\"\n"
312
- tmpl << "DISK=[ IMAGE_ID = #{image_id} ]\n" if image_id
313
-
314
- vmtpl = Template.new(Template.build_xml, @client)
315
- rc = vmtpl.allocate(tmpl)
316
-
317
- return rc if OpenNebula.is_error?(rc)
318
-
319
- vmtpl.id
320
- end
321
-
322
212
  end
323
213
 
324
214
  end