opennebula 4.4.0 → 4.5.80.beta

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/NOTICE +1 -1
  3. data/lib/opennebula.rb +4 -2
  4. data/lib/opennebula/acl.rb +36 -8
  5. data/lib/opennebula/acl_pool.rb +1 -1
  6. data/lib/opennebula/client.rb +52 -4
  7. data/lib/opennebula/cluster.rb +1 -1
  8. data/lib/opennebula/cluster_pool.rb +1 -1
  9. data/lib/opennebula/datastore.rb +1 -1
  10. data/lib/opennebula/datastore_pool.rb +1 -1
  11. data/lib/opennebula/document.rb +1 -1
  12. data/lib/opennebula/document_json.rb +1 -1
  13. data/lib/opennebula/document_pool.rb +1 -1
  14. data/lib/opennebula/document_pool_json.rb +1 -1
  15. data/lib/opennebula/error.rb +1 -1
  16. data/lib/opennebula/group.rb +227 -43
  17. data/lib/opennebula/group_pool.rb +1 -1
  18. data/lib/opennebula/host.rb +1 -1
  19. data/lib/opennebula/host_pool.rb +1 -1
  20. data/lib/opennebula/image.rb +1 -1
  21. data/lib/opennebula/image_pool.rb +1 -1
  22. data/lib/opennebula/ldap_auth.rb +1 -1
  23. data/lib/opennebula/ldap_auth_spec.rb +1 -1
  24. data/lib/opennebula/oneflow_client.rb +1 -1
  25. data/lib/opennebula/pool.rb +57 -1
  26. data/lib/opennebula/pool_element.rb +1 -1
  27. data/lib/opennebula/server_cipher_auth.rb +1 -1
  28. data/lib/opennebula/server_x509_auth.rb +1 -1
  29. data/lib/opennebula/ssh_auth.rb +1 -1
  30. data/lib/opennebula/system.rb +1 -1
  31. data/lib/opennebula/template.rb +1 -1
  32. data/lib/opennebula/template_pool.rb +1 -1
  33. data/lib/opennebula/user.rb +10 -3
  34. data/lib/opennebula/user_pool.rb +1 -1
  35. data/lib/opennebula/virtual_machine.rb +1 -1
  36. data/lib/opennebula/virtual_machine_pool.rb +1 -1
  37. data/lib/opennebula/virtual_network.rb +1 -1
  38. data/lib/opennebula/virtual_network_pool.rb +1 -1
  39. data/lib/opennebula/x509_auth.rb +1 -1
  40. data/lib/opennebula/xml_element.rb +1 -1
  41. data/lib/opennebula/xml_pool.rb +2 -1
  42. data/lib/opennebula/xml_utils.rb +104 -1
  43. data/lib/opennebula/zone.rb +107 -0
  44. data/lib/opennebula/zone_pool.rb +58 -0
  45. metadata +21 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 09e222c2bb3ea60a689a0f4ed69e605fcad33e1e
4
- data.tar.gz: 9fe4b808385a42362c2d5f6e8addb7569e137c63
3
+ metadata.gz: 5feec17aea93ff26ef9c4ca5d190709ba5b12c3b
4
+ data.tar.gz: 218fa42198d3b3165ec54bd43fa20028402c8b7f
5
5
  SHA512:
6
- metadata.gz: 5d9e19973ce12493f1c39c4ee5417830c53caa6046ea55ddd734c6f3258a720e5daefc6a668588ccd75136af337ebfd3d30bb8e08528130b729f7abeffba5f14
7
- data.tar.gz: 7883ce2562e2bdde4fc20fdd33eca2c51a3c5e17fcdc279c0ba6d7e3259bdcd38ade29ed73c331a98a8e6ba576469d9bf7b1e8fc3c3c007d4d87503b7eb7a418
6
+ metadata.gz: 4ed7c74a0a4e33a5f23075db69be3d5d8c947f24b1257389ffd8f388fd4463c78f80bdb9dd9d921668a3b02a3647ae8074103b74a6f35553617dbfeffdc3f05a
7
+ data.tar.gz: 11736f325b3b49d35916d0a000a2519de8ea1b925720897914890bd0d9b8d35812bf7634d35b1e6333017106585e00f5ad59526fbb48fafeb4b7ee0e101c03f8
data/NOTICE CHANGED
@@ -1,6 +1,6 @@
1
1
  OpenNebula Open Source Project
