knife-cloudstack 0.0.13 → 0.0.14
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.
- data/CHANGES.rdoc +50 -0
- data/README.rdoc +221 -42
- data/lib/chef/knife/cs_account_list.rb +130 -0
- data/lib/chef/knife/cs_base.rb +98 -0
- data/lib/chef/knife/cs_baselist.rb +81 -0
- data/lib/chef/knife/cs_cluster_list.rb +93 -0
- data/lib/chef/knife/cs_config_list.rb +85 -0
- data/lib/chef/knife/cs_disk_list.rb +89 -0
- data/lib/chef/knife/cs_domain_list.rb +83 -0
- data/lib/chef/knife/cs_firewallrule_list.rb +95 -0
- data/lib/chef/knife/cs_host_list.rb +95 -0
- data/lib/chef/knife/cs_hosts.rb +2 -2
- data/lib/chef/knife/cs_iso_list.rb +103 -0
- data/lib/chef/knife/cs_network_list.rb +56 -46
- data/lib/chef/knife/cs_oscategory_list.rb +78 -0
- data/lib/chef/knife/cs_ostype_list.rb +80 -0
- data/lib/chef/knife/cs_pod_list.rb +93 -0
- data/lib/chef/knife/cs_project_list.rb +92 -0
- data/lib/chef/knife/cs_router_list.rb +94 -0
- data/lib/chef/knife/cs_server_create.rb +185 -144
- data/lib/chef/knife/cs_server_delete.rb +62 -79
- data/lib/chef/knife/cs_server_list.rb +136 -57
- data/lib/chef/knife/cs_server_reboot.rb +50 -54
- data/lib/chef/knife/cs_server_start.rb +48 -52
- data/lib/chef/knife/cs_server_stop.rb +54 -55
- data/lib/chef/knife/cs_service_list.rb +62 -41
- data/lib/chef/knife/cs_stack_create.rb +2 -2
- data/lib/chef/knife/cs_stack_delete.rb +2 -2
- data/lib/chef/knife/cs_template_create.rb +121 -0
- data/lib/chef/knife/cs_template_extract.rb +104 -0
- data/lib/chef/knife/cs_template_list.rb +65 -63
- data/lib/chef/knife/cs_template_register.rb +180 -0
- data/lib/chef/knife/cs_user_list.rb +93 -0
- data/lib/chef/knife/cs_volume_list.rb +94 -0
- data/lib/chef/knife/cs_zone_list.rb +55 -36
- data/lib/knife-cloudstack/connection.rb +75 -22
- data/lib/knife-cloudstack/string_to_regexp.rb +32 -0
- metadata +93 -61
@@ -1,7 +1,9 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
3
|
# Author:: KC Braunschweig (<kcbraunschweig@gmail.com>)
|
4
|
+
# Author:: Sander Botman (<sbotman@schubergphilis.com>)
|
4
5
|
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
6
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
5
7
|
# License:: Apache License, Version 2.0
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,37 +19,24 @@
|
|
17
19
|
# limitations under the License.
|
18
20
|
#
|
19
21
|
|
20
|
-
require 'chef/knife'
|
22
|
+
require 'chef/knife/cs_base'
|
21
23
|
|
22
24
|
module KnifeCloudstack
|
23
25
|
class CsServerStart < Chef::Knife
|
24
26
|
|
27
|
+
include Chef::Knife::KnifeCloudstackBase
|
28
|
+
|
25
29
|
deps do
|
30
|
+
require 'chef/knife'
|
26
31
|
require 'knife-cloudstack/connection'
|
27
32
|
require 'chef/api_client'
|
33
|
+
Chef::Knife.load_deps
|
28
34
|
end
|
29
35
|
|
30
36
|
banner "knife cs server start SERVER_NAME [SERVER_NAME ...] (options)"
|
31
37
|
|
32
|
-
option :cloudstack_url,
|
33
|
-
:short => "-U URL",
|
34
|
-
:long => "--cloudstack-url URL",
|
35
|
-
:description => "The CloudStack endpoint URL",
|
36
|
-
:proc => Proc.new { |url| Chef::Config[:knife][:cloudstack_url] = url }
|
37
|
-
|
38
|
-
option :cloudstack_api_key,
|
39
|
-
:short => "-A KEY",
|
40
|
-
:long => "--cloudstack-api-key KEY",
|
41
|
-
:description => "Your CloudStack API key",
|
42
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_api_key] = key }
|
43
|
-
|
44
|
-
option :cloudstack_secret_key,
|
45
|
-
:short => "-K SECRET",
|
46
|
-
:long => "--cloudstack-secret-key SECRET",
|
47
|
-
:description => "Your CloudStack secret key",
|
48
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_secret_key] = key }
|
49
|
-
|
50
38
|
def run
|
39
|
+
validate_base_options
|
51
40
|
|
52
41
|
@name_args.each do |hostname|
|
53
42
|
server = connection.get_server(hostname)
|
@@ -57,47 +46,54 @@ module KnifeCloudstack
|
|
57
46
|
next
|
58
47
|
end
|
59
48
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
print "#{ui.color("Waiting for startup", :magenta)}"
|
73
|
-
connection.start_server(hostname)
|
74
|
-
puts "\n"
|
75
|
-
ui.msg("Started server #{hostname}")
|
49
|
+
rules = connection.list_port_forwarding_rules
|
50
|
+
|
51
|
+
show_object_details(server, connection, rules)
|
52
|
+
|
53
|
+
result = confirm_action("Do you really want to start this server")
|
54
|
+
if result
|
55
|
+
print "#{ui.color("Waiting for startup", :magenta)}"
|
56
|
+
connection.start_server(hostname)
|
57
|
+
puts "\n"
|
58
|
+
ui.msg("Started server #{hostname}")
|
59
|
+
end
|
76
60
|
end
|
77
61
|
|
78
62
|
end
|
79
63
|
|
80
|
-
def connection
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
64
|
+
def show_object_details(s, connection, rules)
|
65
|
+
return if locate_config_value(:yes)
|
66
|
+
|
67
|
+
object_fields = []
|
68
|
+
object_fields << ui.color("Name:", :cyan)
|
69
|
+
object_fields << s['name'].to_s
|
70
|
+
object_fields << ui.color("Public IP:", :cyan)
|
71
|
+
object_fields << (connection.get_server_public_ip(s, rules) || '')
|
72
|
+
object_fields << ui.color("Service:", :cyan)
|
73
|
+
object_fields << s['serviceofferingname'].to_s
|
74
|
+
object_fields << ui.color("Template:", :cyan)
|
75
|
+
object_fields << s['templatename']
|
76
|
+
object_fields << ui.color("Domain:", :cyan)
|
77
|
+
object_fields << s['domain']
|
78
|
+
object_fields << ui.color("Zone:", :cyan)
|
79
|
+
object_fields << s['zonename']
|
80
|
+
object_fields << ui.color("State:", :cyan)
|
81
|
+
object_fields << s['state']
|
82
|
+
|
83
|
+
puts "\n"
|
84
|
+
puts ui.list(object_fields, :uneven_columns_across, 2)
|
85
|
+
puts "\n"
|
89
86
|
end
|
90
87
|
|
91
|
-
def
|
92
|
-
|
93
|
-
|
88
|
+
def confirm_action(question)
|
89
|
+
return true if locate_config_value(:yes)
|
90
|
+
result = ui.ask_question(question, :default => "Y" )
|
91
|
+
if result == "Y" || result == "y" then
|
92
|
+
return true
|
93
|
+
else
|
94
|
+
return false
|
94
95
|
end
|
95
96
|
end
|
96
97
|
|
97
|
-
def locate_config_value(key)
|
98
|
-
key = key.to_sym
|
99
|
-
Chef::Config[:knife][key] || config[key]
|
100
|
-
end
|
101
|
-
|
102
98
|
end
|
103
99
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
3
|
# Author:: KC Braunschweig (<kcbraunschweig@gmail.com>)
|
4
|
+
# Author:: Sander Botman (<sbotman@schubergphilis.com>)
|
4
5
|
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
6
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
5
7
|
# License:: Apache License, Version 2.0
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,42 +19,29 @@
|
|
17
19
|
# limitations under the License.
|
18
20
|
#
|
19
21
|
|
20
|
-
require 'chef/knife'
|
22
|
+
require 'chef/knife/cs_base'
|
21
23
|
|
22
24
|
module KnifeCloudstack
|
23
25
|
class CsServerStop < Chef::Knife
|
24
26
|
|
27
|
+
include Chef::Knife::KnifeCloudstackBase
|
28
|
+
|
25
29
|
deps do
|
26
30
|
require 'knife-cloudstack/connection'
|
27
31
|
require 'chef/api_client'
|
32
|
+
require 'chef/knife'
|
33
|
+
Chef::Knife.load_deps
|
28
34
|
end
|
29
35
|
|
30
36
|
banner "knife cs server stop SERVER_NAME [SERVER_NAME ...] (options)"
|
31
37
|
|
32
|
-
option :cloudstack_url,
|
33
|
-
:short => "-U URL",
|
34
|
-
:long => "--cloudstack-url URL",
|
35
|
-
:description => "The CloudStack endpoint URL",
|
36
|
-
:proc => Proc.new { |url| Chef::Config[:knife][:cloudstack_url] = url }
|
37
|
-
|
38
|
-
option :cloudstack_api_key,
|
39
|
-
:short => "-A KEY",
|
40
|
-
:long => "--cloudstack-api-key KEY",
|
41
|
-
:description => "Your CloudStack API key",
|
42
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_api_key] = key }
|
43
|
-
|
44
|
-
option :cloudstack_secret_key,
|
45
|
-
:short => "-K SECRET",
|
46
|
-
:long => "--cloudstack-secret-key SECRET",
|
47
|
-
:description => "Your CloudStack secret key",
|
48
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_secret_key] = key }
|
49
|
-
|
50
38
|
option :cloudstack_force_stop,
|
51
39
|
:long => "--force",
|
52
40
|
:description => "Force stop the VM. The caller knows the VM is stopped.",
|
53
41
|
:boolean => true
|
54
42
|
|
55
43
|
def run
|
44
|
+
validate_base_options
|
56
45
|
|
57
46
|
@name_args.each do |hostname|
|
58
47
|
server = connection.get_server(hostname)
|
@@ -62,53 +51,63 @@ module KnifeCloudstack
|
|
62
51
|
next
|
63
52
|
end
|
64
53
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
msg("Service", server['serviceofferingname'])
|
69
|
-
msg("Template", server['templatename'])
|
70
|
-
msg("Domain", server['domain'])
|
71
|
-
msg("Zone", server['zonename'])
|
72
|
-
msg("State", server['state'])
|
54
|
+
rules = connection.list_port_forwarding_rules
|
55
|
+
|
56
|
+
show_object_details(server, connection, rules)
|
73
57
|
|
74
|
-
puts "\n"
|
75
58
|
if config[:cloudstack_force_stop]
|
76
|
-
|
77
|
-
|
78
|
-
|
59
|
+
result = confirm_action("Do you really want to force stop this server")
|
60
|
+
if result
|
61
|
+
print "#{ui.color("Forcefully stopping", :magenta)}"
|
62
|
+
connection.stop_server(hostname,config[:cloudstack_force_stop])
|
63
|
+
puts "\n"
|
64
|
+
ui.msg("Stopped server #{hostname}")
|
65
|
+
end
|
79
66
|
else
|
80
|
-
|
81
|
-
|
82
|
-
|
67
|
+
result = confirm_action("Do you really want to stop this server")
|
68
|
+
if result
|
69
|
+
print "#{ui.color("Stopping", :magenta)}"
|
70
|
+
connection.stop_server(hostname)
|
71
|
+
puts "\n"
|
72
|
+
ui.msg("Stopped server #{hostname}")
|
73
|
+
end
|
83
74
|
end
|
84
|
-
|
85
|
-
puts "\n"
|
86
|
-
ui.msg("Stopped server #{hostname}")
|
87
75
|
end
|
88
|
-
|
89
76
|
end
|
90
77
|
|
91
|
-
def connection
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
78
|
+
def show_object_details(s, connection, rules)
|
79
|
+
return if locate_config_value(:yes)
|
80
|
+
|
81
|
+
object_fields = []
|
82
|
+
object_fields << ui.color("Name:", :cyan)
|
83
|
+
object_fields << s['name'].to_s
|
84
|
+
object_fields << ui.color("Public IP:", :cyan)
|
85
|
+
object_fields << (connection.get_server_public_ip(s, rules) || '')
|
86
|
+
object_fields << ui.color("Service:", :cyan)
|
87
|
+
object_fields << s['serviceofferingname'].to_s
|
88
|
+
object_fields << ui.color("Template:", :cyan)
|
89
|
+
object_fields << s['templatename']
|
90
|
+
object_fields << ui.color("Domain:", :cyan)
|
91
|
+
object_fields << s['domain']
|
92
|
+
object_fields << ui.color("Zone:", :cyan)
|
93
|
+
object_fields << s['zonename']
|
94
|
+
object_fields << ui.color("State:", :cyan)
|
95
|
+
object_fields << s['state']
|
96
|
+
|
97
|
+
puts "\n"
|
98
|
+
puts ui.list(object_fields, :uneven_columns_across, 2)
|
99
|
+
puts "\n"
|
100
100
|
end
|
101
101
|
|
102
|
-
def
|
103
|
-
|
104
|
-
|
102
|
+
def confirm_action(question)
|
103
|
+
return true if locate_config_value(:yes)
|
104
|
+
result = ui.ask_question(question, :default => "Y" )
|
105
|
+
if result == "Y" || result == "y" then
|
106
|
+
return true
|
107
|
+
else
|
108
|
+
return false
|
105
109
|
end
|
106
110
|
end
|
107
111
|
|
108
|
-
def locate_config_value(key)
|
109
|
-
key = key.to_sym
|
110
|
-
Chef::Config[:knife][key] || config[key]
|
111
|
-
end
|
112
|
-
|
113
112
|
end
|
114
113
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
|
+
# Author:: Sander Botman (<sbotman@schubergphilis.com>)
|
3
4
|
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
5
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
4
6
|
# License:: Apache License, Version 2.0
|
5
7
|
#
|
6
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,63 +18,87 @@
|
|
16
18
|
# limitations under the License.
|
17
19
|
#
|
18
20
|
|
19
|
-
require 'chef/knife'
|
21
|
+
require 'chef/knife/cs_base'
|
22
|
+
require 'chef/knife/cs_baselist'
|
20
23
|
|
21
24
|
module KnifeCloudstack
|
22
25
|
class CsServiceList < Chef::Knife
|
23
26
|
|
24
|
-
|
27
|
+
include Chef::Knife::KnifeCloudstackBase
|
28
|
+
include Chef::Knife::KnifeCloudstackBaseList
|
25
29
|
|
26
30
|
deps do
|
31
|
+
require 'chef/knife'
|
27
32
|
require 'knife-cloudstack/connection'
|
33
|
+
Chef::Knife.load_deps
|
28
34
|
end
|
29
35
|
|
30
36
|
banner "knife cs service list (options)"
|
31
37
|
|
32
|
-
option :
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:description => "The CloudStack endpoint URL",
|
36
|
-
:proc => Proc.new { |url| Chef::Config[:knife][:cloudstack_url] = url }
|
38
|
+
option :name,
|
39
|
+
:long => "--name NAME",
|
40
|
+
:description => "Specify servicename to list"
|
37
41
|
|
38
|
-
option :
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:description => "Your CloudStack API key",
|
42
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_api_key] = key }
|
42
|
+
option :keyword,
|
43
|
+
:long => "--keyword NAME",
|
44
|
+
:description => "Specify part of servicename to list"
|
43
45
|
|
44
|
-
option :
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:cloudstack_secret_key] = key }
|
46
|
+
option :index,
|
47
|
+
:long => "--index",
|
48
|
+
:description => "Add index numbers to the output",
|
49
|
+
:boolean => true
|
49
50
|
|
50
51
|
def run
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
)
|
57
|
-
|
58
|
-
|
52
|
+
validate_base_options
|
53
|
+
|
54
|
+
object_list = []
|
55
|
+
object_list << ui.color('Index', :bold) if locate_config_value(:index)
|
56
|
+
|
57
|
+
if locate_config_value(:fields)
|
58
|
+
locate_config_value(:fields).split(',').each { |n| object_list << ui.color(("#{n}").strip, :bold) }
|
59
|
+
else
|
60
|
+
[
|
59
61
|
ui.color('Name', :bold),
|
60
62
|
ui.color('Memory', :bold),
|
61
63
|
ui.color('CPUs', :bold),
|
62
64
|
ui.color('CPU Speed', :bold),
|
63
65
|
ui.color('Created', :bold)
|
64
|
-
|
65
|
-
|
66
|
-
services = connection.list_service_offerings
|
67
|
-
services.each do |s|
|
68
|
-
service_list << s['name']
|
69
|
-
service_list << (human_memory(s['memory']) || 'Unknown')
|
70
|
-
service_list << s['cpunumber'].to_s
|
71
|
-
service_list << s['cpuspeed'].to_s + ' Mhz'
|
72
|
-
service_list << s['created']
|
66
|
+
].each { |field| object_list << field }
|
73
67
|
end
|
74
|
-
puts ui.list(service_list, :columns_across, 5)
|
75
68
|
|
69
|
+
columns = object_list.count
|
70
|
+
object_list = [] if locate_config_value(:noheader)
|
71
|
+
|
72
|
+
connection_result = connection.list_object(
|
73
|
+
"listServiceOfferings",
|
74
|
+
"serviceoffering",
|
75
|
+
locate_config_value(:filter),
|
76
|
+
false,
|
77
|
+
locate_config_value(:keyword),
|
78
|
+
locate_config_value(:name)
|
79
|
+
)
|
80
|
+
|
81
|
+
output_format(connection_result)
|
82
|
+
|
83
|
+
index_num = 0
|
84
|
+
connection_result.each do |r|
|
85
|
+
if locate_config_value(:index)
|
86
|
+
index_num += 1
|
87
|
+
object_list << index_num.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
if locate_config_value(:fields)
|
91
|
+
locate_config_value(:fields).downcase.split(',').each { |n| object_list << ((r[("#{n}").strip]).to_s || 'N/A') }
|
92
|
+
else
|
93
|
+
object_list << r['name'].to_s
|
94
|
+
object_list << (r['memory'] ? human_memory(r['memory']) : 'Unknown')
|
95
|
+
object_list << r['cpunumber'].to_s
|
96
|
+
object_list << r['cpuspeed'].to_s + ' Mhz'
|
97
|
+
object_list << r['created']
|
98
|
+
end
|
99
|
+
end
|
100
|
+
puts ui.list(object_list, :uneven_columns_across, columns)
|
101
|
+
list_object_fields(connection_result) if locate_config_value(:fieldlist)
|
76
102
|
end
|
77
103
|
|
78
104
|
def human_memory n
|
@@ -81,12 +107,7 @@ module KnifeCloudstack
|
|
81
107
|
n /= 1024.0
|
82
108
|
count += 1
|
83
109
|
end
|
84
|
-
format("%.
|
85
|
-
end
|
86
|
-
|
87
|
-
def locate_config_value(key)
|
88
|
-
key = key.to_sym
|
89
|
-
Chef::Config[:knife][key] || config[key]
|
110
|
+
format("%.0f", n) + %w(MB GB TB)[count]
|
90
111
|
end
|
91
112
|
|
92
113
|
end
|
@@ -16,8 +16,6 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require 'chef/knife'
|
20
|
-
|
21
19
|
module KnifeCloudstack
|
22
20
|
class CsStackCreate < Chef::Knife
|
23
21
|
|
@@ -31,6 +29,8 @@ module KnifeCloudstack
|
|
31
29
|
require 'net/ssh'
|
32
30
|
require 'net/ssh/multi'
|
33
31
|
require 'knife-cloudstack/connection'
|
32
|
+
require 'chef/knife'
|
33
|
+
Chef::Knife.load_deps
|
34
34
|
Chef::Knife::Ssh.load_deps
|
35
35
|
Chef::Knife::NodeRunListRemove.load_deps
|
36
36
|
KnifeCloudstack::CsServerCreate.load_deps
|