knife-opennebula 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c579c6e65a3a6104bbd48c49c8016f340c5e0558
4
- data.tar.gz: 9afbd1d86b5ae99eaed6f77bfc1eabcdd816574c
3
+ metadata.gz: 8e44d8c756d827a13b17680c62a2633e0009330f
4
+ data.tar.gz: 8b525639ad2fdd294dceaad85a600ce89250f1ef
5
5
  SHA512:
6
- metadata.gz: 48feba45696a64d0263cf48e387833d1c44e55dcbf04060e12de124ddff63253f73b54544fd84334bd0ace2fa347a82f2b7f8fb33c5596e663ddbd178424b222
7
- data.tar.gz: 77dd5682f5b7765d964e815bcdf6b849871f3eacb15b3ad68381085bec230a6ec2892a04db4799c0d7a86c857489275f91cd2641d27605b0ba4c63ba34f3a207
6
+ metadata.gz: 87e6b013604fdfad27c3164fdd7cbea2e1715042859bf012627c7c9fa70a310300e56607b392a049886397b830fa76de17bf288331175f485c55758715ca4bf2
7
+ data.tar.gz: 45dd682acb0e47f897cd54c91847ee0f456e09cea5c1fee0af5531892c27a85c3a58a28d7658307a553489f79f33b85ac20d14a67622dd3fae65c7d78fecab9c
data/README.md CHANGED
@@ -16,13 +16,13 @@ More info:
16
16
 
17
17
  ## Authors
18
18
 
19
- * Leader: Thomas Alrin (alrin@megam.co.in)
20
- * Kishore Kumar (nkishore@megam.co.in)
19
+ * Leader: Thomas Alrin (thomasalrin@megam.io)
20
+ * Kishore Kumar (nkishore@megam.io)
21
21
 
22
22
  ## Compatibility
23
23
 
24
- This add-on is compatible with OpenNebula 4.4, 4.6.
25
- Tested extensively with 4.6 (EC2)
24
+ This add-on is compatible with OpenNebula 4.4, 4.6, 4.12
25
+
26
26
 
27
27
  ## Requirements
28
28
 