2
2
  --------------------------------------------------------------------------------
3
- Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs
3
+ Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs
4
4
  --------------------------------------------------------------------------------
5
5
 
6
6
  You can find more information about the project, release notes and
data/lib/opennebula.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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 #
@@ -49,10 +49,12 @@ require 'opennebula/cluster'
49
49
  require 'opennebula/cluster_pool'
50
50
  require 'opennebula/document'
51
51
  require 'opennebula/document_pool'
52
+ require 'opennebula/zone'
53
+ require 'opennebula/zone_pool'
52
54
  require 'opennebula/system'
53
55
 
54
56
  module OpenNebula
55
57
 
56
58
  # OpenNebula version
57
- VERSION = '4.4.0'
59
+ VERSION = '4.5.80'
58
60
  end
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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 #
@@ -56,7 +56,8 @@ module OpenNebula
56
56
  "GROUP" => 0x40000000000,
57
57
  "DATASTORE" => 0x100000000000,
58
58
  "CLUSTER" => 0x200000000000,
59
- "DOCUMENT" => 0x400000000000
59
+ "DOCUMENT" => 0x400000000000,
60
+ "ZONE" => 0x800000000000
60
61
  }
61
62
 
62
63
  RIGHTS =
@@ -99,14 +100,24 @@ module OpenNebula
99
100
  # A string containing a hex number, e.g. 0x2100000001
100
101
  # @param rights [String]
101
102
  # A string containing a hex number, e.g. 0x10
103
+ # @param zone [String]
104
+ # A string containing a hex number, e.g. 0x100000001
102
105
  #
103
106
  # @return [nil, OpenNebula::Error] nil in case of success, Error
104
107
  # otherwise
105
- def allocate(user, resource, rights)
106
- return super( AclPool::ACL_POOL_METHODS[:addrule],
107
- user,
108
- resource,
109
- rights )
108
+ def allocate(user, resource, rights, zone=nil)
109
+ if !zone.nil?
110
+ return super( AclPool::ACL_POOL_METHODS[:addrule],
111
+ user,
112
+ resource,
113
+ rights,
114
+ zone )
115
+ else
116
+ return super( AclPool::ACL_POOL_METHODS[:addrule],
117
+ user,
118
+ resource,
119
+ rights)
120
+ end
110
121
  end
111
122
 
112
123
  # Deletes the Acl rule
@@ -138,7 +149,7 @@ module OpenNebula
138
149
 
139
150
  rule_str = rule_str.split(" ")
140
151
 
141
- if rule_str.length != 3
152
+ if rule_str.length != 3 && rule_str.length != 4
142
153
  return OpenNebula::Error.new(
143
154
  "String needs three components: User, Resource, Rights")
144
155
  end
@@ -147,6 +158,10 @@ module OpenNebula
147
158
  ret << parse_resources(rule_str[1])
148
159
  ret << parse_rights(rule_str[2])
149
160
 
161
+ if rule_str.length > 3
162
+ ret << parse_zone(rule_str[3])
163
+ end
164
+
150
165
  errors=ret.map do |arg|
151
166
  if OpenNebula.is_error?(arg)
152
167
  arg.message
@@ -230,6 +245,19 @@ private
230
245
  end
231
246
  end
232
247
 
248
+ # Converts a string in the form [#<id>, *] to a hex. number
249
+ #
250
+ # @param zone [String] Zone component string
251
+ #
252
+ # @return [String] A string containing a hex number
253
+ def self.parse_zone(zone)
254
+ begin
255
+ return calculate_ids(zone).to_i.to_s(16)
256
+ rescue Exception => e
257
+ return OpenNebula::Error.new(e.message)
258
+ end
259
+ end
260
+
233
261
  # Calculates the numeric value for a String containing an individual
234
262
  # (#<id>), group (@<id>) or all (*) ID component
235
263
  #
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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 #
@@ -15,9 +15,34 @@
15
15
  #--------------------------------------------------------------------------- #
16
16
 
