knife-openstack 0.10.0 → 1.0.0.rc1
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/.gitignore +22 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +20 -22
- data/Gemfile +11 -1
- data/README.md +6 -4
- data/Rakefile +33 -0
- data/knife-openstack.gemspec +7 -8
- data/lib/chef/knife/cloud/openstack_server_create_options.rb +75 -0
- data/lib/chef/knife/cloud/openstack_service.rb +62 -0
- data/lib/chef/knife/cloud/openstack_service_options.rb +50 -0
- data/lib/chef/knife/openstack_flavor_list.rb +37 -51
- data/lib/chef/knife/openstack_group_list.rb +38 -45
- data/lib/chef/knife/openstack_helpers.rb +30 -0
- data/lib/chef/knife/openstack_image_list.rb +42 -59
- data/lib/chef/knife/openstack_network_list.rb +25 -21
- data/lib/chef/knife/openstack_server_create.rb +166 -452
- data/lib/chef/knife/openstack_server_delete.rb +26 -106
- data/lib/chef/knife/openstack_server_list.rb +37 -59
- data/lib/chef/knife/openstack_server_show.rb +57 -0
- data/lib/knife-openstack/version.rb +1 -1
- data/spec/functional/flavor_list_func_spec.rb +45 -0
- data/spec/functional/group_list_func_spec.rb +67 -0
- data/spec/functional/image_list_func_spec.rb +51 -0
- data/spec/functional/network_list_func_spec.rb +44 -0
- data/spec/functional/server_create_func_spec.rb +118 -0
- data/spec/functional/server_delete_func_spec.rb +84 -0
- data/spec/functional/server_list_func_spec.rb +95 -0
- data/spec/functional/server_show_func_spec.rb +46 -0
- data/spec/integration/cleanup.rb +91 -0
- data/spec/integration/config/environment.yml.sample +13 -0
- data/spec/integration/openstack_spec.rb +618 -0
- data/spec/spec_helper.rb +126 -0
- data/spec/unit/openstack_flavor_list_spec.rb +30 -0
- data/spec/unit/openstack_group_list_spec.rb +43 -0
- data/spec/unit/openstack_image_list_spec.rb +32 -0
- data/spec/unit/openstack_network_list_spec.rb +39 -0
- data/spec/unit/openstack_server_create_spec.rb +344 -182
- data/spec/unit/openstack_server_delete_spec.rb +43 -0
- data/spec/unit/openstack_server_list_spec.rb +32 -0
- data/spec/unit/openstack_server_show_spec.rb +42 -0
- data/spec/unit/openstack_service_spec.rb +89 -0
- data/spec/unit/validate_spec.rb +55 -0
- metadata +95 -51
- data/lib/chef/knife/openstack_base.rb +0 -182
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Ameya Varade (<ameya.varade@clogeny.com>)
|
3
|
+
# Copyright:: Copyright (c) 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
|
+
require 'spec_helper'
|
19
|
+
require 'chef/knife/openstack_network_list'
|
20
|
+
require 'chef/knife/cloud/openstack_service'
|
21
|
+
require 'support/shared_examples_for_command'
|
22
|
+
|
23
|
+
describe Chef::Knife::Cloud::OpenstackNetworkList do
|
24
|
+
let (:instance) {Chef::Knife::Cloud::OpenstackNetworkList.new}
|
25
|
+
|
26
|
+
context "functionality" do
|
27
|
+
before do
|
28
|
+
resources = [ TestResource.new({:id => "resource-1", :name => "external", :tenant_id => "1", :shared => true}),
|
29
|
+
TestResource.new({:id => "resource-2", :name => "internal", :tenant_id => "2", :shared => false})
|
30
|
+
]
|
31
|
+
allow(instance).to receive(:query_resource).and_return(resources)
|
32
|
+
allow(instance).to receive(:puts)
|
33
|
+
allow(instance).to receive(:create_service_instance).and_return(Chef::Knife::Cloud::Service.new)
|
34
|
+
allow(instance).to receive(:validate!)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "lists formatted list of network resources" do
|
38
|
+
expect(instance.ui).to receive(:list).with(["Name", "ID", "Tenant", "Shared",
|
39
|
+
"external", "resource-1", "1", "true",
|
40
|
+
"internal", "resource-2", "2", "false"], :uneven_columns_across, 4)
|
41
|
+
instance.run
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Mukta Aphale (<mukta.aphale@clogeny.com>)
|
3
|
+
# Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
|
4
|
+
# Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
|
5
|
+
# Author:: Prabhu Das (<prabhu.das@clogeny.com>)
|
6
|
+
# Author:: Ameya Varade (<ameya.varade@clogeny.com>)
|
7
|
+
# Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
|
8
|
+
# License:: Apache License, Version 2.0
|
9
|
+
#
|
10
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
+
# you may not use this file except in compliance with the License.
|
12
|
+
# You may obtain a copy of the License at
|
13
|
+
#
|
14
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
#
|
16
|
+
# Unless required by applicable law or agreed to in writing, software
|
17
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
+
# See the License for the specific language governing permissions and
|
20
|
+
# limitations under the License.
|
21
|
+
|
22
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
23
|
+
|
24
|
+
describe Chef::Knife::Cloud::OpenstackServerCreate do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@knife_openstack_create = Chef::Knife::Cloud::OpenstackServerCreate.new
|
28
|
+
{
|
29
|
+
:image => 'image',
|
30
|
+
:openstack_username => 'openstack_username',
|
31
|
+
:openstack_password => 'openstack_password',
|
32
|
+
:openstack_auth_url => 'openstack_auth_url',
|
33
|
+
:server_create_timeout => 1000
|
34
|
+
}.each do |key, value|
|
35
|
+
Chef::Config[:knife][key] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
@openstack_service = Chef::Knife::Cloud::OpenstackService.new
|
39
|
+
allow(@openstack_service).to receive(:msg_pair)
|
40
|
+
allow(@openstack_service).to receive(:print)
|
41
|
+
image = Object.new
|
42
|
+
allow(image).to receive(:id).and_return('image_id')
|
43
|
+
allow(@openstack_service).to receive(:get_image).and_return(image)
|
44
|
+
flavor = Object.new
|
45
|
+
allow(flavor).to receive(:id).and_return('flavor_id')
|
46
|
+
allow(@openstack_service).to receive(:get_flavor).and_return(flavor)
|
47
|
+
|
48
|
+
allow(@knife_openstack_create).to receive(:create_service_instance).and_return(@openstack_service)
|
49
|
+
allow(@knife_openstack_create).to receive(:puts)
|
50
|
+
@new_openstack_server = double()
|
51
|
+
|
52
|
+
@openstack_server_attribs = { :name => 'Mock Server',
|
53
|
+
:id => 'id-123456',
|
54
|
+
:key_name => 'key_name',
|
55
|
+
:flavor => 'flavor_id',
|
56
|
+
:image => 'image_id',
|
57
|
+
:addresses => {
|
58
|
+
'public' => [{'addr' => '75.101.253.10'}],
|
59
|
+
'private' => [{'addr' => '10.251.75.20'}]
|
60
|
+
},
|
61
|
+
:password => 'password'
|
62
|
+
}
|
63
|
+
|
64
|
+
@openstack_server_attribs.each_pair do |attrib, value|
|
65
|
+
allow(@new_openstack_server).to receive(attrib).and_return(value)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "run" do
|
70
|
+
before(:each) do
|
71
|
+
allow(@knife_openstack_create).to receive(:validate_params!)
|
72
|
+
allow(Fog::Compute::OpenStack).to receive_message_chain(:new, :servers, :create).and_return(@new_openstack_server)
|
73
|
+
@knife_openstack_create.config[:openstack_floating_ip] = '-1'
|
74
|
+
allow(@new_openstack_server).to receive(:wait_for)
|
75
|
+
end
|
76
|
+
|
77
|
+
context "for Linux" do
|
78
|
+
before do
|
79
|
+
@config = {:openstack_floating_ip=>"-1", :bootstrap_ip_address => "75.101.253.10", :ssh_password=>"password"}
|
80
|
+
@knife_openstack_create.config[:distro] = 'chef-full'
|
81
|
+
@bootstrapper = Chef::Knife::Cloud::Bootstrapper.new(@config)
|
82
|
+
@ssh_bootstrap_protocol = Chef::Knife::Cloud::SshBootstrapProtocol.new(@config)
|
83
|
+
@unix_distribution = Chef::Knife::Cloud::UnixDistribution.new(@config)
|
84
|
+
allow(@ssh_bootstrap_protocol).to receive(:send_bootstrap_command)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "Creates an OpenStack instance and bootstraps it" do
|
88
|
+
expect(Chef::Knife::Cloud::Bootstrapper).to receive(:new).with(@config).and_return(@bootstrapper)
|
89
|
+
allow(@bootstrapper).to receive(:bootstrap).and_call_original
|
90
|
+
expect(@bootstrapper).to receive(:create_bootstrap_protocol).and_return(@ssh_bootstrap_protocol)
|
91
|
+
expect(@bootstrapper).to receive(:create_bootstrap_distribution).and_return(@unix_distribution)
|
92
|
+
expect(@openstack_service).to receive(:server_summary).exactly(2).times
|
93
|
+
@knife_openstack_create.run
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "for Windows" do
|
98
|
+
before do
|
99
|
+
@config = {:openstack_floating_ip=>"-1", :image_os_type => 'windows', :bootstrap_ip_address => "75.101.253.10", :bootstrap_protocol => 'winrm', :ssh_password=>"password"}
|
100
|
+
@knife_openstack_create.config[:image_os_type] = 'windows'
|
101
|
+
@knife_openstack_create.config[:bootstrap_protocol] = 'winrm'
|
102
|
+
@knife_openstack_create.config[:distro] = 'windows-chef-client-msi'
|
103
|
+
@bootstrapper = Chef::Knife::Cloud::Bootstrapper.new(@config)
|
104
|
+
@winrm_bootstrap_protocol = Chef::Knife::Cloud::WinrmBootstrapProtocol.new(@config)
|
105
|
+
@windows_distribution = Chef::Knife::Cloud::WindowsDistribution.new(@config)
|
106
|
+
end
|
107
|
+
it "Creates an OpenStack instance for Windows and bootstraps it" do
|
108
|
+
expect(Chef::Knife::Cloud::Bootstrapper).to receive(:new).with(@config).and_return(@bootstrapper)
|
109
|
+
allow(@bootstrapper).to receive(:bootstrap).and_call_original
|
110
|
+
expect(@bootstrapper).to receive(:create_bootstrap_protocol).and_return(@winrm_bootstrap_protocol)
|
111
|
+
expect(@bootstrapper).to receive(:create_bootstrap_distribution).and_return(@windows_distribution)
|
112
|
+
allow(@winrm_bootstrap_protocol).to receive(:send_bootstrap_command)
|
113
|
+
expect(@openstack_service).to receive(:server_summary).exactly(2).times
|
114
|
+
@knife_openstack_create.run
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
|
3
|
+
# Author:: Prabhu Das (<prabhu.das@clogeny.com>)
|
4
|
+
# Author:: Ameya Varade (<ameya.varade@clogeny.com>)
|
5
|
+
# Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
|
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
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
21
|
+
require 'chef/knife/openstack_server_delete'
|
22
|
+
require 'chef/knife/cloud/openstack_service'
|
23
|
+
|
24
|
+
describe Chef::Knife::Cloud::OpenstackServerDelete do
|
25
|
+
|
26
|
+
before do
|
27
|
+
@openstack_connection = double(Fog::Compute::OpenStack)
|
28
|
+
@chef_node = double(Chef::Node)
|
29
|
+
@chef_client = double(Chef::ApiClient)
|
30
|
+
@knife_openstack_delete = Chef::Knife::Cloud::OpenstackServerDelete.new
|
31
|
+
{
|
32
|
+
:openstack_username => 'openstack_username',
|
33
|
+
:openstack_password => 'openstack_password',
|
34
|
+
:openstack_auth_url => 'openstack_auth_url'
|
35
|
+
}.each do |key, value|
|
36
|
+
Chef::Config[:knife][key] = value
|
37
|
+
end
|
38
|
+
|
39
|
+
@openstack_service = Chef::Knife::Cloud::OpenstackService.new
|
40
|
+
allow(@openstack_service).to receive(:msg_pair)
|
41
|
+
allow(@knife_openstack_delete).to receive(:create_service_instance).and_return(@openstack_service)
|
42
|
+
allow(@knife_openstack_delete.ui).to receive(:warn)
|
43
|
+
allow(@knife_openstack_delete.ui).to receive(:confirm)
|
44
|
+
@openstack_servers = double()
|
45
|
+
@running_openstack_server = double()
|
46
|
+
@openstack_server_attribs = { :name => 'Mock Server',
|
47
|
+
:id => 'id-123456',
|
48
|
+
:flavor => 'flavor_id',
|
49
|
+
:image => 'image_id',
|
50
|
+
:addresses => {
|
51
|
+
'public' => [{'addr' => '75.101.253.10'}],
|
52
|
+
'private' => [{'addr' => '10.251.75.20'}]
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
@openstack_server_attribs.each_pair do |attrib, value|
|
57
|
+
allow(@running_openstack_server).to receive(attrib).and_return(value)
|
58
|
+
end
|
59
|
+
@knife_openstack_delete.name_args = ['test001']
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "run" do
|
63
|
+
it "deletes an OpenStack instance." do
|
64
|
+
expect(@openstack_servers).to receive(:get).and_return(@running_openstack_server)
|
65
|
+
expect(@openstack_connection).to receive(:servers).and_return(@openstack_servers)
|
66
|
+
expect(Fog::Compute::OpenStack).to receive(:new).and_return(@openstack_connection)
|
67
|
+
expect(@running_openstack_server).to receive(:destroy)
|
68
|
+
@knife_openstack_delete.run
|
69
|
+
end
|
70
|
+
|
71
|
+
it "deletes the instance along with the node and client on the chef-server when --purge is given as an option." do
|
72
|
+
@knife_openstack_delete.config[:purge] = true
|
73
|
+
expect(Chef::Node).to receive(:load).and_return(@chef_node)
|
74
|
+
expect(@chef_node).to receive(:destroy)
|
75
|
+
expect(Chef::ApiClient).to receive(:load).and_return(@chef_client)
|
76
|
+
expect(@chef_client).to receive(:destroy)
|
77
|
+
expect(@openstack_servers).to receive(:get).and_return(@running_openstack_server)
|
78
|
+
expect(@openstack_connection).to receive(:servers).and_return(@openstack_servers)
|
79
|
+
expect(Fog::Compute::OpenStack).to receive(:new).and_return(@openstack_connection)
|
80
|
+
expect(@running_openstack_server).to receive(:destroy)
|
81
|
+
@knife_openstack_delete.run
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Mukta Aphale (<mukta.aphale@clogeny.com>)
|
3
|
+
# Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
|
4
|
+
# Author:: Prabhu Das (<prabhu.das@clogeny.com>)
|
5
|
+
# Author:: Ameya Varade (<ameya.varade@clogeny.com>)
|
6
|
+
# Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
|
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
|
+
require 'spec_helper'
|
22
|
+
require 'chef/knife/openstack_server_list'
|
23
|
+
require 'chef/knife/cloud/openstack_service'
|
24
|
+
|
25
|
+
describe Chef::Knife::Cloud::OpenstackServerList do
|
26
|
+
let (:instance) {Chef::Knife::Cloud::OpenstackServerList.new}
|
27
|
+
|
28
|
+
context "functionality" do
|
29
|
+
before do
|
30
|
+
@resources = [ TestResource.new({:id => "resource-1", :name => "ubuntu01", :availability_zone => "test zone", :addresses => {"public"=>[{"version"=>4, "addr"=>"172.31.6.132"}], "private"=>[{"version"=>4, "addr"=>"172.31.6.133"}]}, :flavor => {"id" => "1"}, :image => {"id" => "image1"}, :key_name => "keypair", :state => "ACTIVE"}),
|
31
|
+
TestResource.new({:id => "resource-2", :name => "windows2008",:availability_zone => "test zone", :addresses => {"public"=>[{"version"=>4, "addr"=>"172.31.6.132"}]}, :flavor => {"id" => "id2"}, :image => {"id" => "image2"}, :key_name => "keypair", :state => "ACTIVE"}),
|
32
|
+
TestResource.new({:id => "resource-3-err", :name => "windows2008", :availability_zone => "test zone", :addresses => {"public"=>[], "private"=>[]}, :flavor => {"id" => "id2"}, :image => {"id" => "image2"}, :key_name => "keypair", :state => "ERROR"})
|
33
|
+
]
|
34
|
+
allow(instance).to receive(:query_resource).and_return(@resources)
|
35
|
+
allow(instance).to receive(:puts)
|
36
|
+
allow(instance).to receive(:create_service_instance).and_return(Chef::Knife::Cloud::FogService.new)
|
37
|
+
allow(instance).to receive(:validate!)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "lists formatted list of resources" do
|
41
|
+
expect(instance.ui).to receive(:list).with(["Name", "Instance ID", "Public IP", "Private IP", "Flavor", "Image", "Keypair", "State", "Availability Zone",
|
42
|
+
"ubuntu01", "resource-1", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone",
|
43
|
+
"windows2008", "resource-2", "172.31.6.132", nil, "id2", "image2", "keypair", "ACTIVE", "test zone", "windows2008", "resource-3-err", nil, nil, "id2", "image2", "keypair", "ERROR", "test zone"], :uneven_columns_across, 9)
|
44
|
+
instance.run
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when chef-data and chef-node-attribute set" do
|
48
|
+
before(:each) do
|
49
|
+
@resources.push(TestResource.new({:id => "server-4", :name => "server-4", :availability_zone => "test zone", :addresses => {"public"=>[{"version"=>4, "addr"=>"172.31.6.132"}], "private"=>[{"version"=>4, "addr"=>"172.31.6.133"}]}, :flavor => {"id" => "1"}, :image => {"id" => "image1"}, :key_name => "keypair", :state => "ACTIVE"}))
|
50
|
+
@node = TestResource.new({:id => "server-4", :name => "server-4", :chef_environment => "_default", :fqdn => "testfqdnnode.us", :run_list => [], :tags => [], :platform => "ubuntu", :platform_family => "debian"})
|
51
|
+
allow(Chef::Node).to receive(:list).and_return({"server-4" => @node})
|
52
|
+
instance.config[:chef_data] = true
|
53
|
+
end
|
54
|
+
|
55
|
+
it "lists formatted list of resources on chef data option set" do
|
56
|
+
expect(instance.ui).to receive(:list).with(["Name", "Instance ID", "Public IP", "Private IP", "Flavor", "Image", "Keypair", "State", "Availability Zone", "Chef Node Name", "Environment", "FQDN", "Runlist", "Tags", "Platform",
|
57
|
+
"server-4", "server-4", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone", "server-4", "_default", "testfqdnnode.us", "[]", "[]", "ubuntu",
|
58
|
+
"ubuntu01", "resource-1", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone", "", "", "", "", "", "",
|
59
|
+
"windows2008", "resource-2", "172.31.6.132", nil, "id2", "image2", "keypair", "ACTIVE", "test zone", "", "", "", "", "", "",
|
60
|
+
"windows2008", "resource-3-err", nil, nil, "id2", "image2", "keypair", "ERROR", "test zone", "", "", "", "", "", ""], :uneven_columns_across, 15)
|
61
|
+
instance.run
|
62
|
+
end
|
63
|
+
|
64
|
+
it "lists formatted list of resources on chef-data and chef-node-attribute option set" do
|
65
|
+
instance.config[:chef_node_attribute] = "platform_family"
|
66
|
+
expect(@node).to receive(:attribute?).with("platform_family").and_return(true)
|
67
|
+
expect(instance.ui).to receive(:list).with(["Name", "Instance ID", "Public IP", "Private IP", "Flavor", "Image", "Keypair", "State", "Availability Zone", "Chef Node Name", "Environment", "FQDN", "Runlist", "Tags", "Platform", "platform_family",
|
68
|
+
"server-4", "server-4", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone", "server-4", "_default", "testfqdnnode.us", "[]", "[]", "ubuntu", "debian",
|
69
|
+
"ubuntu01", "resource-1", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone", "", "", "", "", "", "", "",
|
70
|
+
"windows2008", "resource-2", "172.31.6.132", nil, "id2", "image2", "keypair", "ACTIVE", "test zone", "", "", "", "", "", "", "",
|
71
|
+
"windows2008", "resource-3-err", nil, nil, "id2", "image2", "keypair", "ERROR", "test zone", "", "", "", "", "", "", ""], :uneven_columns_across, 16)
|
72
|
+
instance.run
|
73
|
+
end
|
74
|
+
|
75
|
+
it "raise error on invalid chef-node-attribute set" do
|
76
|
+
instance.config[:chef_node_attribute] = "invalid_attribute"
|
77
|
+
expect(instance.ui).to receive(:fatal)
|
78
|
+
expect(@node).to receive(:attribute?).with("invalid_attribute").and_return(false)
|
79
|
+
expect(instance.ui).to receive(:error).with("The Node does not have a invalid_attribute attribute.")
|
80
|
+
expect { instance.run }.to raise_error
|
81
|
+
end
|
82
|
+
|
83
|
+
it "not display chef-data on chef-node-attribute set but chef-data option missing" do
|
84
|
+
instance.config[:chef_data] = false
|
85
|
+
instance.config[:chef_node_attribute] = "platform_family"
|
86
|
+
expect(instance.ui).to receive(:list).with(["Name", "Instance ID", "Public IP", "Private IP", "Flavor", "Image", "Keypair", "State", "Availability Zone",
|
87
|
+
"server-4", "server-4", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone",
|
88
|
+
"ubuntu01", "resource-1", "172.31.6.132", "172.31.6.133", "1", "image1", "keypair", "ACTIVE", "test zone",
|
89
|
+
"windows2008", "resource-2", "172.31.6.132", nil, "id2", "image2", "keypair", "ACTIVE", "test zone",
|
90
|
+
"windows2008", "resource-3-err", nil, nil, "id2", "image2", "keypair", "ERROR", "test zone"], :uneven_columns_across, 9)
|
91
|
+
instance.run
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Ameya Varade (<ameya.varade@clogeny.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013-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
|
+
require 'spec_helper'
|
19
|
+
require 'chef/knife/openstack_server_show'
|
20
|
+
require 'chef/knife/cloud/openstack_service'
|
21
|
+
|
22
|
+
describe Chef::Knife::Cloud::OpenstackServerShow do
|
23
|
+
|
24
|
+
context "functionality" do
|
25
|
+
before do
|
26
|
+
@instance = Chef::Knife::Cloud::OpenstackServerShow.new
|
27
|
+
Chef::Config[:knife][:instance_id] = "instance_id"
|
28
|
+
@openstack_service = Chef::Knife::Cloud::OpenstackService.new
|
29
|
+
allow(@openstack_service).to receive(:msg_pair)
|
30
|
+
allow(@openstack_service).to receive(:print)
|
31
|
+
allow_message_expectations_on_nil
|
32
|
+
server = Object.new
|
33
|
+
conn = Object.new
|
34
|
+
conn.define_singleton_method(:servers){ }
|
35
|
+
allow(@openstack_service).to receive(:connection).and_return(conn)
|
36
|
+
expect(@openstack_service.connection.servers).to receive(:get).and_return(server)
|
37
|
+
allow(@instance).to receive(:create_service_instance).and_return(@openstack_service)
|
38
|
+
allow(@instance).to receive(:validate!)
|
39
|
+
expect(@openstack_service).to receive(:server_summary)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "runs server show successfully" do
|
43
|
+
@instance.run
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# Copyright: Copyright (c) 2013-2014 Chef Software, Inc.
|
2
|
+
# License: Apache License, Version 2.0
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
# Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
|
17
|
+
|
18
|
+
require 'mixlib/shellout'
|
19
|
+
|
20
|
+
module CleanupTestResources
|
21
|
+
def self.validate_params
|
22
|
+
unset_env_var = []
|
23
|
+
|
24
|
+
# OPENSTACK_USERNAME, OPENSTACK_PASSWORD and OPENSTACK_AUTH_URL are mandatory params to run knife openstack commands.
|
25
|
+
%w(OPENSTACK_USERNAME OPENSTACK_PASSWORD OPENSTACK_AUTH_URL).each do |os_env_var|
|
26
|
+
if ENV[os_env_var].nil?
|
27
|
+
unset_env_var << os_env_var
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
err_msg = "\nPlease set #{unset_env_var.join(', ')} environment"
|
32
|
+
err_msg = err_msg + ( unset_env_var.length > 1 ? " variables " : " variable " ) + "to cleanup test resources."
|
33
|
+
if ! unset_env_var.empty?
|
34
|
+
puts err_msg
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Use Mixlib::ShellOut to run knife openstack commands.
|
40
|
+
def self.run(command_line)
|
41
|
+
shell_out = Mixlib::ShellOut.new("#{command_line}")
|
42
|
+
shell_out.timeout = 3000
|
43
|
+
shell_out.run_command
|
44
|
+
return shell_out
|
45
|
+
end
|
46
|
+
|
47
|
+
# Use knife openstack to delete servers.
|
48
|
+
def self.cleanup_resources
|
49
|
+
|
50
|
+
delete_resources = []
|
51
|
+
|
52
|
+
# Openstack credentials use during knife openstack command run.
|
53
|
+
openstack_creds = "--openstack-username '#{ENV['OPENSTACK_USERNAME']}' --openstack-password '#{ENV['OPENSTACK_PASSWORD']}' --openstack-api-endpoint #{ENV['OPENSTACK_AUTH_URL']}"
|
54
|
+
|
55
|
+
# List all servers in openstack using knife openstack server list command.
|
56
|
+
list_command = "knife openstack server list #{openstack_creds}"
|
57
|
+
list_output = run(list_command)
|
58
|
+
|
59
|
+
# Check command exitstatus. Non zero exitstatus indicates command execution fails.
|
60
|
+
if list_output.exitstatus != 0
|
61
|
+
puts "Cleanup Test Resources failed. Please check Openstack user name, password and auth url are correct. Error: #{list_output.stderr}."
|
62
|
+
exit list_output.exitstatus
|
63
|
+
else
|
64
|
+
servers = list_output.stdout
|
65
|
+
end
|
66
|
+
|
67
|
+
# We use "os-integration-test-<platform>-<randomNumber>" pattern for server name during integration tests run. So use "os-integration-test-" pattern to find out servers created during integration tests run.
|
68
|
+
servers.each_line do |line|
|
69
|
+
if line.include?("os-integration-test-") || (line.include?("openstack-") && line.include?("opscode-ci-ssh"))
|
70
|
+
# Extract and add instance id of server to delete_resources list.
|
71
|
+
delete_resources << {"id" => line.split(" ").first, "name" => line.split(" ")[1]}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Delete servers
|
76
|
+
delete_resources.each do |resource|
|
77
|
+
delete_command = "knife openstack server delete #{resource['id']} #{openstack_creds} --yes"
|
78
|
+
delete_output = run(delete_command)
|
79
|
+
|
80
|
+
# check command exitstatus. Non zero exitstatus indicates command execution fails.
|
81
|
+
if delete_output.exitstatus != 0
|
82
|
+
puts "Unable to delete server #{resource['name']}: #{resource['id']}. Error: #{delete_output.stderr}."
|
83
|
+
else
|
84
|
+
puts "Deleted server #{resource['name']}: #{resource['id']}."
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
CleanupTestResources.validate_params
|
91
|
+
CleanupTestResources.cleanup_resources
|