@@ -37,7 +37,6 @@ Hosted Chef 11.0.x (or) On Premises Chef (http://www.getchef.com/chef/choose-you
37
37
  To install the plugin you need to do the following in your workstation:
38
38
 
39
39
  * `gem install chef`
40
- * `gem install opennebula`
41
40
  * `gem install knife-opennebula`
42
41
 
43
42
 
@@ -1,19 +1,40 @@
1
- require 'chef/knife'
1
+ #
2
+ # Author:: Matt Ray (<matt@getchef.com>)
3
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
2
18
 
3
19
  class Chef
4
20
  class Knife
5
21
  module OpennebulaBase
6
22
 
7
- def self.included(includer)
23
+ # :nodoc:
24
+ # Would prefer to do this in a rational way, but can't be done b/c of
25
+ # Mixlib::CLI's design :(
26
+ def self.included(includer)
8
27
  includer.class_eval do
9
28
 
10
- deps do
11
- require 'highline'
12
- require 'chef/json_compat'
13
- Chef::Knife.load_deps
14
- end
29
+ deps do
30
+ require 'chef/json_compat'
31
+ require 'chef/knife'
32
+ require 'readline'
33
+ require 'fog'
34
+ Chef::Knife.load_deps
35
+ end
15
36
 
16
- option :opennebula_username,
37
+ option :opennebula_username,
17
38
  :short => "-A OPENNEBULA_USERNAME",
18
39
  :long => "--username OPENNEBULA_USERNAME",
19
40
  :description => "Opennebula user's name",
@@ -30,13 +51,21 @@ class Chef
30
51
  :long => "--endpoint OPENNEBULA_ENDPOIN",
31
52
  :description => "Opennebula Endpoint",
32
53
  :proc => Proc.new { |endpoint| Chef::Config[:knife][:opennebula_endpoint] = endpoint }
54
+
33
55
  end
34
56
  end
35
57
 
58
+ def connection
59
+ @connection ||= begin
60
+ connection = Fog::Compute.new(
61
+ :provider => 'OpenNebula',
62
+ :opennebula_username => locate_config_value(:opennebula_username),
63
+ :opennebula_password => locate_config_value(:opennebula_password),
64
+ :opennebula_endpoint => locate_config_value(:opennebula_endpoint)
65
+ )
66
+ end
67
+ end
36
68
 
37
- require 'opennebula'
38
-
39
- include OpenNebula
40
69
 
41
70
  def validate!
42
71
  if (!opennebula_username)
@@ -51,11 +80,6 @@ class Chef
51
80
  end
52
81
  end
53
82
 
54
- def client
55
- cli = Client.new("#{opennebula_username}:#{opennebula_password}", "#{opennebula_endpoint}")
56
- cli
57
- end
58
-
59
83
  def msg_pair(label, value, color=:cyan)
60
84
  if value && !value.to_s.empty?
61
85
  ui.info "#{ui.color(label, color)}: #{value}"
@@ -79,6 +103,7 @@ class Chef
79
103
  config[key] || Chef::Config[:knife][key]
80
104
  end
81
105
 
106
+
82
107
  end
83
108
  end
84
109
  end
@@ -1,21 +1,36 @@
1
+ #
2
+ # Author:: Matt Ray (<matt@getchef.com>)
3
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
1
19
  require 'chef/knife'
2
20
  require 'chef/json_compat'
3
21
  require 'chef/knife/opennebula_base'
4
22
 
5
- #require_relative 'opennebula_base'
6
23
  class Chef
7
24
  class Knife
8
- class OpennebulaServerCreate < Knife
25
+ class OpennebulaServerCreate < Knife
9
26
 
10
27
  deps do
11
28
  require 'highline'
12
29
  require 'chef/knife/bootstrap'
13
- require 'net/ssh'
14
- require 'net/ssh/multi'
15
- Chef::Knife.load_deps
30
+ Chef::Knife::Bootstrap.load_deps
16
31
  end
17
32
  include Knife::OpennebulaBase
18
-
33
+
19
34
  banner "knife opennebula server create OPTIONS"
20
35
 
21
36
  option :opennebula_template,
@@ -31,6 +46,12 @@ class Chef
31
46
  :boolean => true,
32
47
  :default => true
33
48
 
49
+ #It assumes that chef-client already installed in the server (ie) Image has installed with chef-client
50
+ #Chef-client install command
51
+ option :bootstrap_install_command,
52
+ :long => "--bootstrap_install_command",
53
+ :description => "Bootstrap the server with the given chef-client install command",
54
+ :default => "pwd"
34
55
 
35
56
  option :ssh_user,
36
57
  :short => "-x USERNAME",
@@ -79,6 +100,13 @@ class Chef
79
100
  :boolean => true,
80
101
  :default => true
81
102
 
103
+ option :json_attributes,
104
+ :short => "-j JSON",
105
+ :long => "--json-attributes JSON",
106
+ :description => "A JSON string to be added to the first run of chef-client",
107
+ :proc => lambda { |o| JSON.parse(o) }
108
+
109
+
82
110
  option :identity_file,
83
111
  :short => "-i IDENTITY_FILE",
84
112
  :long => "--identity-file IDENTITY_FILE",
@@ -89,109 +117,113 @@ class Chef
89
117
  end
90
118
 
91
119
  def run
92
- #Validate opennebula credentials
93
120
  validate!
94
- #Get the template details
95
- temp = template("#{locate_config_value(:opennebula_template)}")
96
- unless "#{temp.class}" == "OpenNebula::Template"
97
- ui.error("Template Not found #{temp.class}")
98
- exit 1
99
- end
100
- puts ui.color("Instantiating Template......", :green)
101
- #Instantiating a template
102
- vm_id = temp.instantiate(name = "#{locate_config_value(:chef_node_name)}", hold = false, template = "")
103
- #Opennebula error message
104
- if OpenNebula.is_error?(vm_id)
105
- ui.error("Some problem in instantiating template")
106
- ui.error("#{vm_id.message}")
107
- exit -1
108
- end
109
- unless "#{vm_id.class}" == "Fixnum"
110
- ui.error("Some problem in instantiating template")
111
- exit 1
112
- end
113
- puts ui.color("Template Instantiated, and a VM created with id #{vm_id}", :green)
114
- puts ui.color("Fetching ip address of the VM ", :magenta)
115
- #Get the VM details
116
- vir_mac = virtual_machine("#{vm_id}")
117
- unless "#{vir_mac.class}" == "OpenNebula::VirtualMachine"
118
- ui.error("Some problem in Getting Virtual Machine")
119
- exit 1
120
- end
121
- @vm_hash = vir_mac.to_hash
122
- #VM can have more ip addresses. Priority to get vm ip is AWS_IP_ADDRESS, MEGAM_IP_ADDRESS and PRIVATE_IP_ADDRESS.
123
- if @vm_hash['VM']['TEMPLATE'].has_key?('AWS_IP_ADDRESS')
124
- @ip_add = @vm_hash['VM']['TEMPLATE']['AWS_IP_ADDRESS']
125
- else
126
- @ip_add = @vm_hash['VM']['USER_TEMPLATE']['MEGAM_IP_ADDRESS']
127
- end
121
+ validate_flavor!
122
+
123
+ newvm = connection.servers.new
124
+
125
+ newvm.flavor = connection.flavors.get(flavor.id)
126
+
127
+ # set the name of the vm
128
+ newvm.name = locate_config_value(:chef_node_name)
129
+
130
+ newvm.flavor.vcpu = 1
131
+
132
+ vm = newvm.save
133
+
134
+ ser = server(vm.id)
128
135
  puts ui.color("\nServer:", :green)
129
- msg_pair("Name", @vm_hash['VM']['name'])
130
- msg_pair("IP", @ip_add)
136
+ msg_pair("VM Name", ser.name)
137
+ msg_pair("VM ID", ser.id)
138
+ msg_pair("IP", ser.ip)
139
+ msg_pair("Template", flavor.name)
140
+
141
+ print "\n#{ui.color("Waiting for server", :magenta)}"
142
+
143
+ # wait for it to be ready to do stuff
144
+ ser.wait_for { print "."; ready? }
145
+
146
+ puts("\n")
147
+ # hack to ensure the nodes have had time to spin up
148
+ print(".")
149
+ sleep 30
150
+ print(".")
151
+
152
+ print(".") until tcp_test_ssh(ser.ip) {
153
+ sleep @initial_sleep_delay ||= 10
154
+ puts("done")
155
+ }
156
+
131
157
  #Bootstrap VM
132
- bootstrap()
158
+ bootstrap(ser.ip)
133
159
 
134
160
  puts ui.color("Server:", :green)
135
- msg_pair("Name", @vm_hash['VM']['name'])
136
- msg_pair("IP", @ip_add)
137
- end
138
-
139
- def virtual_machine(id)
140
- vm_pool = VirtualMachinePool.new(client, -1)
141
- rc = vm_pool.info
142
- if OpenNebula.is_error?(rc)
143
- puts rc.message
144
- exit -1
145
- end
146
- vm_pool.each do |vm|
147
- if "#{vm.id}" == "#{id}"
148
- v_hash = vm.to_hash
149
- #Sleep untill get the VM's Ip address from either vm_hash['VM']['TEMPLATE']['AWS_IP_ADDRESS'] or vm_hash['VM']['USER_TEMPLATE']['MEGAM_IP_ADDRESS'].
150
- #vm_hash['VM']['USER_TEMPLATE']['MEGAM_IP_ADDRESS'] can be set by onegate. In our case, we get that ip from vpn.
151
- if v_hash['VM']['TEMPLATE'].has_key?('AWS_IP_ADDRESS') || v_hash['VM']['USER_TEMPLATE'].has_key?('MEGAM_IP_ADDRESS')
152
- @re_obj = vm
153
- else
154
- sleep 1
155
- print "."
156
- virtual_machine("#{vm.id}")
157
- end
158
- end
159
- end
160
- @re_obj
161
+ msg_pair("Name", ser.name)
162
+ msg_pair("IP", ser.ip)
163
+ msg_pair("Environment", config[:environment] || '_default')
164
+ msg_pair("Run List", config[:run_list].join(', '))
165
+ msg_pair("JSON Attributes",config[:json_attributes]) unless !config[:json_attributes] || config[:json_attributes].empty?
161
166
  end
162
167
 
163
- def template(name)
164
- #Searching user's vm template
165
- puts ui.color("Locating Template......", :green)
166
- temp_pool = TemplatePool.new(client, -1)
167
- rc = temp_pool.info
168
- if OpenNebula.is_error?(rc)
169
- puts rc.message
170
- exit -1
171
- end
172
- temp_pool.each do |temp|
173
- if "#{temp.name}" == "#{name}"
174
- puts ui.color("Template Found.", :green)
175
- return temp
176
- end
177
- end
178
- end
179
168
 
180
- def bootstrap
169
+ def bootstrap(ip)
181
170
  bootstrap = Chef::Knife::Bootstrap.new
182
- bootstrap.name_args = @ip_add
171
+ bootstrap.name_args = ip
183
172
  bootstrap.config[:run_list] = locate_config_value(:run_list)
184
173
  bootstrap.config[:ssh_user] = locate_config_value(:ssh_user)
185
174
  bootstrap.config[:ssh_port] = locate_config_value(:ssh_port)
186
175
  bootstrap.config[:identity_file] = locate_config_value(:identity_file)
187
176
  bootstrap.config[:distro] = locate_config_value(:distro)
188
177
  bootstrap.config[:host_key_verify] = config[:host_key_verify]
178
+ bootstrap.config[:first_boot_attributes] = locate_config_value(:json_attributes) || {}
189
179
  bootstrap.config[:template_file] = locate_config_value(:template_file)
190
- bootstrap.config[:chef_node_name] = locate_config_value(:chef_node_name) || @vm_hash['VM']['name']
180
+ bootstrap.config[:chef_node_name] = locate_config_value(:chef_node_name)
181
+ bootstrap.config[:bootstrap_install_command] = locate_config_value(:bootstrap_install_command)
191
182
  bootstrap.config[:use_sudo] = true unless bootstrap.config[:ssh_user] == 'root'
192
183
  bootstrap.run
193
184
  end
194
185
 
186
+ def tcp_test_ssh(hostname)
187
+ tcp_socket = TCPSocket.new(hostname, 22)
188
+ readable = IO.select([tcp_socket], nil, nil, 5)
189
+ if readable
190
+ Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
191
+ yield
192
+ true
193
+ else
194
+ false
195
+ end
196
+ rescue Errno::ETIMEDOUT
197
+ false
198
+ rescue Errno::EPERM
199
+ false
200
+ rescue Errno::ECONNREFUSED
201
+ sleep 2
202
+ false
203
+ rescue Errno::EHOSTUNREACH
204
+ sleep 2
205
+ false
206
+ ensure
207
+ tcp_socket && tcp_socket.close
208
+ end
209
+
210
+ def flavor
211
+ @flavor ||= connection.flavors.get_by_name(locate_config_value(:opennebula_template))
212
+ @flavor[0]
213
+ end
214
+
215
+ def server(id)
216
+ @server ||= connection.servers.get(id)
217
+ end
218
+
219
+ def validate_flavor!
220
+ if flavor.nil?
221
+ ui.error("You have not provided a valid Template NAme. Please note the options for this value are -t or --template-name.")
222
+ exit 1
223
+ end
224
+ end
225
+
226
+
195
227
  end
196
228
  end
197
229
  end
@@ -1,18 +1,36 @@
1
- require 'chef/knife'
2
- require 'chef/json_compat'
1
+ #
2
+ # Author:: Matt Ray (<matt@getchef.com>)
3
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/node'
20
+ require 'chef/api_client'
3
21
  require 'chef/knife/opennebula_base'
4
22
 
5
- #require_relative 'opennebula_base'
6
23
  class Chef
7
24
  class Knife
8
- class OpennebulaServerDelete < Knife
25
+ class OpennebulaServerDelete < Knife
9
26
 
10
27
  deps do
11
28
  require 'highline'
12
29
  Chef::Knife.load_deps
13
30
  end
14
- include Knife::OpennebulaBase
15
31
 
32
+ include Knife::OpennebulaBase
33
+
16
34
  banner "knife opennebula server delete VM_NAME (OPTIONS)"
17
35
 
18
36
  option :purge,
@@ -28,10 +46,6 @@ class Chef
28
46
  :description => "The name of the node and client to delete, if it differs from the server name. Only has meaning when used with the '--purge' option."
29
47
 
30
48
 
31
- def h
32
- @highline ||= HighLine.new
33
- end
34
-
35
49
  def destroy_item(klass, name, type_name)
36
50
  begin
37
51
  object = klass.load(name)
@@ -42,45 +56,51 @@ class Chef
42
56
  end
43
57
  end
44
58
 
59
+ def h
60
+ @highline ||= HighLine.new
61
+ end
62
+
63
+
45
64
  def run
65
+
46
66
  validate!
47
- if @name_args.empty?
48
- ui.error("no vm name is specific")
49
- exit -1
50
- else
51
- @vm_name = @name_args[0]
52
- end
53
- vm_pool = VirtualMachinePool.new(client, -1)
54
- rc = vm_pool.info
55
- if OpenNebula.is_error?(rc)
56
- puts rc.message
57
- exit -1
58
- end
59
67
 
60
- vm_pool.each do |vm|
61
- if "#{vm.name}" == "#{@vm_name}"
62
- @vm_hash = vm.to_hash
63
- msg_pair("VM ID", @vm_hash['VM']['ID'])
64
- msg_pair("VM Name", @vm_hash['VM']['NAME'])
65
- msg_pair("Availability Zone", @vm_hash['VM']['TEMPLATE']['AWS_AVAILABILITY_ZONE'])
66
- msg_pair("Public IP Address", @vm_hash['VM']['TEMPLATE']['AWS_IP_ADDRESS'])
68
+ @name_args.each do |instance_id|
69
+ begin
70
+
71
+ #Fetch instance_id by name of the server =====> MEGAM SYSTEMS CODE START
72
+ connection.servers.all.each do |ser|
73
+ if ser.name.to_s == "#{instance_id}"
74
+ instance_id = ser.id
75
+ end
76
+ end
77
+ #=====> MEGAM SYSTEMS CODE END
78
+
79
+ server = connection.servers.get(instance_id)
80
+
81
+ msg_pair("VM ID", server.id)
82
+ msg_pair("VM Name", server.name)
83
+ msg_pair("IP Address", server.ip)
84
+
85
+ puts "\n"
67
86
  confirm("Do you really want to delete this server")
68
- vm.delete(recreate = false)
69
- ui.warn("Deleted server #{@vm_hash['VM']['NAME']}")
87
+
88
+ server.destroy
89
+
90
+ ui.warn("Deleted server #{server.id}")
91
+
70
92
  if config[:purge]
71
- if config[:chef_node_name]
72
- thing_to_delete = config[:chef_node_name]
73
- destroy_item(Chef::Node, thing_to_delete, "node")
74
- destroy_item(Chef::ApiClient, thing_to_delete, "client")
75
- else
76
- ui.error("Please Provide Chef NODE_NAME in -N")
77
- end
93
+ thing_to_delete = config[:chef_node_name] || instance_id
94
+ destroy_item(Chef::Node, thing_to_delete, "node")
95
+ destroy_item(Chef::ApiClient, thing_to_delete, "client")
78
96
  else
79
- ui.warn("Corresponding node and client for the #{@vm_name} server were not deleted and remain registered with the Chef Server")
97
+ ui.warn("Corresponding node and client for the #{instance_id} server were not deleted and remain registered with the Chef Server")
80
98
  end
99
+
100
+ rescue NoMethodError
101
+ ui.error("Could not locate server '#{instance_id}'.")
81
102
  end
82
103
  end
83
-
84
104
  end
85
105
 
86
106
  end
@@ -1,74 +1,53 @@
1
+ #
2
+ # Author:: Matt Ray (<matt@getchef.com>)
3
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
1
19
  require 'chef/knife'
2
20
  require 'chef/json_compat'
3
21
  require 'chef/knife/opennebula_base'
4
22
 
5
- #require_relative 'opennebula_base'
6
23
  class Chef
7
24
  class Knife
8
25
  class OpennebulaServerList < Knife
9
26
 
10
- deps do
11
- require 'highline'
12
- Chef::Knife.load_deps
13
- end
14
27
  include Knife::OpennebulaBase
15
28
 
16
- banner "knife opennebula server list OPTIONS"
17
-
18
- def h
19
- @highline ||= HighLine.new
20
- end
29
+ banner "knife opennebula server list (options)"
21
30
 
22
31
  def run
23
- validate!
24
32
 
25
- vm_pool = VirtualMachinePool.new(client, -1)
26
- rc = vm_pool.info
27
- if OpenNebula.is_error?(rc)
28
- puts rc.message
29
- exit -1
30
- end
31
-
32
- # TO-DO: This is tailored for AWS, need to be fixed, just so it works for private/public
33
+ validate!
33
34
 
34
- vm_list = [
35
+ server_list = [
35
36
  ui.color('ID', :bold),
36
37
  ui.color('Name', :bold),
38
+ ui.color('IP', :bold),
37
39
  ui.color('Memory', :bold),
38
- ui.color('Cpu', :bold),
39
- #ui.color('AWS_ZONE', :bold),
40
- #ui.color('INSTANCE_TYPE', :bold),
41
- #ui.color('IP', :bold),
42
- #ui.color('AWS_Key', :bold),
43
40
  ui.color('State', :bold)]
44
- vm_pool.each do |vm|
45
- vm_hash = vm.to_hash
46
- vm_list << vm_hash['VM']['ID']
47
- vm_list << vm_hash['VM']['NAME']
48
- vm_list << vm_hash['VM']['TEMPLATE']['MEMORY']
49
- vm_list << vm_hash['VM']['TEMPLATE']['CPU']
50
- #vm_list << vm_hash['VM']['TEMPLATE']['AWS_AVAILABILITY_ZONE'] if vm_hash['VM']['TEMPLATE'].has_key?('AWS_AVAILABILITY_ZONE')
51
- #vm_list << vm_hash['VM']['TEMPLATE']['AWS_INSTANCE_TYPE'] if vm_hash['VM']['TEMPLATE'].has_key?('AWS_INSTANCE_TYPE')
52
- #vm_list << vm_hash['VM']['TEMPLATE']['AWS_IP_ADDRESS'] if vm_hash['VM']['TEMPLATE'].has_key?('AWS_IP_ADDRESS')
53
- #vm_list << vm_hash['VM']['TEMPLATE']['AWS_KEY_NAME'] if vm_hash['VM']['TEMPLATE'].has_key?('AWS_KEY_NAME')
54
- vm_list << begin
55
- state = vm_hash['VM']['STATE']
56
- case state
57
- when '1'
58
- ui.color(state, :red)
59
- when '2'
60
- ui.color(state, :yellow)
61
- else
62
- ui.color(state, :green)
63
- end
64
- end
65
41
 
42
+ connection.servers.all.each do |server|
43
+ server_list << "#{server.id.to_s}"
44
+ server_list << server.name
45
+ server_list << server.ip
46
+ server_list << "#{server.memory.to_s}"
47
+ server_list << server.state
66
48
  end
67
- puts ui.color("Virtual Machines Listed Successfully", :green)
68
- puts ui.list(vm_list, :uneven_columns_across, 5)
69
-
49
+ puts ui.list(server_list, :uneven_columns_across, 5)
70
50
  end
71
-
72
51
  end
73
52
  end
74
53
  end
@@ -1,61 +1,51 @@
1
+ #
2
+ # Author:: Matt Ray (<matt@getchef.com>)
3
+ # Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
1
19
  require 'chef/knife'
2
20
  require 'chef/json_compat'
3
21
  require 'chef/knife/opennebula_base'
4
22
 
5
- #require_relative 'opennebula_base'
6
23
  class Chef
7
24
  class Knife
8
25
  class OpennebulaTemplateList < Knife
9
26
 
10
- deps do
11
- require 'highline'
12
- Chef::Knife.load_deps
13
- end
14
27
  include Knife::OpennebulaBase
15
28
 
16
- banner "knife opennebula template list OPTIONS"
17
-
18
- def h
19
- @highline ||= HighLine.new
20
- end
29
+ banner "knife opennebula template list (options)"
21
30
 
22
31
  def run
23
- validate!
24
32
 
25
- temp_pool = TemplatePool.new(client, -1)
26
- rc = temp_pool.info
27
- if OpenNebula.is_error?(rc)
28
- puts rc.message
29
- exit -1
30
- end
33
+ validate!
31
34
 
32
- # This needs to be fixed as this is tailored for AWS.
33
- temp_list = [
35
+ flavor_list = [
34
36
  ui.color('ID', :bold),
35
37
  ui.color('Name', :bold),
36
- #ui.color('AMI', :bold),
37
- #ui.color('INSTANCE_TYPE', :bold),
38
- #ui.color('KEY_PAIR', :bold),
39
- #ui.color('SECURITY_GROUP', :bold),
40
38
  ui.color('CPU', :bold),
41
39
  ui.color('MEMORY', :bold)]
42
40
 
43
- temp_pool.each do |temp|
44
- temp_hash = temp.to_hash
45
- temp_list << temp_hash['VMTEMPLATE']['ID']
46
- temp_list << temp_hash['VMTEMPLATE']['NAME']
47
- #temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['EC2']['AMI'] if temp_hash['VMTEMPLATE']['TEMPLATE'].has_key?('EC2')
48
- #temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['EC2']['INSTANCETYPE'] if temp_hash['VMTEMPLATE']['TEMPLATE'].has_key?('EC2')
49
- #temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['EC2']['KEYPAIR'] if temp_hash['VMTEMPLATE']['TEMPLATE'].has_key?('EC2')
50
- #temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['EC2']['SECURITYGROUPS'] if temp_hash['VMTEMPLATE']['TEMPLATE'].has_key?('EC2')
51
- temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['CPU']
52
- temp_list << temp_hash['VMTEMPLATE']['TEMPLATE']['MEMORY']
41
+ connection.flavors.all.each do |flavor|
42
+ flavor_list << flavor.id
43
+ flavor_list << flavor.name
44
+ flavor_list << flavor.cpu.to_s
45
+ flavor_list << "#{flavor.memory.to_s} MB"
53
46
  end
54
-
55
- puts ui.color("VM Templates Listed Successfully", :green)
56
- puts ui.list(temp_list, :uneven_columns_across, 4)
47
+ puts ui.list(flavor_list, :uneven_columns_across, 4)
57
48
  end
58
-
59
49
  end
60
50
  end
61
51
  end
@@ -1,5 +1,5 @@
1
1
  class Chef
2
2
  class Opennebula
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,31 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-opennebula
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kishorekumar Neelamegam, Thomas Alrin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-06 00:00:00.000000000 Z
11
+ date: 2015-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: opennebula
14
+ name: fog
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.26.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.26.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chef
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '11.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '11.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: opennebula
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -54,8 +68,8 @@ dependencies:
54
68
  version: '0'
55
69
  description: Knife plugin to manage OpenNebula VMs
56
70
  email:
57
- - nkishore@megam.co.in
58
- - alrin@megam.co.in
71
+ - nkishore@megam.io
72
+ - thomasalrin@megam.io
59
73
  executables: []
60
74
  extensions: []
61
75
  extra_rdoc_files:
@@ -89,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
103
  version: '0'
90
104
  requirements: []
91
105
  rubyforge_project:
92
- rubygems_version: 2.2.2
106
+ rubygems_version: 2.4.6
93
107
  signing_key:
94
108
  specification_version: 4
95
109
  summary: Knife plugin to manage OpenNebula VMs