17
17
  require 'xmlrpc/client'
18
+ require 'bigdecimal'
19
+ require 'stringio'
20
+
18
21
 
19
22
  module OpenNebula
20
- if OpenNebula::NOKOGIRI
23
+ attr_accessor :pool_page_size
24
+
25
+ if OpenNebula::OX
26
+ class OxStreamParser < XMLRPC::XMLParser::AbstractStreamParser
27
+ def initialize
28
+ @parser_class = OxParser
29
+ end
30
+
31
+ class OxParser < Ox::Sax
32
+ include XMLRPC::XMLParser::StreamParserMixin
33
+
34
+ alias :text :character
35
+ alias :end_element :endElement
36
+ alias :start_element :startElement
37
+
38
+ def parse(str)
39
+ Ox.sax_parse(self, StringIO.new(str),
40
+ :symbolize => false,
41
+ :convert_special => true)
42
+ end
43
+ end
44
+ end
45
+ elsif OpenNebula::NOKOGIRI
21
46
  class NokogiriStreamParser < XMLRPC::XMLParser::AbstractStreamParser
22
47
  def initialize
23
48
  @parser_class = NokogiriParser
@@ -39,10 +64,24 @@ module OpenNebula
39
64
  end
40
65
  end
41
66
 
67
+ DEFAULT_POOL_PAGE_SIZE = 2000
68
+
69
+ if size=ENV['ONE_POOL_PAGE_SIZE']
70
+ if size.strip.match(/^\d+$/) && size.to_i >= 2
71
+ @pool_page_size = size.to_i
72
+ else
73
+ @pool_page_size = nil
74
+ end
75
+ else
76
+ @pool_page_size = DEFAULT_POOL_PAGE_SIZE
77
+ end
78
+
79
+
42
80
  # The client class, represents the connection with the core and handles the
43
81
  # xml-rpc calls.
44
82
  class Client
45
83
  attr_accessor :one_auth
84
+ attr_reader :one_endpoint
46
85
 
47
86
  begin
48
87
  require 'xmlparser'
@@ -62,6 +101,8 @@ module OpenNebula
62
101
  # @param [Hash] options
63
102
  # @option params [Integer] :timeout connection timeout in seconds,
64
103
  # defaults to 30
104
+ # @option params [String] :http_proxy HTTP proxy string used for
105
+ # connecting to the endpoint; defaults to no proxy
65
106
  #
66
107
  # @return [OpenNebula::Client]
67
108
  def initialize(secret=nil, endpoint=nil, options={})
@@ -82,6 +123,8 @@ module OpenNebula
82
123
  @one_endpoint = endpoint
83
124
  elsif ENV["ONE_XMLRPC"]
84
125
  @one_endpoint = ENV["ONE_XMLRPC"]
126
+ elsif File.exists?(ENV['HOME']+"/.one/one_endpoint")
127
+ @one_endpoint = File.read(ENV['HOME']+"/.one/one_endpoint")
85
128
  else
86
129
  @one_endpoint = "http://localhost:2633/RPC2"
87
130
  end
@@ -89,9 +132,14 @@ module OpenNebula
89
132
  timeout=nil
90
133
  timeout=options[:timeout] if options[:timeout]
91
134
 
92
- @server = XMLRPC::Client.new2(@one_endpoint, nil, timeout)
135
+ http_proxy=nil
136
+ http_proxy=options[:http_proxy] if options[:http_proxy]
137
+
138
+ @server = XMLRPC::Client.new2(@one_endpoint, http_proxy, timeout)
93
139
 
94
- if OpenNebula::NOKOGIRI
140
+ if defined?(OxStreamParser)
141
+ @server.set_parser(OxStreamParser.new)
142
+ elsif OpenNebula::NOKOGIRI
95
143
  @server.set_parser(NokogiriStreamParser.new)
96
144
  elsif XMLPARSER
97
145
  @server.set_parser(XMLRPC::XMLParser::XMLStreamParser.new)
@@ -1,5 +1,5 @@
1
1
  # -------------------------------------------------------------------------- #
2
- # Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
2
+ # Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
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 #
@@ -24,21 +24,25 @@ module OpenNebula
24
24
  #######################################################################
25
25
 
