safety_razor 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module SafetyRazor
4
+
5
+ VERSION = "0.1.0"
6
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'safety_razor/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "safety_razor"
8
+ spec.version = SafetyRazor::VERSION
9
+ spec.authors = ["Fletcher Nichol"]
10
+ spec.email = ["fnichol@nichol.ca"]
11
+ spec.description = %q{Safety Razor - A Ruby client for the Razor API.}
12
+ spec.summary = spec.description
13
+ spec.homepage = "https://github.com/blueboxgroup/safety_razor"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = []
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "hashie"
22
+ spec.add_dependency "faraday"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+
27
+ spec.add_development_dependency "minitest"
28
+ spec.add_development_dependency 'mocha'
29
+ spec.add_development_dependency 'guard-minitest'
30
+
31
+ spec.add_development_dependency 'simplecov'
32
+ spec.add_development_dependency 'cane'
33
+ spec.add_development_dependency 'guard-cane'
34
+ spec.add_development_dependency 'tailor'
35
+ spec.add_development_dependency 'countloc'
36
+ end
data/script/bootstrap ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ [ -n "$BOOTSTRAP_DEBUG" ] && set -x
4
+
5
+ banner() { printf -- "-----> $*\n"; }
6
+ log() { printf -- " $*\n"; }
7
+ warn() { printf -- ">>>>>> $*\n"; }
8
+ fail() { printf -- "\nERROR: $*\n" ; exit 1 ; }
9
+
10
+ if ! command -v vagrant >/dev/null ; then
11
+ fail "An installation of Vagrant could not be found, please install a package"
12
+ fi
13
+
14
+ banner "Checking for Vagrant"
15
+ if [[ "$(vagrant --version)" < "Vagrant version 1.1.0" ]] ; then
16
+ fail "Only Vagrant versions 1.1.0 and up are supported, please update"
17
+ fi
18
+
19
+ banner "Checking for vagrant-omnibus Vagrant plugin"
20
+ if ! vagrant plugin list | grep -q '^vagrant-omnibus ' ; then
21
+ fail "Vagrant plugin vagrant-omnibus must be installed"
22
+ fi
23
+
24
+ banner "Checking for vagrant-berkshelf Vagrant plugin"
25
+ if ! vagrant plugin list | grep -q '^vagrant-berkshelf ' ; then
26
+ fail "Vagrant plugin vagrant-berkshelf must be installed"
27
+ fi
28
+
29
+ bundle_cmd="bundle install"
30
+ banner "Running '$bundle_cmd'"
31
+ $bundle_cmd
32
+
33
+ banner 'All ready!'
@@ -0,0 +1,115 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'mocha/setup'
5
+
6
+ require 'safety_razor'
7
+
8
+ describe "ActiveModel Slice" do
9
+
10
+ let(:client) { SafetyRazor::Client.new(:uri => 'http://127.0.0.1:8026') }
11
+
12
+ let(:images) do
13
+ %x{vagrant ssh --command 'sudo razor image get all'}.
14
+ split("\n\n").
15
+ collect{ |x| Hash[*(x.split(/\n|=>/) - ['Images']).
16
+ collect{|y| y.strip!}] }
17
+ end
18
+
19
+ let(:node) do
20
+ client.node.register({
21
+ :hw_id => "000C29291C95",
22
+ :last_state => "idle",
23
+ :attributes_hash => {
24
+ :productname => "safety"
25
+ }
26
+ })
27
+ end
28
+
29
+ let(:model) do
30
+ client.model.create({
31
+ :label => "test-model",
32
+ :image_uuid => image_uuid,
33
+ :template => "ubuntu_oneiric",
34
+ :req_metadata_hash => {
35
+ :hostname_prefix => "test",
36
+ :domainname => "testdomain.com",
37
+ :root_password => "test4321"
38
+ }
39
+ })
40
+ end
41
+
42
+ let(:tag) do
43
+ result = client.tag.create({
44
+ :name => "Safety",
45
+ :tag => "safety"
46
+ })
47
+ client.tag_matcher.create(result.uuid, {
48
+ :key => "productname",
49
+ :compare => "equal",
50
+ :value => "safety"
51
+ })
52
+ result
53
+ end
54
+
55
+ let(:policy) do
56
+ client.policy.create({
57
+ :label => "Test Policy",
58
+ :model_uuid => model.uuid,
59
+ :template => "linux_deploy",
60
+ :tags => "safety",
61
+ :enabled => "true"
62
+ })
63
+ end
64
+
65
+ before do
66
+ script = [
67
+ %{d = ProjectRazor::Data.instance},
68
+ %{d.check_init},
69
+ %{d.delete_all_objects(:node)},
70
+ %{d.delete_all_objects(:active)},
71
+ %{e = ProjectRazor::Engine.instance}
72
+ ].join(' ; ')
73
+ commands = [
74
+ %{sudo razor policy remove all},
75
+ %{sudo razor model remove all},
76
+ %{sudo razor tag remove all},
77
+ %{sudo ruby -I/opt/razor/lib -rproject_razor -e "#{script}"}
78
+ ].join(' && ')
79
+
80
+ %x{vagrant ssh --command '#{commands}'}
81
+
82
+ tag # create tag and matcher
83
+ policy # create policy
84
+ node # create node
85
+ end
86
+
87
+ it "manages an active model" do
88
+ client.active_model.all.must_equal []
89
+
90
+ # check node in to match against a policy and create an active_model
91
+ client.node.checkin({
92
+ :hw_id => "000C29291C95",
93
+ :last_state => "idle"
94
+ })
95
+
96
+ all = client.active_model.all
97
+ all.size.must_equal 1
98
+
99
+ fetched_active_model = client.active_model.get(all.first.uuid)
100
+ fetched_active_model.node_uuid.must_equal node.uuid
101
+
102
+ client.active_model.destroy(fetched_active_model.uuid)
103
+ client.active_model.all.must_equal []
104
+ end
105
+
106
+ private
107
+
108
+ def image_uuid(name = "ubuntu-minimal-10.04", version = "10.04")
109
+ result = images.find do |image|
110
+ image["OS Name"] == name && image["OS Version"] == version
111
+ end
112
+
113
+ result && result["UUID"]
114
+ end
115
+ end
@@ -0,0 +1,52 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'mocha/setup'
5
+
6
+ require 'safety_razor'
7
+
8
+ describe "Broker Slice" do
9
+
10
+ let(:client) { SafetyRazor::Client.new(:uri => 'http://127.0.0.1:8026') }
11
+
12
+ before do
13
+ %x{vagrant ssh --command 'sudo razor broker remove all'}
14
+ end
15
+
16
+ it "manages a broker" do
17
+ client.broker.plugins.find { |t| t.plugin == "puppet" }.
18
+ description.must_equal "PuppetLabs PuppetMaster"
19
+
20
+ client.broker.all.must_equal []
21
+
22
+ broker = client.broker.create({
23
+ :name => "Chefy",
24
+ :plugin => "chef",
25
+ :description => "Production Chef Server",
26
+ :req_metadata_hash => {
27
+ :chef_server_url => "https://chef.example.com",
28
+ :chef_version => "11.4.0",
29
+ :validation_key => "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAK..."
30
+ }
31
+ })
32
+ broker.name.must_equal "Chefy"
33
+ broker.chef_version.must_equal "11.4.0"
34
+
35
+ all = client.broker.all
36
+ all.size.must_equal 1
37
+ all.first.uuid.must_equal broker.uuid
38
+
39
+ fetched_broker = client.broker.get(broker.uuid)
40
+ fetched_broker.uuid.must_equal broker.uuid
41
+ fetched_broker.name.must_equal "Chefy"
42
+
43
+ updated_broker = client.broker.update({
44
+ :uuid => broker.uuid,
45
+ :name => "Updated Chefy"
46
+ })
47
+ updated_broker.name.must_equal "Updated Chefy"
48
+
49
+ client.broker.destroy(broker.uuid)
50
+ client.broker.all.must_equal []
51
+ end
52
+ end
@@ -0,0 +1,69 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'mocha/setup'
5
+
6
+ require 'safety_razor'
7
+
8
+ describe "Model Slice" do
9
+
10
+ let(:client) { SafetyRazor::Client.new(:uri => 'http://127.0.0.1:8026') }
11
+
12
+ let(:images) do
13
+ %x{vagrant ssh --command 'sudo razor image get all'}.
14
+ split("\n\n").
15
+ collect{ |x| Hash[*(x.split(/\n|=>/) - ['Images']).
16
+ collect{|y| y.strip!}] }
17
+ end
18
+
19
+ before do
20
+ %x{vagrant ssh --command 'sudo razor model remove all'}
21
+ end
22
+
23
+ it "manages a model" do
24
+ client.model.templates.
25
+ find { |t| t.name == "ubuntu_oneiric" }.template.must_equal "linux_deploy"
26
+
27
+ client.model.all.must_equal []
28
+
29
+ model = client.model.create({
30
+ :label => "test-model",
31
+ :image_uuid => image_uuid,
32
+ :template => "ubuntu_oneiric",
33
+ :req_metadata_hash => {
34
+ :hostname_prefix => "test",
35
+ :domainname => "testdomain.com",
36
+ :root_password => "test4321"
37
+ }
38
+ })
39
+ model.label.must_equal "test-model"
40
+ model.image_uuid.must_equal image_uuid
41
+
42
+ all = client.model.all
43
+ all.size.must_equal 1
44
+ all.first.uuid.must_equal model.uuid
45
+
46
+ fetched_model = client.model.get(model.uuid)
47
+ fetched_model.uuid.must_equal model.uuid
48
+ fetched_model.label.must_equal "test-model"
49
+
50
+ updated_model = client.model.update({
51
+ :uuid => model.uuid,
52
+ :label => "updated-test-model"
53
+ })
54
+ updated_model.label.must_equal "updated-test-model"
55
+
56
+ client.model.destroy(model.uuid)
57
+ client.model.all.must_equal []
58
+ end
59
+
60
+ private
61
+
62
+ def image_uuid(name = "ubuntu-minimal-10.04", version = "10.04")
63
+ result = images.find do |image|
64
+ image["OS Name"] == name && image["OS Version"] == version
65
+ end
66
+
67
+ result && result["UUID"]
68
+ end
69
+ end
@@ -0,0 +1,59 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'mocha/setup'
5
+
6
+ require 'safety_razor'
7
+
8
+ describe "Node Slice" do
9
+
10
+ let(:client) { SafetyRazor::Client.new(:uri => 'http://127.0.0.1:8026') }
11
+
12
+ before do
13
+ # sadly there isn't a way to delete nodes via any API so we can get evil
14
+ # and creative instead
15
+ script = [
16
+ %{i = ProjectRazor::Data.instance},
17
+ %{i.check_init},
18
+ %{i.delete_all_objects(:node)}
19
+ ].join(' ; ')
20
+ command = %{sudo ruby -I/opt/razor/lib -rproject_razor -e "#{script}"}
21
+
22
+ %x{vagrant ssh --command '#{command}'}
23
+ end
24
+
25
+ it "manages a node" do
26
+ client.node.all.must_equal []
27
+
28
+ node = client.node.register({
29
+ :hw_id => "000C29291C95",
30
+ :last_state => "idle",
31
+ :attributes_hash => {
32
+ :attr1 => "val1",
33
+ :attr2 => "val2"
34
+ }
35
+ })
36
+ node.hw_id.first.must_equal "000C29291C95"
37
+ node.last_state.must_equal "idle"
38
+
39
+ all = client.node.all
40
+ all.size.must_equal 1
41
+ all.first.hw_id.must_equal node.hw_id
42
+
43
+ fetched_node = client.node.get(node.uuid)
44
+ fetched_node.uuid.must_equal node.uuid
45
+ fetched_node.last_state.must_equal "idle"
46
+
47
+ client.node.checkin({
48
+ :hw_id => "000C29291C95",
49
+ :last_state => "baked"
50
+ })
51
+ client.node.get(node.uuid).last_state.must_equal "baked"
52
+
53
+ attrs = client.node.get_attributes(node.uuid)
54
+ attrs['attr1'].must_equal "val1"
55
+ attrs['attr2'].must_equal "val2"
56
+
57
+ client.node.get_hardware_ids(node.uuid).must_equal node.hw_id
58
+ end
59
+ end
@@ -0,0 +1,82 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'minitest/autorun'
4
+ require 'mocha/setup'
5
+
6
+ require 'safety_razor'
7
+
8
+ describe "Policy Slice" do
9
+
10
+ let(:client) { SafetyRazor::Client.new(:uri => 'http://127.0.0.1:8026') }
11
+
12
+ let(:images) do
13
+ %x{vagrant ssh --command 'sudo razor image get all'}.
14
+ split("\n\n").
15
+ collect{ |x| Hash[*(x.split(/\n|=>/) - ['Images']).
16
+ collect{|y| y.strip!}] }
17
+ end
18
+
19
+ let(:model) do
20
+ client.model.create({
21
+ :label => "test-model",
22
+ :image_uuid => image_uuid,
23
+ :template => "ubuntu_oneiric",
24
+ :req_metadata_hash => {
25
+ :hostname_prefix => "test",
26
+ :domainname => "testdomain.com",
27
+ :root_password => "test4321"
28
+ }
29
+ })
30
+ end
31
+
32
+ before do
33
+ commands = [
34
+ "sudo razor policy remove all",
35
+ "sudo razor model remove all",
36
+ ].join(' && ')
37
+ %x{vagrant ssh --command '#{commands}'}
38
+ end
39
+
40
+ it "manages a policy" do
41
+ client.policy.templates.
42
+ find { |t| t.template == "linux_deploy" }.is_template.must_equal true
43
+
44
+ client.policy.all.must_equal []
45
+
46
+ policy = client.policy.create({
47
+ label: "Test Policy",
48
+ model_uuid: model.uuid,
49
+ template: "linux_deploy",
50
+ tags: "two_disks,memsize_1GiB,nics_2"
51
+ })
52
+ policy.label.must_equal "Test Policy"
53
+ policy.model.uuid.must_equal model.uuid
54
+
55
+ all = client.policy.all
56
+ all.size.must_equal 1
57
+ all.first.uuid.must_equal policy.uuid
58
+
59
+ fetched_policy = client.policy.get(policy.uuid)
60
+ fetched_policy.uuid.must_equal policy.uuid
61
+ fetched_policy.label.must_equal "Test Policy"
62
+
63
+ updated_policy = client.policy.update({
64
+ :uuid => policy.uuid,
65
+ :tags => "one,two,three"
66
+ })
67
+ updated_policy.tags.must_equal %w{one two three}
68
+
69
+ client.policy.destroy(policy.uuid)
70
+ client.policy.all.must_equal []
71
+ end
72
+
73
+ private
74
+
75
+ def image_uuid(name = "ubuntu-minimal-10.04", version = "10.04")
76
+ result = images.find do |image|
77
+ image["OS Name"] == name && image["OS Version"] == version
78
+ end
79
+
80
+ result && result["UUID"]
81
+ end
82
+ end