cuken 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -1
- data/Gemfile.lock +8 -8
- data/VERSION +1 -1
- data/cuken.gemspec +19 -5
- data/features/about.md +110 -27
- data/features/chef_examples/cookbooks_cookbook.feature +2 -2
- data/features/chef_examples/zenoss/01_chef_server_setup.feature +205 -0
- data/features/chef_examples/zenoss/02_monitor_vm_setup.feature +139 -0
- data/features/chef_examples/zenoss/03_monitor_chef_setup.feature +109 -0
- data/features/step_definitions/cuken_steps.rb +16 -0
- data/features/support/env.rb +1 -0
- data/lib/cuken/api/chef/common.rb +20 -0
- data/lib/cuken/api/chef/cookbook.rb +62 -1
- data/lib/cuken/api/chef/data_bag.rb +89 -0
- data/lib/cuken/api/chef/knife.rb +16 -0
- data/lib/cuken/api/chef/role.rb +71 -0
- data/lib/cuken/api/chef.rb +51 -9
- data/lib/cuken/api/file.rb +68 -0
- data/lib/cuken/api/vagrant/common.rb +85 -0
- data/lib/cuken/api/vagrant/v_m.rb +125 -0
- data/lib/cuken/api/vagrant.rb +83 -0
- data/lib/cuken/chef.rb +16 -0
- data/lib/cuken/cucumber/chef/common.rb +4 -0
- data/lib/cuken/cucumber/chef/cookbook.rb +16 -2
- data/lib/cuken/cucumber/chef/data_bag.rb +48 -16
- data/lib/cuken/cucumber/chef/role.rb +30 -0
- data/lib/cuken/cucumber/chef.rb +16 -5
- data/lib/cuken/cucumber/cmd.rb +16 -0
- data/lib/cuken/cucumber/common.rb +16 -0
- data/lib/cuken/cucumber/file.rb +52 -0
- data/lib/cuken/cucumber/git/hooks.rb +28 -0
- data/lib/cuken/cucumber/rvm.rb +16 -0
- data/lib/cuken/cucumber/ssh/hooks.rb +31 -0
- data/lib/cuken/cucumber/ssh.rb +16 -0
- data/lib/cuken/cucumber/vagrant/common.rb +93 -0
- data/lib/cuken/cucumber/vagrant/hooks.rb +35 -0
- data/lib/cuken/cucumber/vagrant.rb +26 -0
- data/lib/cuken/vagrant.rb +19 -0
- metadata +18 -4
@@ -0,0 +1,139 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Zenoss Monitoring
|
3
|
+
In order to launch a Zenoss server
|
4
|
+
As a admin/developer
|
5
|
+
I want to define the VM configuration via executable features
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given the Chef root directory "/tmp/chef" exists
|
9
|
+
And the state of VM "chef" is "running"
|
10
|
+
And I switch Vagrant environment
|
11
|
+
And the Chef root directory "/tmp/monitor" exists
|
12
|
+
And the state of VM "monitor" is not "running"
|
13
|
+
|
14
|
+
Scenario: Clone a Chef skeleton repository
|
15
|
+
Given the remote Chef repository "git://github.com/cookbooks/chef-repo.git"
|
16
|
+
When I clone the remote Chef repository branch "master" to "monitor"
|
17
|
+
And the local Chef repository exists
|
18
|
+
Then I place all in "monitor" in "/tmp/monitor"
|
19
|
+
|
20
|
+
Scenario: Migrate the previously generated private keys
|
21
|
+
Then I successfully run `cp /tmp/chef/.chef/monitor.pem /tmp/monitor/.chef`
|
22
|
+
And I successfully run `cp /tmp/chef/.chef/monitor.pem /tmp/monitor/mnt/etc`
|
23
|
+
|
24
|
+
Scenario: Create some shared Vagrant configuration details
|
25
|
+
Given the directory "hobos"
|
26
|
+
And the file "hobos/vm.bo" contains nothing
|
27
|
+
When I write to "hobos/vm.bo":
|
28
|
+
"""
|
29
|
+
vm.customize do |cvm|
|
30
|
+
cvm.memory_size = 1024
|
31
|
+
cvm.vram_size = 12
|
32
|
+
cvm.cpu_count = 2
|
33
|
+
cvm.accelerate_3d_enabled = false
|
34
|
+
cvm.accelerate_2d_video_enabled = false
|
35
|
+
cvm.monitor_count = 1
|
36
|
+
|
37
|
+
cvm.bios.acpi_enabled = true
|
38
|
+
cvm.bios.io_apic_enabled = false
|
39
|
+
|
40
|
+
cvm.cpu.pae = true
|
41
|
+
|
42
|
+
cvm.hw_virt.enabled = false
|
43
|
+
cvm.hw_virt.nested_paging = false
|
44
|
+
# STORAGE
|
45
|
+
end
|
46
|
+
"""
|
47
|
+
And I place "hobos/vm.bo" in "/tmp/monitor"
|
48
|
+
|
49
|
+
Scenario: Create the Monitor Node's Vagrantfile
|
50
|
+
Given the file "Vagrantfile" contains nothing
|
51
|
+
When I write to "Vagrantfile":
|
52
|
+
"""
|
53
|
+
Vagrant::Config.run do |config|
|
54
|
+
|
55
|
+
@cc_root_path = File.dirname(File.absolute_path(__FILE__))
|
56
|
+
@cc_box_name = "monitor"
|
57
|
+
@cc_node_name = "monitor"
|
58
|
+
@cc_box_url = (Pathname(@cc_root_path) + 'lucid64.box').to_s
|
59
|
+
@cc_ip = "33.33.33.2"
|
60
|
+
@cc_http_port = 48625
|
61
|
+
@cc_ssh_port = 48624
|
62
|
+
@cc_chef_server_url = "http://33.33.33.254:4000"
|
63
|
+
@cc_host_mount = "#{@cc_root_path}/mnt"
|
64
|
+
@cc_chefserver_path = Pathname(@cc_root_path).parent + 'chef'
|
65
|
+
@cc_validation_key_path = "#{@cc_chefserver_path}/mnt/etc/validation.pem"
|
66
|
+
|
67
|
+
config.vm.define :monitor do |cfg|
|
68
|
+
|
69
|
+
cfg.send :eval, IO.read("#{@cc_root_path}/hobos/vm.bo")
|
70
|
+
|
71
|
+
cfg.vm.box = @cc_box_name
|
72
|
+
cfg.vm.box_url = @cc_box_url
|
73
|
+
cfg.vm.boot_mode = :vrdp # :vrdp (headless) or :gui
|
74
|
+
|
75
|
+
cfg.vm.network @cc_ip # host-only network IP
|
76
|
+
cfg.vm.forward_port "http", 80, @cc_http_port # Accessible outside the host-only network
|
77
|
+
cfg.vm.forward_port "ssh", 22, @cc_ssh_port, :auto => true
|
78
|
+
|
79
|
+
cfg.vm.share_folder("chef", "~/chef", "#{@cc_host_mount}/chef" )
|
80
|
+
cfg.vm.share_folder( "chef-client-etc", "/etc/chef", "#{@cc_host_mount}/etc", :nfs => false ) # name, /vm/path, /real/path
|
81
|
+
|
82
|
+
cfg.vm.provision :chef_server do |chef|
|
83
|
+
chef.log_level = :debug
|
84
|
+
chef.node_name = @cc_node_name
|
85
|
+
chef.chef_server_url = @cc_chef_server_url
|
86
|
+
chef.validation_key_path = @cc_validation_key_path
|
87
|
+
chef.validation_client_name = "chef-validator"
|
88
|
+
chef.client_key_path = "/etc/chef/monitor.pem"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
"""
|
93
|
+
And I place "Vagrantfile" in "/tmp/monitor"
|
94
|
+
And I run `bash -c 'cp ~/chef/vagrant/lucid64.box /tmp/monitor'`
|
95
|
+
|
96
|
+
Scenario: Configure Knife file for the Monitor's client certificate
|
97
|
+
Given the directory ".chef"
|
98
|
+
And a file named ".chef/knife.rb" with:
|
99
|
+
"""
|
100
|
+
current_dir = File.dirname(__FILE__)
|
101
|
+
user = ENV['CHEF_USER'] || ENV['OPSCODE_USER'] || ENV['USER'] || `whoami`
|
102
|
+
org = ENV['CHEF_ORGNAME'] || 'Private'
|
103
|
+
email = ENV['CHEF_EMAIL'] || "#{user}@mailinator.com"
|
104
|
+
log_path = "#{current_dir}/../log"
|
105
|
+
|
106
|
+
node_name 'monitor'
|
107
|
+
chef_server_url "http://localhost:4000"
|
108
|
+
log_level :debug
|
109
|
+
log_location "#{log_path}/client_#{node_name}.log"
|
110
|
+
verbose_logging true
|
111
|
+
client_key "#{current_dir}/#{node_name}.pem"
|
112
|
+
cache_type 'BasicFile'
|
113
|
+
cache_options :path => "#{log_path}/checksums"
|
114
|
+
cookbook_path ["#{current_dir}/../cookbooks", "#{current_dir}/../site-cookbooks"]
|
115
|
+
cookbook_copyright user
|
116
|
+
cookbook_license "apachev2"
|
117
|
+
cookbook_email email
|
118
|
+
|
119
|
+
# Amazon Web Services:
|
120
|
+
knife[:aws_access_key_id] = ENV['AWS_ACCESS_KEY'] if ENV['AWS_ACCESS_KEY']
|
121
|
+
knife[:aws_secret_access_key] = ENV['AWS_SECRET_KEY'] if ENV['AWS_SECRET_KEY']
|
122
|
+
|
123
|
+
# Rackspace:
|
124
|
+
knife[:rackspace_api_key] = ENV['RS_API_KEY'] if ENV['RS_API_KEY']
|
125
|
+
knife[:rackspace_api_username] = ENV['RS_API_USERNAME'] if ENV['RS_API_USERNAME']
|
126
|
+
|
127
|
+
# Slicehost
|
128
|
+
knife[:slicehost_password] = ENV['SH_PASSWORD'] if ENV['SH_PASSWORD']
|
129
|
+
|
130
|
+
# Terremark
|
131
|
+
knife[:terremark_password] = ENV['TM_PASSWORD'] if ENV['TM_PASSWORD']
|
132
|
+
knife[:terremark_username] = ENV['TM_USERNAME'] if ENV['TM_USERNAME']
|
133
|
+
knife[:terremark_service] = ENV['TM_SERVICE'] if ENV['TM_SERVICE']
|
134
|
+
|
135
|
+
"""
|
136
|
+
And I place ".chef/knife.rb" in "/tmp/monitor"
|
137
|
+
And I place ".chef/knife.rb" in "/tmp/monitor/mnt/chef"
|
138
|
+
|
139
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Zenoss Monitoring
|
3
|
+
In order to launch a Zenoss server
|
4
|
+
As a admin/developer
|
5
|
+
I want to define the Chef configuration via executable features
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given the Chef root directory "/tmp/chef" exists
|
9
|
+
And the state of VM "chef" is "running"
|
10
|
+
And I switch Vagrant environment
|
11
|
+
And the Chef root directory "/tmp/monitor" exists
|
12
|
+
And the state of VM "monitor" is not "running"
|
13
|
+
|
14
|
+
Scenario: Download Cookbooks from one Cookbooks URI
|
15
|
+
Given the remote Cookbooks URI "git://github.com/cookbooks/"
|
16
|
+
When I clone the Cookbooks:
|
17
|
+
| cookbook | branch | tag | ref | destination |
|
18
|
+
| apt | master | | | monitor/cookbooks/apt |
|
19
|
+
| openssh | master | | 9a8ce8ce44 | monitor/cookbooks/openssh |
|
20
|
+
| openssl | master | | | monitor/cookbooks/openssl |
|
21
|
+
| yum | master | | | monitor/cookbooks/yum |
|
22
|
+
And these local Cookbooks exist:
|
23
|
+
| cookbook |
|
24
|
+
| apt |
|
25
|
+
| openssh |
|
26
|
+
| openssl |
|
27
|
+
| yum |
|
28
|
+
Then I place all in "monitor" in "/tmp/monitor"
|
29
|
+
|
30
|
+
Scenario: Download Site-Cookbooks from another Cookbooks URI
|
31
|
+
Given the remote Cookbooks URI "git@github.com:hedgehog/"
|
32
|
+
When I clone the Cookbooks:
|
33
|
+
| cookbook | branch | destination |
|
34
|
+
| zenoss | qa | monitor/site-cookbooks/zenoss |
|
35
|
+
And these local Cookbooks exist:
|
36
|
+
| site-cookbook |
|
37
|
+
| zenoss |
|
38
|
+
Then I place all in "monitor" in "/tmp/monitor"
|
39
|
+
|
40
|
+
Scenario: Load Roles from Cookbooks
|
41
|
+
Given the Chef root directory "/tmp/monitor" exists
|
42
|
+
And a Cookbooks path "/tmp/monitor/cookbooks/"
|
43
|
+
And a Cookbooks path "/tmp/monitor/site-cookbooks/"
|
44
|
+
And the Knife file "/tmp/monitor/.chef/knife.rb"
|
45
|
+
When I load the Cookbook Roles:
|
46
|
+
| site-cookbook | role |
|
47
|
+
| zenoss | Class_Server-SSH-Linux.rb |
|
48
|
+
| zenoss | Class_Server-SSH-Linux-MySQL.rb |
|
49
|
+
| zenoss | Location_Austin.rb |
|
50
|
+
| zenoss | Location_Seattle.rb |
|
51
|
+
| zenoss | ZenossServer.rb |
|
52
|
+
Then these Roles exist:
|
53
|
+
| role |
|
54
|
+
| ServerSSHLinux |
|
55
|
+
| ServerSSHLinuxMySQL |
|
56
|
+
| Austin |
|
57
|
+
| Seattle |
|
58
|
+
| ZenossServer |
|
59
|
+
|
60
|
+
Scenario: Load Data Bag from Cookbooks
|
61
|
+
Given the Chef root directory "/tmp/monitor" exists
|
62
|
+
And a Cookbooks path "/tmp/monitor/cookbooks/"
|
63
|
+
And a Cookbooks path "/tmp/monitor/site-cookbooks/"
|
64
|
+
And I create the Data Bag "users"
|
65
|
+
When I add these Cookbook Data Bag items:
|
66
|
+
| site-cookbook | data_bag | item |
|
67
|
+
| zenoss | users | Zenoss_User.json |
|
68
|
+
| zenoss | users | Zenoss_Readonly_User.json |
|
69
|
+
Then these Data Bags exist:
|
70
|
+
| data_bag |
|
71
|
+
| users |
|
72
|
+
And these Data Bags contain:
|
73
|
+
| data_bag | item |
|
74
|
+
| users | readonly |
|
75
|
+
| users | zenossadmin |
|
76
|
+
|
77
|
+
Scenario: Build Node Run Lists
|
78
|
+
Given the Chef root directory "/tmp/monitor" exists
|
79
|
+
And the Node "monitor" exists
|
80
|
+
When I add these Roles to the Nodes:
|
81
|
+
| node | role |
|
82
|
+
| monitor | ZenossServer |
|
83
|
+
|
84
|
+
Scenario: Upload the Cookbooks
|
85
|
+
Given the Chef root directory "/tmp/monitor" exists
|
86
|
+
When I load the Cookbooks:
|
87
|
+
| cookbook | site-cookbook |
|
88
|
+
| apt | |
|
89
|
+
| openssh | |
|
90
|
+
| openssl | |
|
91
|
+
| | zenoss |
|
92
|
+
| yum | |
|
93
|
+
Then these remote Cookbooks exist:
|
94
|
+
| cookbook | site-cookbook |
|
95
|
+
| apt | |
|
96
|
+
| openssh | |
|
97
|
+
| openssl | |
|
98
|
+
| | zenoss |
|
99
|
+
| yum | |
|
100
|
+
|
101
|
+
@cosmic
|
102
|
+
Scenario: Launch the Vagrant VM Monitor
|
103
|
+
Given the state of VM "monitor" is not "running"
|
104
|
+
And the Chef root directory "/tmp/monitor" exists
|
105
|
+
And the Vagrantfile "/tmp/monitor/Vagrantfile" exists
|
106
|
+
When I launch the VM "monitor"
|
107
|
+
Then the state of VM "monitor" is "running"
|
108
|
+
|
109
|
+
|
@@ -1,3 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
1
17
|
Given /^the Gem "([^\"]*)" has been required$/ do |gem|
|
2
18
|
Gem.loaded_specs.key?(gem).should be_true
|
3
19
|
end
|
data/features/support/env.rb
CHANGED
@@ -68,6 +68,21 @@ module ::Cuken
|
|
68
68
|
'knife '
|
69
69
|
end
|
70
70
|
|
71
|
+
def run_knife(argv=[])
|
72
|
+
argv << '--config' << chef.knife_config_file.to_s
|
73
|
+
with_args *argv do
|
74
|
+
::Chef::Application::Knife.new.run
|
75
|
+
end
|
76
|
+
::Chef::Knife.cuken
|
77
|
+
end
|
78
|
+
|
79
|
+
def knife_config_file_error_handling
|
80
|
+
unless chef.knife_config_file && Pathname(chef.knife_config_file).exist?
|
81
|
+
chef.knife_config_file = Pathname(chef.local_chef_repo).ascend { |d| h=d+'.chef'+'knife.rb'; break h if h.file? }
|
82
|
+
end
|
83
|
+
raise(RuntimeError, "chef.knife_config_file is required", caller) unless chef.knife_config_file
|
84
|
+
end
|
85
|
+
|
71
86
|
def knife_debug
|
72
87
|
@knife_debug ||= true
|
73
88
|
end
|
@@ -116,6 +131,11 @@ module ::Cuken
|
|
116
131
|
end
|
117
132
|
end
|
118
133
|
|
134
|
+
def check_chef_root_presence(directory, expect_presence = true)
|
135
|
+
chef.root_dir = directory
|
136
|
+
check_placed_directory_presence([chef.root_dir], expect_presence)
|
137
|
+
end
|
138
|
+
|
119
139
|
end
|
120
140
|
end
|
121
141
|
end
|
@@ -1,3 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
1
17
|
module ::Cuken
|
2
18
|
module Api
|
3
19
|
module Chef
|
@@ -17,7 +33,7 @@ module ::Cuken
|
|
17
33
|
return ckbk, ckbk_src
|
18
34
|
end
|
19
35
|
|
20
|
-
def
|
36
|
+
def check_cookbook_table_presence(table, expect_presence = true)
|
21
37
|
table.hashes.each do |hsh|
|
22
38
|
ckbk, ckbk_src = parse_to_cookbooks_path(hsh)
|
23
39
|
full_cookbook_src = find_path_in_cookbook_folders(ckbk, ckbk_src, ckbk)
|
@@ -26,6 +42,19 @@ module ::Cuken
|
|
26
42
|
end
|
27
43
|
end
|
28
44
|
|
45
|
+
def check_remote_cookbook_table_presence(table, expect_presence = true)
|
46
|
+
books = cookbooks_list
|
47
|
+
table.hashes.each do |hsh|
|
48
|
+
if expect_presence
|
49
|
+
books.should include(hsh['cookbook']) if not (hsh['cookbook'].nil? || hsh['cookbook'].empty?)
|
50
|
+
books.should include(hsh['site-cookbook']) if not (hsh['site-cookbook'].nil? || hsh['site-cookbook'].empty?)
|
51
|
+
else
|
52
|
+
books.should_not include(hsh['cookbook']) if not (hsh['cookbook'].nil? || hsh['cookbook'].empty?)
|
53
|
+
books.should_not include(hsh['site-cookbook']) if not (hsh['site-cookbook'].nil? || hsh['site-cookbook'].empty?)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
29
58
|
def find_path_in_cookbook_folders(ckbk, ckbk_src, path_fragment1, path_fagment2='')
|
30
59
|
verify_cookbook_folders
|
31
60
|
full_data_bag_src = nil
|
@@ -74,6 +103,38 @@ module ::Cuken
|
|
74
103
|
end
|
75
104
|
end
|
76
105
|
|
106
|
+
def cookbooks_load(table)
|
107
|
+
table.hashes.each do |hsh|
|
108
|
+
ckbk, ckbk_src = parse_to_cookbooks_path(hsh)
|
109
|
+
full_cookbook_src = find_path_in_cookbook_folders(ckbk, ckbk_src, ckbk)
|
110
|
+
cookbook_load(ckbk)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def cookbook_load(ckbk)
|
115
|
+
|
116
|
+
knife_config_file_error_handling()
|
117
|
+
|
118
|
+
ckbk_pth = nil
|
119
|
+
in_chef_root do
|
120
|
+
ckbk_pth = unless chef.cookbooks_paths.empty?
|
121
|
+
(chef.cookbooks_paths.collect { |pn| pn.expand_path.to_s }).join(':')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
argv = ['cookbook', 'upload', ckbk]
|
126
|
+
( argv << '--cookbook-path' << ckbk_pth ) if ckbk_pth
|
127
|
+
run_knife(argv)
|
128
|
+
end
|
129
|
+
|
130
|
+
def cookbooks_list
|
131
|
+
|
132
|
+
knife_config_file_error_handling()
|
133
|
+
|
134
|
+
argv = ['cookbook', 'list']
|
135
|
+
run_knife(argv)
|
136
|
+
end
|
137
|
+
|
77
138
|
end
|
78
139
|
end
|
79
140
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module ::Cuken
|
18
|
+
module Api
|
19
|
+
module Chef
|
20
|
+
module DataBag
|
21
|
+
|
22
|
+
include ::Cuken::Api::Common
|
23
|
+
|
24
|
+
def load_data_bag_item_table(table)
|
25
|
+
table.hashes.each do |hsh|
|
26
|
+
data_bag_load(hsh)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_data_bag_table_presence(table, expect_presence = true)
|
31
|
+
bags = data_bag_list
|
32
|
+
table.hashes.each do |hsh|
|
33
|
+
if expect_presence
|
34
|
+
bags.should include(hsh['data_bag'])
|
35
|
+
else
|
36
|
+
bags.should include(hsh['data_bag'])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def check_data_bag_content_table(table, expect_match = true)
|
42
|
+
table.hashes.each do |hsh|
|
43
|
+
items = data_bag_show(hsh['data_bag'])
|
44
|
+
if expect_match
|
45
|
+
items.should include(hsh['item'])
|
46
|
+
else
|
47
|
+
items.should_not include(hsh['item'])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def data_bag_create(data_bag_name)
|
53
|
+
|
54
|
+
knife_config_file_error_handling()
|
55
|
+
|
56
|
+
argv = ['data', 'bag', 'create', data_bag_name]
|
57
|
+
run_knife(argv)
|
58
|
+
end
|
59
|
+
|
60
|
+
def data_bag_load(hsh)
|
61
|
+
|
62
|
+
knife_config_file_error_handling()
|
63
|
+
|
64
|
+
ckbk, ckbk_src = parse_to_cookbooks_path(hsh)
|
65
|
+
full_data_bag_src = find_path_in_cookbook_folders(ckbk, ckbk_src, ckbk, "data_bags/#{hsh['item']}")
|
66
|
+
argv = ['data', 'bag', 'from', 'file', hsh[:data_bag], full_data_bag_src]
|
67
|
+
run_knife(argv)
|
68
|
+
end
|
69
|
+
|
70
|
+
def data_bag_list
|
71
|
+
|
72
|
+
knife_config_file_error_handling()
|
73
|
+
|
74
|
+
argv = ['data', 'bag', 'list']
|
75
|
+
run_knife(argv)
|
76
|
+
end
|
77
|
+
|
78
|
+
def data_bag_show(data_bag)
|
79
|
+
|
80
|
+
knife_config_file_error_handling()
|
81
|
+
|
82
|
+
argv = ['data', 'bag', 'show', data_bag]
|
83
|
+
run_knife(argv)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/lib/cuken/api/chef/knife.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
1
17
|
require 'chef/application/knife'
|
2
18
|
|
3
19
|
module ::Cuken
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module ::Cuken
|
18
|
+
module Api
|
19
|
+
module Chef
|
20
|
+
module Role
|
21
|
+
|
22
|
+
include ::Cuken::Api::Common
|
23
|
+
|
24
|
+
def load_role_table(table)
|
25
|
+
in_chef_root do
|
26
|
+
table.hashes.each do |hsh|
|
27
|
+
case
|
28
|
+
when not(hsh['cookbook'].nil? || hsh['cookbook'].empty?)
|
29
|
+
src = "cookbooks/#{hsh['cookbook']}/roles/#{hsh['role']}"
|
30
|
+
when not(hsh['site-cookbook'].nil? || hsh['site-cookbook'].empty?)
|
31
|
+
src = "site-cookbooks/#{hsh['site-cookbook']}/roles/#{hsh['role']}"
|
32
|
+
else
|
33
|
+
src =""
|
34
|
+
end
|
35
|
+
role_load(src)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def role_load(src)
|
41
|
+
|
42
|
+
knife_config_file_error_handling()
|
43
|
+
|
44
|
+
argv = ['role', 'from', 'file', src]
|
45
|
+
run_knife(argv)
|
46
|
+
end
|
47
|
+
|
48
|
+
def role_list
|
49
|
+
|
50
|
+
knife_config_file_error_handling()
|
51
|
+
|
52
|
+
argv = ['role', 'list']
|
53
|
+
run_knife(argv)
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_role_table_presence(table, expect_presence = true)
|
57
|
+
roles = role_list
|
58
|
+
table.hashes.each do |hsh|
|
59
|
+
if expect_presence
|
60
|
+
roles.should include(hsh['role'])
|
61
|
+
else
|
62
|
+
roles.should_not include(hsh['role'])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/lib/cuken/api/chef.rb
CHANGED
@@ -1,11 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
#
|
2
|
+
# Author:: Hedgehog (<hedgehogshiatus@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2011 Hedgehog.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
require 'aruba/api' unless defined? ::Aruba::Api
|
18
|
+
require 'chef' unless defined? ::Chef
|
19
|
+
require 'grit' unless defined? ::Grit
|
20
|
+
require 'vagrant' unless defined? ::Vagrant
|
5
21
|
require 'cuken/api/common'
|
6
22
|
require 'cuken/api/chef/common'
|
7
23
|
require 'cuken/api/chef/cookbook'
|
8
24
|
require 'cuken/api/chef/knife'
|
25
|
+
require 'cuken/api/chef/role'
|
26
|
+
require 'cuken/api/chef/data_bag'
|
9
27
|
|
10
28
|
module ::Cuken
|
11
29
|
module Api
|
@@ -43,10 +61,14 @@ module ::Cuken
|
|
43
61
|
end
|
44
62
|
end
|
45
63
|
|
46
|
-
def clone_pull_error_check(
|
47
|
-
if res[/Could not find Repository /]
|
48
|
-
raise RuntimeError, "Could not find
|
64
|
+
def clone_pull_error_check(res)
|
65
|
+
if repo = res[/Could not find Repository /]
|
66
|
+
raise RuntimeError, "Could not find Repository #{repo}", caller
|
49
67
|
end
|
68
|
+
if repo = res[/ERROR: (.*) doesn't exist. Did you enter it correctly?/,1]
|
69
|
+
raise RuntimeError, "ERROR: #{repo} doesn't exist. Did you enter it correctly? #{repo}", caller
|
70
|
+
end
|
71
|
+
|
50
72
|
end
|
51
73
|
|
52
74
|
def chef_clone_repo(ckbk_path, cookbook = false, repo = chef.remote_chef_repo, type = {'branch' => 'master'})
|
@@ -55,9 +77,10 @@ module ::Cuken
|
|
55
77
|
gritty = ::Grit::Git.new(current_dir)
|
56
78
|
announce_or_puts gritty.inspect
|
57
79
|
clone_opts = {:quiet => false, :verbose => true, :progress => true}
|
58
|
-
|
80
|
+
type['branch'] = type['branch'].nil? ? '' : type['branch']
|
59
81
|
type['tag'] = type['tag'].nil? ? '' : type['tag']
|
60
82
|
type['ref'] = type['ref'].nil? ? '' : type['ref']
|
83
|
+
clone_opts[:branch] = type['branch'].empty? ? 'master' : type['branch']
|
61
84
|
if pth.directory?
|
62
85
|
announce_or_puts "Pulling: #{repo} into #{pth}"
|
63
86
|
res = gritty.pull(clone_opts, repo, pth.to_s)
|
@@ -65,7 +88,7 @@ module ::Cuken
|
|
65
88
|
announce_or_puts "Cloning: #{repo} into #{pth}"
|
66
89
|
res = gritty.clone(clone_opts, repo, pth.to_s)
|
67
90
|
end
|
68
|
-
clone_pull_error_check(
|
91
|
+
clone_pull_error_check(res) if res
|
69
92
|
update_cookbook_paths(pth, cookbook)
|
70
93
|
unless chef.cookbooks_paths.empty? # is empty after cloning default chef-repo
|
71
94
|
grotty = ::Grit::Git.new((pth + '.git').to_s)
|
@@ -175,3 +198,22 @@ module ::Cuken
|
|
175
198
|
end
|
176
199
|
end
|
177
200
|
end
|
201
|
+
|
202
|
+
class ::Chef
|
203
|
+
class Knife
|
204
|
+
class << self
|
205
|
+
attr_accessor :cuken
|
206
|
+
end
|
207
|
+
private
|
208
|
+
def output(data)
|
209
|
+
::Chef::Knife.cuken = data
|
210
|
+
end
|
211
|
+
module Core
|
212
|
+
class GenericPresenter
|
213
|
+
def format_cookbook_list_for_display(data)
|
214
|
+
::Chef::Knife.cuken = data
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|