26
26
  GROUP_METHODS = {
27
- :info => "group.info",
28
- :allocate => "group.allocate",
29
- :delete => "group.delete",
30
- :quota => "group.quota"
27
+ :info => "group.info",
28
+ :allocate => "group.allocate",
29
+ :update => "group.update",
30
+ :delete => "group.delete",
31
+ :quota => "group.quota",
32
+ :add_provider => "group.addprovider",
33
+ :del_provider => "group.delprovider"
31
34
  }
32
35
 
33
36
  # Flag for requesting connected user's group info
34
37
  SELF = -1
35
38
 
36
- #Default location for group ACL's
37
- if ENV['ONE_LOCATION']
38
- GROUP_DEFAULT = ENV['ONE_LOCATION'] + "/etc/group.default"
39
- else
40
- GROUP_DEFAULT = "/etc/one/group.default"
41
- end
39
+ # Default resource ACL's for group users (create)
40
+ GROUP_DEFAULT_ACLS = "VM+IMAGE+NET+TEMPLATE+DOCUMENT"
41
+ ALL_CLUSTERS_IN_ZONE = 10
42
+
43
+ # The default view for group and group admins, must be defined in
44
+ # sunstone_views.yaml
45
+ GROUP_ADMIN_SUNSTONE_VIEWS = "vdcadmin"
42
46
 
43
47
  # Creates a Group description with just its identifier
44
48
  # this method should be used to create plain Group objects.
@@ -62,53 +66,82 @@ module OpenNebula
62
66
  super(xml,client)
63
67
  end
64
68
 
69
+
65
70
  #######################################################################
66
- # Group utils
71
+ # XML-RPC Methods for the Group Object
67
72
  #######################################################################
68
73
 
69
- # Creates ACLs for the group. The ACL rules are described in a file
70
- def create_acls(filename = GROUP_DEFAULT)
71
- if !File.readable?(filename)
72
- return -1, "Cannot read deafult ACL file for group"
73
- end
74
+ # Retrieves the information of the given Group.
75
+ def info()
76
+ super(GROUP_METHODS[:info], 'GROUP')
77
+ end
74
78
 
75
- msg = String.new
79
+ alias_method :info!, :info
76
80
 
