knife-cosmic 0.2.0
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.
- checksums.yaml +7 -0
- data/CHANGES.rdoc +186 -0
- data/LICENSE +202 -0
- data/README.rdoc +427 -0
- data/lib/chef/knife/cosmic_aag_list.rb +58 -0
- data/lib/chef/knife/cosmic_account_list.rb +87 -0
- data/lib/chef/knife/cosmic_base.rb +108 -0
- data/lib/chef/knife/cosmic_baselist.rb +111 -0
- data/lib/chef/knife/cosmic_cluster_list.rb +60 -0
- data/lib/chef/knife/cosmic_config_list.rb +56 -0
- data/lib/chef/knife/cosmic_disk_list.rb +58 -0
- data/lib/chef/knife/cosmic_domain_list.rb +53 -0
- data/lib/chef/knife/cosmic_firewallrule_create.rb +138 -0
- data/lib/chef/knife/cosmic_firewallrule_list.rb +62 -0
- data/lib/chef/knife/cosmic_forwardrule_create.rb +145 -0
- data/lib/chef/knife/cosmic_host_list.rb +61 -0
- data/lib/chef/knife/cosmic_hosts.rb +58 -0
- data/lib/chef/knife/cosmic_iso_list.rb +89 -0
- data/lib/chef/knife/cosmic_keypair_create.rb +72 -0
- data/lib/chef/knife/cosmic_keypair_delete.rb +60 -0
- data/lib/chef/knife/cosmic_keypair_list.rb +44 -0
- data/lib/chef/knife/cosmic_network_list.rb +63 -0
- data/lib/chef/knife/cosmic_oscategory_list.rb +50 -0
- data/lib/chef/knife/cosmic_ostype_list.rb +52 -0
- data/lib/chef/knife/cosmic_pod_list.rb +60 -0
- data/lib/chef/knife/cosmic_project_list.rb +63 -0
- data/lib/chef/knife/cosmic_publicip_list.rb +55 -0
- data/lib/chef/knife/cosmic_router_list.rb +64 -0
- data/lib/chef/knife/cosmic_securitygroup_list.rb +59 -0
- data/lib/chef/knife/cosmic_server_add_nic.rb +109 -0
- data/lib/chef/knife/cosmic_server_create.rb +674 -0
- data/lib/chef/knife/cosmic_server_delete.rb +153 -0
- data/lib/chef/knife/cosmic_server_list.rb +167 -0
- data/lib/chef/knife/cosmic_server_passwordreset.rb +91 -0
- data/lib/chef/knife/cosmic_server_reboot.rb +99 -0
- data/lib/chef/knife/cosmic_server_remove_nic.rb +101 -0
- data/lib/chef/knife/cosmic_server_start.rb +104 -0
- data/lib/chef/knife/cosmic_server_stop.rb +118 -0
- data/lib/chef/knife/cosmic_server_update.rb +47 -0
- data/lib/chef/knife/cosmic_service_list.rb +74 -0
- data/lib/chef/knife/cosmic_stack_create.rb +298 -0
- data/lib/chef/knife/cosmic_stack_delete.rb +79 -0
- data/lib/chef/knife/cosmic_template_create.rb +129 -0
- data/lib/chef/knife/cosmic_template_extract.rb +104 -0
- data/lib/chef/knife/cosmic_template_list.rb +88 -0
- data/lib/chef/knife/cosmic_template_register.rb +187 -0
- data/lib/chef/knife/cosmic_user_list.rb +62 -0
- data/lib/chef/knife/cosmic_volume_attach.rb +70 -0
- data/lib/chef/knife/cosmic_volume_create.rb +108 -0
- data/lib/chef/knife/cosmic_volume_delete.rb +97 -0
- data/lib/chef/knife/cosmic_volume_detach.rb +61 -0
- data/lib/chef/knife/cosmic_volume_list.rb +77 -0
- data/lib/chef/knife/cosmic_zone_list.rb +53 -0
- data/lib/knife-cosmic/connection.rb +1046 -0
- metadata +127 -0
@@ -0,0 +1,153 @@
|
|
1
|
+
#
|
2
|
+
# Original knife-cloudstack author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
|
+
# Original knife-cloudstack author:: Sander Botman (<sbotman@schubergphilis.com>)
|
4
|
+
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
5
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
6
|
+
# License:: Apache License, Version 2.0
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'chef/knife/cosmic_base'
|
22
|
+
|
23
|
+
module Knifecosmic
|
24
|
+
class CosmicServerDelete < Chef::Knife
|
25
|
+
|
26
|
+
include Chef::Knife::KnifecosmicBase
|
27
|
+
|
28
|
+
deps do
|
29
|
+
require 'knife-cosmic/connection'
|
30
|
+
require 'chef/api_client'
|
31
|
+
require 'chef/knife'
|
32
|
+
Chef::Knife.load_deps
|
33
|
+
end
|
34
|
+
|
35
|
+
banner "knife cosmic server delete SERVER_NAME [SERVER_NAME ...] (options)"
|
36
|
+
|
37
|
+
option :chefserver,
|
38
|
+
:long => "--[no-]chefserver",
|
39
|
+
:description => "Skip Chef server node/client deletion",
|
40
|
+
:boolean => true,
|
41
|
+
:default => true
|
42
|
+
|
43
|
+
def run
|
44
|
+
validate_base_options
|
45
|
+
|
46
|
+
@name_args.each do |hostname|
|
47
|
+
server = connection.get_server(hostname)
|
48
|
+
|
49
|
+
if !server then
|
50
|
+
ui.error("Server '#{hostname}' not found")
|
51
|
+
next
|
52
|
+
end
|
53
|
+
|
54
|
+
if server['state'] == 'Destroyed' then
|
55
|
+
ui.warn("Server '#{hostname}' already destroyed")
|
56
|
+
connection.delete_server(hostname, true) if confirm_action("Server '#{hostname}' already destroyed, do you want to expunge it?")
|
57
|
+
next
|
58
|
+
end
|
59
|
+
|
60
|
+
rules = connection.list_port_forwarding_rules
|
61
|
+
|
62
|
+
show_object_details(server, connection, rules)
|
63
|
+
|
64
|
+
result = confirm_action("Do you really want to delete this server")
|
65
|
+
if result
|
66
|
+
print "#{ui.color("Waiting for deletion", :magenta)}"
|
67
|
+
disassociate_virtual_ip_address server
|
68
|
+
connection.delete_server(hostname, false)
|
69
|
+
puts "\n"
|
70
|
+
ui.msg("Deleted server #{hostname}")
|
71
|
+
|
72
|
+
# delete chef client and node
|
73
|
+
node_name = hostname # connection.get_server_fqdn server ## server create doesn't add fqdn!
|
74
|
+
delete_chef = locate_config_value(:chefserver) ? confirm_action("Do you want to delete the chef node and client '#{node_name}'") : false
|
75
|
+
if delete_chef
|
76
|
+
delete_node node_name
|
77
|
+
delete_client node_name
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def show_object_details(s, connection, rules)
|
85
|
+
return if locate_config_value(:yes)
|
86
|
+
|
87
|
+
object_fields = []
|
88
|
+
object_fields << ui.color("Name:", :cyan)
|
89
|
+
object_fields << s['name'].to_s
|
90
|
+
object_fields << ui.color("Public IP:", :cyan)
|
91
|
+
object_fields << (connection.get_server_public_ip(s, rules) || '')
|
92
|
+
object_fields << ui.color("Service:", :cyan)
|
93
|
+
object_fields << s['serviceofferingname'].to_s
|
94
|
+
object_fields << ui.color("Template:", :cyan)
|
95
|
+
object_fields << s['templatename']
|
96
|
+
object_fields << ui.color("Domain:", :cyan)
|
97
|
+
object_fields << s['domain']
|
98
|
+
object_fields << ui.color("Zone:", :cyan)
|
99
|
+
object_fields << s['zonename']
|
100
|
+
object_fields << ui.color("State:", :cyan)
|
101
|
+
object_fields << s['state']
|
102
|
+
|
103
|
+
puts "\n"
|
104
|
+
puts ui.list(object_fields, :uneven_columns_across, 2)
|
105
|
+
puts "\n"
|
106
|
+
end
|
107
|
+
|
108
|
+
def confirm_action(question)
|
109
|
+
return true if locate_config_value(:yes)
|
110
|
+
result = ui.ask_question(question, :default => "Y" )
|
111
|
+
if result == "Y" || result == "y" then
|
112
|
+
return true
|
113
|
+
else
|
114
|
+
return false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def disassociate_virtual_ip_address(server)
|
119
|
+
ip_addr = connection.get_server_public_ip(server)
|
120
|
+
return unless ip_addr
|
121
|
+
ip_addr_info = connection.get_public_ip_address(ip_addr)
|
122
|
+
#Check if Public IP has been allocated and is not Source NAT
|
123
|
+
if ip_addr_info
|
124
|
+
if not ip_addr_info['issourcenat']
|
125
|
+
connection.disassociate_ip_address(ip_addr_info['id'])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def delete_client(name)
|
131
|
+
begin
|
132
|
+
client = Chef::ApiClient.load(name)
|
133
|
+
rescue Net::HTTPServerException
|
134
|
+
return
|
135
|
+
end
|
136
|
+
|
137
|
+
client.destroy
|
138
|
+
ui.msg "Deleted client #{name}"
|
139
|
+
end
|
140
|
+
|
141
|
+
def delete_node(name)
|
142
|
+
begin
|
143
|
+
node = Chef::Node.load(name)
|
144
|
+
rescue Net::HTTPServerException
|
145
|
+
return
|
146
|
+
end
|
147
|
+
|
148
|
+
node.destroy
|
149
|
+
ui.msg "Deleted node #{name}"
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#
|
2
|
+
# Original knife-cloudstack author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
|
+
# Original knife-cloudstack author:: Sander Botman (<sbotman@schubergphilis.com>)
|
4
|
+
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
5
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
6
|
+
# License:: Apache License, Version 2.0
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'chef/knife'
|
22
|
+
require 'chef/knife/cosmic_baselist'
|
23
|
+
|
24
|
+
module Knifecosmic
|
25
|
+
class CosmicServerList < Chef::Knife
|
26
|
+
|
27
|
+
include Chef::Knife::KnifecosmicBaseList
|
28
|
+
|
29
|
+
banner "knife cosmic server list (options)"
|
30
|
+
|
31
|
+
option :listall,
|
32
|
+
:long => "--listall",
|
33
|
+
:description => "List all the accounts",
|
34
|
+
:boolean => true
|
35
|
+
|
36
|
+
option :name,
|
37
|
+
:long => "--name NAME",
|
38
|
+
:description => "Specify hostname to list"
|
39
|
+
|
40
|
+
option :keyword,
|
41
|
+
:long => "--keyword NAME",
|
42
|
+
:description => "Specify part of instancename to list"
|
43
|
+
|
44
|
+
option :action,
|
45
|
+
:short => "-a ACTION",
|
46
|
+
:long => "--action ACTION",
|
47
|
+
:description => "start, stop or destroy the instances in your result"
|
48
|
+
|
49
|
+
option :expunge,
|
50
|
+
:long => "--expunge",
|
51
|
+
:description => "If used with --action destroy, will cause the server to be expunged"
|
52
|
+
option :public_ip,
|
53
|
+
:long => "--[no-]public-ip",
|
54
|
+
:description => "Show or don't show the public IP for server in your result",
|
55
|
+
:boolean => true,
|
56
|
+
:default => true
|
57
|
+
|
58
|
+
def run
|
59
|
+
validate_base_options
|
60
|
+
|
61
|
+
columns = [
|
62
|
+
'Name :name',
|
63
|
+
'Public IP :ipaddress',
|
64
|
+
'Service :serviceofferingname',
|
65
|
+
'Template :templatename',
|
66
|
+
'State :state',
|
67
|
+
'Instance :instancename',
|
68
|
+
'Hypervisor :hostname'
|
69
|
+
]
|
70
|
+
|
71
|
+
params = { 'command' => "listVirtualMachines" }
|
72
|
+
params['filter'] = locate_config_value(:filter) if locate_config_value(:filter)
|
73
|
+
params['listall'] = locate_config_value(:listall) if locate_config_value(:listall)
|
74
|
+
params['keyword'] = locate_config_value(:keyword) if locate_config_value(:keyword)
|
75
|
+
params['name'] = locate_config_value(:name) if locate_config_value(:name)
|
76
|
+
params['expunge'] = locate_config_value(:expunge) if locate_config_value(:expunge)
|
77
|
+
params['expunge'] = false if params['expunge'].nil?
|
78
|
+
|
79
|
+
##
|
80
|
+
# Get the public IP address if possible, except when the option --no-public-ip is given.
|
81
|
+
|
82
|
+
rules = connection.list_port_forwarding_rules(nil, true)
|
83
|
+
public_list = connection.list_public_ip_addresses(true)
|
84
|
+
result = connection.list_object(params, "virtualmachine")
|
85
|
+
result.each do |n|
|
86
|
+
public_ip = connection.get_server_public_ip(n, rules, public_list) if locate_config_value(:public_ip)
|
87
|
+
private_ip = (n['nic'].select { |k| k['isdefault'] }).first
|
88
|
+
public_ip ? n['ipaddress'] = public_ip : n['ipaddress'] = private_ip['ipaddress'] || "N/A"
|
89
|
+
end
|
90
|
+
|
91
|
+
list_object(columns, result)
|
92
|
+
|
93
|
+
##
|
94
|
+
# Executing actions against the list results that are returned.
|
95
|
+
|
96
|
+
if locate_config_value(:action)
|
97
|
+
result.each do |r|
|
98
|
+
hostname = r['name']
|
99
|
+
case locate_config_value(:action).downcase
|
100
|
+
when "start" then
|
101
|
+
show_object_details(r, connection, rules)
|
102
|
+
result = confirm_action("Do you really want to start this server ")
|
103
|
+
if result then
|
104
|
+
print "#{ui.color("Waiting for startup", :magenta)}"
|
105
|
+
connection.start_server(hostname)
|
106
|
+
puts "\n"
|
107
|
+
ui.msg("Started server #{hostname}")
|
108
|
+
end
|
109
|
+
when "stop" then
|
110
|
+
show_object_details(r, connection, rules)
|
111
|
+
result = confirm_action("Do you really want to stop this server ")
|
112
|
+
if result then
|
113
|
+
print "#{ui.color("Waiting for shutdown", :magenta)}"
|
114
|
+
connection.stop_server(hostname)
|
115
|
+
puts "\n"
|
116
|
+
ui.msg("Shutdown server #{hostname}")
|
117
|
+
end
|
118
|
+
when "destroy" then
|
119
|
+
show_object_details(r, connection, rules)
|
120
|
+
result = confirm_action("Do you really want to destroy this server ")
|
121
|
+
if result then
|
122
|
+
print "#{ui.color("Waiting for demolition", :magenta)}"
|
123
|
+
connection.delete_server(hostname, params['expunge'])
|
124
|
+
puts "\n"
|
125
|
+
ui.msg("Destroyed server #{hostname}")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def show_object_details(s, connection, rules)
|
133
|
+
return if locate_config_value(:yes)
|
134
|
+
|
135
|
+
object_fields = []
|
136
|
+
object_fields << ui.color("Name:", :cyan)
|
137
|
+
object_fields << s['name'].to_s
|
138
|
+
object_fields << ui.color("Public IP:", :cyan)
|
139
|
+
object_fields << (connection.get_server_public_ip(s, rules) || '')
|
140
|
+
object_fields << ui.color("Service:", :cyan)
|
141
|
+
object_fields << s['serviceofferingname'].to_s
|
142
|
+
object_fields << ui.color("Template:", :cyan)
|
143
|
+
object_fields << s['templatename']
|
144
|
+
object_fields << ui.color("Domain:", :cyan)
|
145
|
+
object_fields << s['domain']
|
146
|
+
object_fields << ui.color("Zone:", :cyan)
|
147
|
+
object_fields << s['zonename']
|
148
|
+
object_fields << ui.color("State:", :cyan)
|
149
|
+
object_fields << s['state']
|
150
|
+
|
151
|
+
puts "\n"
|
152
|
+
puts ui.list(object_fields, :uneven_columns_across, 2)
|
153
|
+
puts "\n"
|
154
|
+
end
|
155
|
+
|
156
|
+
def confirm_action(question)
|
157
|
+
return true if locate_config_value(:yes)
|
158
|
+
result = ui.ask_question(question, :default => "Y" )
|
159
|
+
if result == "Y" || result == "y" then
|
160
|
+
return true
|
161
|
+
else
|
162
|
+
return false
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#
|
2
|
+
# knife-cosmic author:: Robbert-Jan Sperna Weiland (<rspernaweiland@schubergphilis.com>)
|
3
|
+
# Copyright:: Copyright (c) 2018 Robbert-Jan Sperna Weiland.
|
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/knife/cosmic_base'
|
20
|
+
|
21
|
+
module Knifecosmic
|
22
|
+
class CosmicServerPasswordreset < Chef::Knife
|
23
|
+
|
24
|
+
include Chef::Knife::KnifecosmicBase
|
25
|
+
|
26
|
+
deps do
|
27
|
+
require 'knife-cosmic/connection'
|
28
|
+
require 'chef/api_client'
|
29
|
+
require 'chef/knife'
|
30
|
+
Chef::Knife.load_deps
|
31
|
+
end
|
32
|
+
|
33
|
+
banner "knife cosmic server passwordreset SERVER_NAME [SERVER_NAME ...] (options)"
|
34
|
+
|
35
|
+
def run
|
36
|
+
validate_base_options
|
37
|
+
|
38
|
+
@name_args.each do |hostname|
|
39
|
+
server = connection.get_server(hostname)
|
40
|
+
|
41
|
+
if !server then
|
42
|
+
ui.error("Server '#{hostname}' not found")
|
43
|
+
next
|
44
|
+
end
|
45
|
+
|
46
|
+
rules = connection.list_port_forwarding_rules
|
47
|
+
|
48
|
+
show_object_details(server, connection, rules)
|
49
|
+
|
50
|
+
server = connection.server_passwordreset(hostname)
|
51
|
+
password = server['password']
|
52
|
+
ui.msg("Password: #{password}")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def show_object_details(s, connection, rules)
|
57
|
+
return if locate_config_value(:yes)
|
58
|
+
|
59
|
+
object_fields = []
|
60
|
+
object_fields << ui.color("Name:", :cyan)
|
61
|
+
object_fields << s['name'].to_s
|
62
|
+
object_fields << ui.color("Public IP:", :cyan)
|
63
|
+
object_fields << (connection.get_server_public_ip(s, rules) || '')
|
64
|
+
object_fields << ui.color("Service:", :cyan)
|
65
|
+
object_fields << s['serviceofferingname'].to_s
|
66
|
+
object_fields << ui.color("Template:", :cyan)
|
67
|
+
object_fields << s['templatename']
|
68
|
+
object_fields << ui.color("Domain:", :cyan)
|
69
|
+
object_fields << s['domain']
|
70
|
+
object_fields << ui.color("Zone:", :cyan)
|
71
|
+
object_fields << s['zonename']
|
72
|
+
object_fields << ui.color("State:", :cyan)
|
73
|
+
object_fields << s['state']
|
74
|
+
|
75
|
+
puts "\n"
|
76
|
+
puts ui.list(object_fields, :uneven_columns_across, 2)
|
77
|
+
puts "\n"
|
78
|
+
end
|
79
|
+
|
80
|
+
def confirm_action(question)
|
81
|
+
return true if locate_config_value(:yes)
|
82
|
+
result = ui.ask_question(question, :default => "Y" )
|
83
|
+
if result == "Y" || result == "y" then
|
84
|
+
return true
|
85
|
+
else
|
86
|
+
return false
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
#
|
2
|
+
# Original knife-cloudstack author:: Ryan Holmes (<rholmes@edmunds.com>)
|
3
|
+
# Original knife-cloudstack author:: KC Braunschweig (<kcbraunschweig@gmail.com>)
|
4
|
+
# Original knife-cloudstack author:: Sander Botman (<sbotman@schubergphilis.com>)
|
5
|
+
# Copyright:: Copyright (c) 2011 Edmunds, Inc.
|
6
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
7
|
+
# License:: Apache License, Version 2.0
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
require 'chef/knife/cosmic_base'
|
23
|
+
|
24
|
+
module Knifecosmic
|
25
|
+
class CosmicServerReboot < Chef::Knife
|
26
|
+
|
27
|
+
include Chef::Knife::KnifecosmicBase
|
28
|
+
|
29
|
+
deps do
|
30
|
+
require 'knife-cosmic/connection'
|
31
|
+
require 'chef/api_client'
|
32
|
+
require 'chef/knife'
|
33
|
+
Chef::Knife.load_deps
|
34
|
+
end
|
35
|
+
|
36
|
+
banner "knife cosmic server reboot SERVER_NAME [SERVER_NAME ...] (options)"
|
37
|
+
|
38
|
+
def run
|
39
|
+
validate_base_options
|
40
|
+
|
41
|
+
@name_args.each do |hostname|
|
42
|
+
server = connection.get_server(hostname)
|
43
|
+
|
44
|
+
if !server then
|
45
|
+
ui.error("Server '#{hostname}' not found")
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
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 reboot this server")
|
54
|
+
|
55
|
+
if result
|
56
|
+
print "#{ui.color("Rebooting", :magenta)}"
|
57
|
+
connection.reboot_server(hostname)
|
58
|
+
puts "\n"
|
59
|
+
ui.msg("Rebooted server #{hostname}")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
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"
|
86
|
+
end
|
87
|
+
|
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
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|