knife-cosmic 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|