knife-openstack 1.3.2 → 2.0.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 +4 -4
- data/.github/ISSUE_TEMPLATE.md +21 -0
- data/.gitignore +5 -0
- data/.travis.yml +9 -7
- data/CHANGELOG.md +174 -92
- data/Gemfile +15 -3
- data/README.md +96 -68
- data/Rakefile +19 -6
- data/knife-openstack.gemspec +17 -15
- data/lib/chef/knife/cloud/openstack_server_create_options.rb +36 -35
- data/lib/chef/knife/cloud/openstack_service.rb +7 -6
- data/lib/chef/knife/cloud/openstack_service_options.rb +18 -17
- data/lib/chef/knife/openstack_flavor_list.rb +11 -10
- data/lib/chef/knife/openstack_floating_ip_allocate.rb +13 -12
- data/lib/chef/knife/openstack_floating_ip_associate.rb +9 -8
- data/lib/chef/knife/openstack_floating_ip_disassociate.rb +9 -8
- data/lib/chef/knife/openstack_floating_ip_list.rb +10 -9
- data/lib/chef/knife/openstack_floating_ip_release.rb +7 -6
- data/lib/chef/knife/openstack_group_list.rb +13 -12
- data/lib/chef/knife/openstack_helpers.rb +8 -7
- data/lib/chef/knife/openstack_image_list.rb +14 -13
- data/lib/chef/knife/openstack_network_list.rb +10 -9
- data/lib/chef/knife/openstack_server_create.rb +57 -56
- data/lib/chef/knife/openstack_server_delete.rb +7 -6
- data/lib/chef/knife/openstack_server_list.rb +16 -15
- data/lib/chef/knife/openstack_server_show.rb +17 -16
- data/lib/chef/knife/openstack_volume_list.rb +10 -9
- data/lib/knife-openstack/version.rb +3 -2
- data/spec/functional/flavor_list_func_spec.rb +13 -12
- data/spec/functional/floating_ip_list_func_spec.rb +14 -13
- data/spec/functional/group_list_func_spec.rb +29 -28
- data/spec/functional/image_list_func_spec.rb +15 -14
- data/spec/functional/network_list_func_spec.rb +13 -12
- data/spec/functional/server_create_func_spec.rb +29 -28
- data/spec/functional/server_delete_func_spec.rb +18 -17
- data/spec/functional/server_list_func_spec.rb +43 -42
- data/spec/functional/server_show_func_spec.rb +7 -6
- data/spec/functional/volume_list_func_spec.rb +12 -11
- data/spec/integration/cleanup.rb +6 -5
- data/spec/integration/openstack_spec.rb +287 -286
- data/spec/spec_context.rb +10 -9
- data/spec/spec_helper.rb +38 -37
- data/spec/unit/openstack_flavor_list_spec.rb +6 -5
- data/spec/unit/openstack_floating_ip_allocate_spec.rb +14 -13
- data/spec/unit/openstack_floating_ip_associate_spec.rb +11 -10
- data/spec/unit/openstack_floating_ip_disassociate_spec.rb +12 -11
- data/spec/unit/openstack_floating_ip_list_spec.rb +6 -5
- data/spec/unit/openstack_floating_ip_release_spec.rb +13 -12
- data/spec/unit/openstack_group_list_spec.rb +11 -10
- data/spec/unit/openstack_image_list_spec.rb +6 -5
- data/spec/unit/openstack_network_list_spec.rb +8 -7
- data/spec/unit/openstack_server_create_spec.rb +131 -130
- data/spec/unit/openstack_server_delete_spec.rb +8 -7
- data/spec/unit/openstack_server_list_spec.rb +6 -5
- data/spec/unit/openstack_server_show_spec.rb +10 -9
- data/spec/unit/openstack_service_spec.rb +26 -25
- data/spec/unit/openstack_volume_list_spec.rb +6 -5
- metadata +9 -105
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Author:: Vasundhara Jagdale (<vasundhara.jagdale@clogeny.com>)
|
2
3
|
# Copyright:: Copyright (c) 2015 Chef Software, Inc.
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "chef/knife/cloud/list_resource_command"
|
6
|
+
require "chef/knife/openstack_helpers"
|
7
|
+
require "chef/knife/cloud/openstack_service_options"
|
7
8
|
|
8
9
|
class Chef
|
9
10
|
class Knife
|
@@ -12,16 +13,16 @@ class Chef
|
|
12
13
|
include OpenstackHelpers
|
13
14
|
include OpenstackServiceOptions
|
14
15
|
|
15
|
-
banner
|
16
|
+
banner "knife openstack floating_ip list (options)"
|
16
17
|
|
17
18
|
def before_exec_command
|
18
19
|
# set columns_with_info map
|
19
20
|
@columns_with_info = [
|
20
|
-
{ label:
|
21
|
-
{ label:
|
22
|
-
{ label:
|
23
|
-
{ label:
|
24
|
-
{ label:
|
21
|
+
{ label: "ID", key: "id" },
|
22
|
+
{ label: "Instance ID", key: "instance_id" },
|
23
|
+
{ label: "IP Address", key: "ip" },
|
24
|
+
{ label: "Fixed IP", key: "fixed_ip" },
|
25
|
+
{ label: "Floating IP Pool", key: "pool" },
|
25
26
|
]
|
26
27
|
end
|
27
28
|
|
@@ -1,11 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
#
|
2
3
|
# Author:: Vasundhara Jagdale (<vasundhara.jagdale@clogeny.com>)
|
3
4
|
# Copyright:: Copyright (c) 2015 Chef Software, Inc.
|
4
5
|
#
|
5
6
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "chef/knife/openstack_helpers"
|
8
|
+
require "chef/knife/cloud/openstack_service_options"
|
9
|
+
require "chef/knife/cloud/command"
|
9
10
|
|
10
11
|
class Chef
|
11
12
|
class Knife
|
@@ -14,16 +15,16 @@ class Chef
|
|
14
15
|
include OpenstackServiceOptions
|
15
16
|
include OpenstackHelpers
|
16
17
|
|
17
|
-
banner
|
18
|
+
banner "knife openstack floating_ip release ID [ID] (options)"
|
18
19
|
|
19
20
|
def execute_command
|
20
21
|
if @name_args[0]
|
21
22
|
response = service.release_address(@name_args[0])
|
22
23
|
if response && response.status == 202
|
23
|
-
ui.info
|
24
|
+
ui.info "Floating IP released successfully."
|
24
25
|
end
|
25
26
|
else
|
26
|
-
ui.error
|
27
|
+
ui.error "Please provide Floating IP to release."
|
27
28
|
exit 1
|
28
29
|
end
|
29
30
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "chef/knife/cloud/list_resource_command"
|
3
|
+
require "chef/knife/openstack_helpers"
|
4
|
+
require "chef/knife/cloud/openstack_service_options"
|
4
5
|
|
5
6
|
class Chef
|
6
7
|
class Knife
|
@@ -9,7 +10,7 @@ class Chef
|
|
9
10
|
include OpenstackHelpers
|
10
11
|
include OpenstackServiceOptions
|
11
12
|
|
12
|
-
banner
|
13
|
+
banner "knife openstack group list (options)"
|
13
14
|
|
14
15
|
def query_resource
|
15
16
|
@service.connection.security_groups
|
@@ -20,14 +21,14 @@ class Chef
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def list(security_groups)
|
23
|
-
if
|
24
|
+
if config[:format] == "summary"
|
24
25
|
group_list = [
|
25
|
-
ui.color(
|
26
|
-
ui.color(
|
27
|
-
ui.color(
|
28
|
-
ui.color(
|
29
|
-
ui.color(
|
30
|
-
ui.color(
|
26
|
+
ui.color("Name", :bold),
|
27
|
+
ui.color("Protocol", :bold),
|
28
|
+
ui.color("From", :bold),
|
29
|
+
ui.color("To", :bold),
|
30
|
+
ui.color("CIDR", :bold),
|
31
|
+
ui.color("Description", :bold),
|
31
32
|
]
|
32
33
|
security_groups.sort_by(&:name).each do |group|
|
33
34
|
group.security_group_rules.each do |rule|
|
@@ -36,7 +37,7 @@ class Chef
|
|
36
37
|
group_list << rule.ip_protocol
|
37
38
|
group_list << rule.from_port.to_s
|
38
39
|
group_list << rule.to_port.to_s
|
39
|
-
group_list << rule.ip_range[
|
40
|
+
group_list << rule.ip_range["cidr"]
|
40
41
|
group_list << group.description
|
41
42
|
end
|
42
43
|
end
|
@@ -1,19 +1,20 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "chef/knife/cloud/openstack_service_options"
|
2
3
|
|
3
4
|
class Chef
|
4
5
|
class Knife
|
5
6
|
class Cloud
|
6
7
|
module OpenstackHelpers
|
7
8
|
def primary_private_ip_address(addresses)
|
8
|
-
primary_network_ip_address(addresses,
|
9
|
+
primary_network_ip_address(addresses, "private")
|
9
10
|
end
|
10
11
|
|
11
12
|
def primary_public_ip_address(addresses)
|
12
|
-
primary_network_ip_address(addresses,
|
13
|
+
primary_network_ip_address(addresses, "public")
|
13
14
|
end
|
14
15
|
|
15
16
|
def primary_network_ip_address(addresses, network_name)
|
16
|
-
addresses[network_name].last[
|
17
|
+
addresses[network_name].last["addr"] if addresses[network_name] && !addresses[network_name].empty?
|
17
18
|
end
|
18
19
|
|
19
20
|
def create_service_instance
|
@@ -29,12 +30,12 @@ class Chef
|
|
29
30
|
if addresses[addresses.keys[0]] && addresses[addresses.keys[0]].size > 0
|
30
31
|
ips = addresses[addresses.keys[0]]
|
31
32
|
ips.each do |ip|
|
32
|
-
version =
|
33
|
-
version =
|
33
|
+
version = "IPv6" if ip["version"] == 6
|
34
|
+
version = "IPv4" if ip["version"] == 4
|
34
35
|
info << "#{addresses.keys[0]}:#{version}: #{ip['addr']}"
|
35
36
|
end
|
36
37
|
end
|
37
|
-
info.join(
|
38
|
+
info.join(" ")
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Author:: Prabhu Das (<prabhu.das@clogeny.com>)
|
2
3
|
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "chef/knife/cloud/list_resource_command"
|
6
|
+
require "chef/knife/openstack_helpers"
|
7
|
+
require "chef/knife/cloud/openstack_service_options"
|
7
8
|
|
8
9
|
class Chef
|
9
10
|
class Knife
|
@@ -12,10 +13,10 @@ class Chef
|
|
12
13
|
include OpenstackHelpers
|
13
14
|
include OpenstackServiceOptions
|
14
15
|
|
15
|
-
banner
|
16
|
+
banner "knife openstack image list (options)"
|
16
17
|
|
17
18
|
option :disable_filter,
|
18
|
-
long:
|
19
|
+
long: "--disable-filter",
|
19
20
|
description: "Disable filtering of the image list. Currently filters names ending with 'initrd' or 'kernel'",
|
20
21
|
boolean: true,
|
21
22
|
default: false
|
@@ -23,15 +24,15 @@ class Chef
|
|
23
24
|
def before_exec_command
|
24
25
|
# set resource_filters
|
25
26
|
unless config[:disable_filter]
|
26
|
-
@resource_filters = [{ attribute:
|
27
|
+
@resource_filters = [{ attribute: "name", regex: /initrd$|kernel$|loader$|virtual$|vmlinuz$/ }]
|
27
28
|
end
|
28
29
|
# set columns_with_info map
|
29
30
|
@columns_with_info = [
|
30
|
-
{ label:
|
31
|
-
{ label:
|
32
|
-
{ label:
|
31
|
+
{ label: "Name", key: "name" },
|
32
|
+
{ label: "ID", key: "id" },
|
33
|
+
{ label: "Snapshot", key: "metadata", value_callback: method(:is_image_snapshot) },
|
33
34
|
]
|
34
|
-
@sort_by_field =
|
35
|
+
@sort_by_field = "name"
|
35
36
|
end
|
36
37
|
|
37
38
|
def query_resource
|
@@ -39,10 +40,10 @@ class Chef
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def is_image_snapshot(metadata)
|
42
|
-
snapshot =
|
43
|
+
snapshot = "no"
|
43
44
|
metadata.each do |datum|
|
44
|
-
if (datum.key ==
|
45
|
-
snapshot =
|
45
|
+
if (datum.key == "image_type") && (datum.value == "snapshot")
|
46
|
+
snapshot = "yes"
|
46
47
|
end
|
47
48
|
end
|
48
49
|
snapshot
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Author:: Prabhu Das (<prabhu.das@clogeny.com>)
|
2
3
|
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require "chef/knife/cloud/list_resource_command"
|
6
|
+
require "chef/knife/openstack_helpers"
|
7
|
+
require "chef/knife/cloud/openstack_service_options"
|
7
8
|
|
8
9
|
class Chef
|
9
10
|
class Knife
|
@@ -12,17 +13,17 @@ class Chef
|
|
12
13
|
include OpenstackHelpers
|
13
14
|
include OpenstackServiceOptions
|
14
15
|
|
15
|
-
banner
|
16
|
+
banner "knife openstack network list (options)"
|
16
17
|
|
17
18
|
def before_exec_command
|
18
19
|
# set columns_with_info map
|
19
20
|
@columns_with_info = [
|
20
|
-
{ label:
|
21
|
-
{ label:
|
22
|
-
{ label:
|
23
|
-
{ label:
|
21
|
+
{ label: "Name", key: "name" },
|
22
|
+
{ label: "ID", key: "id" },
|
23
|
+
{ label: "Tenant", key: "tenant_id" },
|
24
|
+
{ label: "Shared", key: "shared" },
|
24
25
|
]
|
25
|
-
@sort_by_field =
|
26
|
+
@sort_by_field = "name"
|
26
27
|
end
|
27
28
|
|
28
29
|
def query_resource
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
#
|
2
3
|
# Author:: Seth Chisamore (<schisamo@getchef.com>)
|
3
4
|
# Author:: Matt Ray (<matt@getchef.com>)
|
@@ -18,12 +19,12 @@
|
|
18
19
|
# limitations under the License.
|
19
20
|
#
|
20
21
|
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
22
|
+
require "chef/knife/cloud/server/create_command"
|
23
|
+
require "chef/knife/openstack_helpers"
|
24
|
+
require "chef/knife/cloud/openstack_server_create_options"
|
25
|
+
require "chef/knife/cloud/openstack_service"
|
26
|
+
require "chef/knife/cloud/openstack_service_options"
|
27
|
+
require "chef/knife/cloud/exceptions"
|
27
28
|
|
28
29
|
class Chef
|
29
30
|
class Knife
|
@@ -33,7 +34,7 @@ class Chef
|
|
33
34
|
include OpenstackServerCreateOptions
|
34
35
|
include OpenstackServiceOptions
|
35
36
|
|
36
|
-
banner
|
37
|
+
banner "knife openstack server create (options)"
|
37
38
|
|
38
39
|
def before_exec_command
|
39
40
|
super
|
@@ -46,11 +47,11 @@ class Chef
|
|
46
47
|
:flavor_ref => service.get_flavor(locate_config_value(:flavor)).id,
|
47
48
|
:security_groups => locate_config_value(:openstack_security_groups),
|
48
49
|
:availability_zone => locate_config_value(:availability_zone),
|
49
|
-
|
50
|
+
"os:scheduler_hints" => locate_config_value(:openstack_scheduler_hints),
|
50
51
|
:metadata => locate_config_value(:metadata),
|
51
|
-
:key_name => locate_config_value(:openstack_ssh_key_id)
|
52
|
+
:key_name => locate_config_value(:openstack_ssh_key_id),
|
52
53
|
},
|
53
|
-
server_create_timeout: locate_config_value(:server_create_timeout)
|
54
|
+
server_create_timeout: locate_config_value(:server_create_timeout),
|
54
55
|
}
|
55
56
|
unless locate_config_value(:openstack_volumes).nil?
|
56
57
|
counter = 99
|
@@ -59,53 +60,53 @@ class Chef
|
|
59
60
|
{
|
60
61
|
volume_id: vol,
|
61
62
|
delete_on_termination: false,
|
62
|
-
device_name:
|
63
|
-
volume_size: nil
|
63
|
+
device_name: "/dev/vd" + counter.chr,
|
64
|
+
volume_size: nil,
|
64
65
|
}
|
65
66
|
end
|
66
67
|
end
|
67
68
|
|
68
|
-
@create_options[:server_def]
|
69
|
-
@create_options[:server_def]
|
69
|
+
@create_options[:server_def][:user_data] = locate_config_value(:user_data) if locate_config_value(:user_data)
|
70
|
+
@create_options[:server_def][:nics] = locate_config_value(:network_ids).map { |nic| nic_id = { "net_id" => nic } } if locate_config_value(:network_ids)
|
70
71
|
|
71
72
|
Chef::Log.debug("Create server params - server_def = #{@create_options[:server_def]}")
|
72
73
|
# set columns_with_info map
|
73
74
|
@columns_with_info = [
|
74
|
-
{ label:
|
75
|
-
{ label:
|
76
|
-
{ label:
|
77
|
-
{ label:
|
78
|
-
{ label:
|
79
|
-
{ label:
|
80
|
-
{ label:
|
81
|
-
{ label:
|
82
|
-
{ label:
|
75
|
+
{ label: "Instance ID", key: "id" },
|
76
|
+
{ label: "Name", key: "name" },
|
77
|
+
{ label: "Public IP", key: "addresses", value_callback: method(:primary_public_ip_address) },
|
78
|
+
{ label: "Private IP", key: "addresses", value_callback: method(:primary_private_ip_address) },
|
79
|
+
{ label: "Flavor", key: "flavor", value_callback: method(:get_id) },
|
80
|
+
{ label: "Image", key: "image", value_callback: method(:get_id) },
|
81
|
+
{ label: "Keypair", key: "key_name" },
|
82
|
+
{ label: "State", key: "state" },
|
83
|
+
{ label: "Availability Zone", key: "availability_zone" },
|
83
84
|
]
|
84
85
|
end
|
85
86
|
|
86
87
|
def get_id(value)
|
87
|
-
value[
|
88
|
+
value["id"]
|
88
89
|
end
|
89
90
|
|
90
91
|
# Setup the floating ip after server creation.
|
91
92
|
def after_exec_command
|
92
93
|
Chef::Log.debug("Addresses #{server.addresses}")
|
93
|
-
msg_pair(
|
94
|
-
msg_pair(
|
94
|
+
msg_pair("Public IP Address", primary_public_ip_address(server.addresses)) if primary_public_ip_address(server.addresses)
|
95
|
+
msg_pair("Private IP Address", primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses)
|
95
96
|
|
96
97
|
floating_address = locate_config_value(:openstack_floating_ip)
|
97
98
|
bind_ip = primary_network_ip_address(server.addresses, server.addresses.keys[0])
|
98
99
|
Chef::Log.debug("Floating IP Address requested #{floating_address}")
|
99
|
-
unless
|
100
|
+
unless floating_address == "-1" # no floating IP requested
|
100
101
|
addresses = service.connection.addresses
|
101
102
|
# floating requested without value
|
102
103
|
if floating_address.nil?
|
103
104
|
free_floating = addresses.find_index { |a| a.fixed_ip.nil? }
|
104
105
|
begin
|
105
106
|
if free_floating.nil? # no free floating IP found
|
106
|
-
error_message =
|
107
|
+
error_message = "Unable to assign a Floating IP from allocated IPs."
|
107
108
|
ui.fatal(error_message)
|
108
|
-
|
109
|
+
raise CloudExceptions::ServerSetupError, error_message
|
109
110
|
else
|
110
111
|
floating_address = addresses[free_floating].ip
|
111
112
|
end
|
@@ -116,22 +117,22 @@ class Chef
|
|
116
117
|
end
|
117
118
|
|
118
119
|
# Pull the port_id for the associate_floating_ip
|
119
|
-
port_id = @service.network.list_ports[:body][
|
120
|
-
fixed_ip_address = service.network.list_ports[:body][
|
120
|
+
port_id = @service.network.list_ports[:body]["ports"].find { |x| x["fixed_ips"][0]["ip_address"] == bind_ip }["id"]
|
121
|
+
fixed_ip_address = service.network.list_ports[:body]["ports"].find { |x| x["id"] == port_id }["fixed_ips"][0]["ip_address"]
|
121
122
|
|
122
123
|
floating_ip_id = get_floating_ip_id(floating_address)
|
123
124
|
# Associate the floating ip via the neutron/network api
|
124
125
|
@service.network.associate_floating_ip(floating_ip_id, port_id, fixed_ip_address: fixed_ip_address)
|
125
126
|
|
126
127
|
# a bit of a hack, but server.reload takes a long time
|
127
|
-
(server.addresses[
|
128
|
-
msg_pair(
|
128
|
+
(server.addresses["public"] ||= []) << { "version" => 4, "addr" => floating_address }
|
129
|
+
msg_pair("Floating IP Address", floating_address)
|
129
130
|
end
|
130
131
|
|
131
132
|
Chef::Log.debug("Addresses #{server.addresses}")
|
132
133
|
Chef::Log.debug("Public IP Address actual: #{primary_public_ip_address(server.addresses)}") if primary_public_ip_address(server.addresses)
|
133
134
|
|
134
|
-
msg_pair(
|
135
|
+
msg_pair("Private IP Address", primary_private_ip_address(server.addresses)) if primary_private_ip_address(server.addresses)
|
135
136
|
super
|
136
137
|
end
|
137
138
|
|
@@ -144,13 +145,13 @@ class Chef
|
|
144
145
|
# The bootstrap network is always initialised to 'public' when a network name isn't specified. Therefore,
|
145
146
|
# only set the bootstrap network to 'private' if still initialised to public and nothing was specified for
|
146
147
|
# the private network name.
|
147
|
-
config[:bootstrap_network] =
|
148
|
+
config[:bootstrap_network] = "private" if config[:private_network] && config[:bootstrap_network] == "public"
|
148
149
|
|
149
150
|
# Which IP address to bootstrap
|
150
151
|
unless config[:network] # --no-network
|
151
152
|
bootstrap_ip_address = primary_public_ip_address(server.addresses) ||
|
152
|
-
|
153
|
-
|
153
|
+
primary_private_ip_address(server.addresses) ||
|
154
|
+
server.addresses.first[1][0]["addr"]
|
154
155
|
Chef::Log.debug("No Bootstrap Network: #{config[:bootstrap_network]}")
|
155
156
|
else
|
156
157
|
bootstrap_ip_address = primary_network_ip_address(server.addresses, config[:bootstrap_network])
|
@@ -159,14 +160,14 @@ class Chef
|
|
159
160
|
|
160
161
|
Chef::Log.debug("Bootstrap IP Address: #{bootstrap_ip_address}")
|
161
162
|
if bootstrap_ip_address.nil?
|
162
|
-
error_message =
|
163
|
+
error_message = "No IP address available for bootstrapping."
|
163
164
|
ui.error(error_message)
|
164
|
-
|
165
|
+
raise CloudExceptions::BootstrapError, error_message
|
165
166
|
end
|
166
167
|
config[:bootstrap_ip_address] = bootstrap_ip_address
|
167
168
|
|
168
169
|
config[:hints] ||= {}
|
169
|
-
config[:hints][
|
170
|
+
config[:hints]["openstack"] ||= {}
|
170
171
|
end
|
171
172
|
|
172
173
|
def validate_params!
|
@@ -175,17 +176,17 @@ class Chef
|
|
175
176
|
|
176
177
|
errors = []
|
177
178
|
|
178
|
-
if locate_config_value(:bootstrap_protocol) ==
|
179
|
+
if locate_config_value(:bootstrap_protocol) == "winrm"
|
179
180
|
if locate_config_value(:winrm_password).nil?
|
180
|
-
errors <<
|
181
|
+
errors << "You must provide Winrm Password."
|
181
182
|
end
|
182
|
-
elsif locate_config_value(:bootstrap_protocol) !=
|
183
|
-
errors <<
|
183
|
+
elsif locate_config_value(:bootstrap_protocol) != "ssh"
|
184
|
+
errors << "You must provide a valid bootstrap protocol. options [ssh/winrm]. For linux type images, options [ssh]"
|
184
185
|
end
|
185
186
|
|
186
|
-
errors <<
|
187
|
-
error_message =
|
188
|
-
|
187
|
+
errors << "You must provide --image-os-type option [windows/linux]" unless %w{windows linux}.include?(locate_config_value(:image_os_type))
|
188
|
+
error_message = ""
|
189
|
+
raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
|
189
190
|
end
|
190
191
|
|
191
192
|
def is_image_valid?
|
@@ -199,7 +200,7 @@ class Chef
|
|
199
200
|
def is_floating_ip_valid?
|
200
201
|
address = locate_config_value(:openstack_floating_ip)
|
201
202
|
|
202
|
-
return true if address ==
|
203
|
+
return true if address == "-1" # no floating IP requested
|
203
204
|
|
204
205
|
addresses = service.connection.addresses
|
205
206
|
return false if addresses.empty? # no floating IPs
|
@@ -222,20 +223,20 @@ class Chef
|
|
222
223
|
|
223
224
|
def post_connection_validations
|
224
225
|
errors = []
|
225
|
-
errors <<
|
226
|
-
errors <<
|
227
|
-
errors <<
|
228
|
-
error_message =
|
229
|
-
|
226
|
+
errors << "You have not provided a valid image ID. Please note the options for this value are -I or --image." unless is_image_valid?
|
227
|
+
errors << "You have not provided a valid flavor ID. Please note the options for this value are -f or --flavor." unless is_flavor_valid?
|
228
|
+
errors << "You have either requested an invalid floating IP address or none are available." unless is_floating_ip_valid?
|
229
|
+
error_message = ""
|
230
|
+
raise CloudExceptions::ValidationError, error_message if errors.each { |e| ui.error(e); error_message = "#{error_message} #{e}." }.any?
|
230
231
|
end
|
231
232
|
|
232
233
|
def get_floating_ip_id(floating_address)
|
233
234
|
# required for this method to work
|
234
235
|
floating_ip_id = -1
|
235
236
|
# Figure out the id for the port that the floating ip you requested
|
236
|
-
@service.network.list_floating_ips[:body][
|
237
|
-
if x[
|
238
|
-
floating_ip_id = x[
|
237
|
+
@service.network.list_floating_ips[:body]["floatingips"].each do |x|
|
238
|
+
if x["floating_ip_address"] == floating_address
|
239
|
+
floating_ip_id = x["id"]
|
239
240
|
end
|
240
241
|
end
|
241
242
|
floating_ip_id
|