77
- File.open(filename).each_line{ |l|
78
- next if l.match(/^#/)
81
+ # Creates a group based in a group definition hash
82
+ # group_hash[:name]
83
+ # group_hash[:admin_group]
84
+ # group_hash[:user][:name]
85
+ # group_hash[:user][:password]
86
+ # group_hash[:resource_providers]
87
+ # group_hash[:resource_providers][:zone_id]
88
+ # group_hash[:resource_providers][:cluster_id]
89
+ #
90
+ def create(group_hash)
91
+ # Check arguments
92
+ return -1, "Group name not defined" if !group_hash[:name]
79
93
 
80
- rule = "@#{@pe_id} #{l}"
81
- parse = OpenNebula::Acl.parse_rule(rule)
94
+ if group_hash[:user]
95
+ if group_hash[:user][:name] and !group_hash[:admin_group]
96
+ return -1, "Admin user defined but not admin group"
97
+ end
82
98
 
83
- if OpenNebula.is_error?(parse)
84
- return -1, "Error parsing rule #{rule}: #{parse.message}"
99
+ if group_hash[:user][:name] and !group_hash[:user][:password]
100
+ return -1, "Admin user password not defined"
85
101
  end
102
+ end
86
103
 
87
- xml = OpenNebula::Acl.build_xml
88
- acl = OpenNebula::Acl.new(xml, @client)
104
+ # Allocate group
105
+ rc = self.allocate(group_hash[:name])
89
106
 
90
- rc = acl.allocate(*parse)
107
+ if OpenNebula.is_error?(rc)
108
+ return -1, "Error allocating group: #{rc.message}"
109
+ end
91
110
 
92
- if OpenNebula.is_error?(rc)
93
- return -1, "Error creating rule #{rule}: #{rc.message}"
111
+ # Handle resource providers
112
+ group_hash[:resource_providers].each { |rp|
113
+ next if rp[:zone_id].nil? && rp[:cluster_id].nil?
114
+
115
+ if rp[:cluster_id].class == String && rp[:cluster_id] == "ALL"
116
+ add_provider(rp[:zone_id],ALL_CLUSTERS_IN_ZONE)
94
117
  else
95
- msg << "ACL_ID: #{acl.id}\n"
118
+ add_provider(rp[:zone_id],rp[:cluster_id])
96
119
  end
97
- }
120
+ } if !group_hash[:resource_providers].nil?
98
121
 
99
- return 0, msg
100
- end
122
+ # Set group ACLs to create resources
123
+ rc, msg = create_default_acls(group_hash[:resources])
101
124
 
102
- #######################################################################
103
- # XML-RPC Methods for the Group Object
104
- #######################################################################
125
+ if OpenNebula.is_error?(rc)
126
+ self.delete
127
+ return -1, "Error creating group ACL's: #{rc.message}"
128
+ end
105
129
 
106
- # Retrieves the information of the given Group.
107
- def info()
108
- super(GROUP_METHODS[:info], 'GROUP')
109
- end
130
+ # Create associated admin group if needed
131
+ rc = create_group_admin(group_hash)
110
132
 
111
- alias_method :info!, :info
133
+ if OpenNebula.is_error?(rc)
134
+ self.delete
135
+ return -1, "Error creating admin group: #{rc.message}"
136
+ end
137
+
138
+ # Add default Sunstone views for the group
139
+ if group_hash[:views]
140
+ self.update("SUNSTONE_VIEWS=\"#{group_hash[:views].join(",")}\"\n")
141
+ end
142
+
143
+ return 0, ""
144
+ end
112
145
 
113
146
  # Allocates a new Group in OpenNebula
114
147
  #
@@ -117,14 +150,26 @@ module OpenNebula
117
150
  super(GROUP_METHODS[:allocate], groupname)
118
151
  end
119
152
 
153
+ # Replaces the template contents
154
+ #
155
+ # @param new_template [String] New template contents
156
+ # @param append [true, false] True to append new attributes instead of
157
+ # replace the whole template
158
+ #
159
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
160
+ # otherwise
161
+ def update(new_template=nil, append=false)
162
+ super(GROUP_METHODS[:update], new_template, append ? 1 : 0)
163
+ end
164
+
120
165
  # Deletes the Group
121
166
  def delete()
122
167
  super(GROUP_METHODS[:delete])
123
168
  end
124
169
 
125
170
  # Sets the group quota limits
126
- # @param quota [String] a template (XML or txt) with the new quota limits
127
- #
171
+ # @param quota [String] a template (XML or txt) with the new quota limits
172
+ #
128
173
  # @return [nil, OpenNebula::Error] nil in case of success, Error
129
174
  # otherwise
130
175
  def set_quota(quota)
@@ -136,6 +181,26 @@ module OpenNebula
136
181
  return rc
137
182
  end
138
183
 
184
+ # Adds a resource provider to this group
185
+ # @param zone_id [Integer] Zone ID
186
+ # @param cluster_id [Integer] Cluster ID
187
+ #
188
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
189
+ # otherwise
190
+ def add_provider(zone_id, cluster_id)
191
+ return call(GROUP_METHODS[:add_provider], @pe_id, zone_id.to_i, cluster_id.to_i)
192
+ end
193
+
194
+ # Deletes a resource provider from this group
195
+ # @param zone_id [Integer] Zone ID
196
+ # @param cluster_id [Integer] Cluster ID
197
+ #
198
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
199
+ # otherwise
200
+ def del_provider(zone_id, cluster_id)
201
+ return call(GROUP_METHODS[:del_provider], @pe_id, zone_id.to_i, cluster_id.to_i)
202
+ end
203
+
139
204
  # ---------------------------------------------------------------------
140
205
  # Helpers to get information
141
206
  # ---------------------------------------------------------------------
@@ -159,5 +224,124 @@ module OpenNebula
159
224
 
160
225
  return array
161
226
  end
227
+
228
+ private
229
+ #######################################################################
230
+ #######################################################################
231
+ # Creates an acl array of acl strings. Returns true or error and
232
+ # a qrray with the new acl ids
233
+ def create_group_acls(acls)
234
+ acls_ids = Array.new
235
+
236
+ acls.each{|rule|
237
+
238
+ acl = OpenNebula::Acl.new(OpenNebula::Acl.build_xml,@client)
239
+
240
+ rule_ast = "#{rule} *" #Add all zone id's
241
+
242
+ parsed_acl = OpenNebula::Acl.parse_rule(rule_ast)
243
+
244
+ return parsed_acl, [] if OpenNebula.is_error?(parsed_acl)
245
+
246
+ rc = acl.allocate(*parsed_acl)
247
+
248
+ return rc, "" if OpenNebula.is_error?(rc)
249
+
250
+ acls_ids << acl.id
251
+ }
252
+
253
+ return true, acls_ids
254
+ end
255
+
256
+ def create_default_acls(resources=nil)
257
+ resources = GROUP_DEFAULT_ACLS if !resources
258
+
259
+ acls = Array.new
260
+ acls << "@#{self.id} #{resources}/* CREATE"
261
+
262
+ create_group_acls(acls)
263
+ end
264
+
265
+ # Creates a group admin and user based on the group definition hash
266
+ # @param gdef [Hash] keys are ruby sumbols
267
+ # gdef[:admin_group] the group name
268
+ # gdef[:user][:name] of admin user for the admin group
269
+ # gdef[:user][:password] of admin user
270
+ # gdef[:user][:auth_driver] of the admin user
271
+ # gdef[:admin_resources]
272
+ # gdef[:resources]
273
+ #
274
+ #
275
+ # @return [nil, OpenNebula::Error] nil in case of success, Error
276
+ def create_group_admin(gdef)
277
+
278
+ return nil if gdef[:admin_group].nil?
279
+
280
+ # Create the admin group
281
+ gadmin = Group.new(Group.build_xml, @client)
282
+ rc = gadmin.allocate(gdef[:admin_group])
283
+
284
+ return rc if OpenNebula.is_error?(rc)
285
+
286
+ # Create group admin user
287
+ uadmin = gdef[:user][:name] if gdef[:user]
288
+ upasswd = gdef[:user][:password] if gdef[:user]
289
+ udriver = gdef[:user][:auth_driver] if gdef[:user]
290
+
291
+ if !uadmin.nil? && !upasswd.nil?
292
+
293
+ user = OpenNebula::User.new(OpenNebula::User.build_xml,
294
+ @client)
295
+
296
+ if udriver
297
+ rc = user.allocate(uadmin, upasswd, udriver)
298
+ else
299
+ rc = user.allocate(uadmin, upasswd)
300
+ end
301
+
302
+ if OpenNebula.is_error?(rc)
303
+ gadmin.delete
304
+ return rc
305
+ end
306
+
307
+ # Set admin user groups to admin group and self
308
+ rc = user.chgrp(self.id)
309
+ rc = user.addgroup(gadmin.id) if !OpenNebula.is_error?(rc)
310
+
311
+ if OpenNebula.is_error?(rc)
312
+ user.delete
313
+ gadmin.delete
314
+ return rc
315
+ end
316
+ end
317
+
318
+ #Create admin group acls
319
+ acls = Array.new
320
+
321
+ acls_str = gdef[:admin_resources] || gdef[:resources] || GROUP_DEFAULT_ACLS
322
+
323
+ manage_users = gdef[:admin_manage_users] || "YES"
324
+
325
+ if manage_users.upcase == "YES"
326
+ acls << "@#{gadmin.id} USER/* CREATE"
327
+ acls << "@#{gadmin.id} USER/@#{self.id} USE+MANAGE+ADMIN"
328
+ end
329
+
330
+ acls << "@#{gadmin.id} #{acls_str}/@#{self.id} CREATE+USE+MANAGE"
331
+
332
+ rc, tmp = create_group_acls(acls)
333
+
334
+ if OpenNebula.is_error?(rc)
335
+ user.delete
336
+ gadmin.delete
337
+ return rc
338
+ end
339
+
340
+ #Set Sunstone Views for the group
341
+ gadmin.update("SUNSTONE_VIEWS=#{GROUP_ADMIN_SUNSTONE_VIEWS}\n")
342
+
343
+ return nil
344
+ end
162
345
  end
163
346
  end
347
+