clc-promote 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: babb452554c75dbcc1254e447c2fb77ac7485afb
4
+ data.tar.gz: 0f62a4e131785fe1decfb58dd9586df9307d9db1
5
+ SHA512:
6
+ metadata.gz: c8faef1b98bedb2842a6b23351497456c7c03408f4de07a738f7e27cfd98e5835caf16c7a01377785bb40135fa68ce43b58a44923b0ad9e095d8a643cdab6292
7
+ data.tar.gz: e924f00b488674b6c59defadbac589d544d64a2588c7f647c875adef6e626a5caef25febc8f28fe28851f2cf78ab545a492e89573cdc72919760f1f55ade00bc
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # CLC-Promote
2
+ Provides versioning and promotion logic for chef artifacts.
data/lib/promote.rb ADDED
@@ -0,0 +1 @@
1
+ require 'promote/versioner'
@@ -0,0 +1,89 @@
1
+ require 'promote'
2
+ require "rake/tasklib"
3
+
4
+ module Promote
5
+
6
+ class RakeTasks < ::Rake::TaskLib
7
+
8
+ def initialize(repo_root)
9
+ @versioner = Versioner.new(repo_root)
10
+ yield self if block_given?
11
+ define_version_cookbook
12
+ define_version_cookbooks
13
+ define_version_environment
14
+ define_version_environments
15
+ define_version_data_bag
16
+ define_version_data_bags
17
+ end
18
+
19
+ private
20
+
21
+
22
+ def define_version_cookbook
23
+ namespace "Promote" do
24
+ desc "Version a cookbook"
25
+ task "version_cookbook", :cookbook do |task, args|
26
+ @versioner.version_cookbook(args.cookbook)
27
+ end
28
+ end
29
+ end
30
+
31
+ def define_version_cookbooks
32
+ namespace "Promote" do
33
+ desc "Version all cookbooks"
34
+ task "version_cookbooks" do
35
+ Dir.glob(File.join(@versioner.cookbook_directory, "*")) do |file|
36
+ cookbook = File.basename(file)
37
+ puts "versioning cookbook #{cookbook}"
38
+ @versioner.version_cookbook(cookbook)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ def define_version_environment
45
+ namespace "Promote" do
46
+ desc "Version an environment"
47
+ task "version_environment", :environment do |task, args|
48
+ @versioner.version_environment(args.environment)
49
+ end
50
+ end
51
+ end
52
+
53
+ def define_version_environments
54
+ namespace "Promote" do
55
+ desc "Version all environments"
56
+ task "version_environments" do
57
+ Dir.glob(File.join(@versioner.environment_directory, "*.json")) do |file|
58
+ environment = File.basename(file ,File.extname(file))
59
+ puts "versioning environment #{environment}"
60
+ @versioner.version_environment(environment)
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def define_version_data_bag
67
+ namespace "Promote" do
68
+ desc "Version a data_bag"
69
+ task "version_data_bag", :data_bag do |task, args|
70
+ @versioner.version_data_bag(args.data_bag)
71
+ end
72
+ end
73
+ end
74
+
75
+ def define_version_data_bags
76
+ namespace "Promote" do
77
+ desc "Version all data_bags"
78
+ task "version_data_bags" do
79
+ Dir.glob(File.join(@versioner.data_bag_directory, "*.json")) do |file|
80
+ data_bag = File.basename(file, File.extname(file))
81
+ puts "versioning data_bag #{data_bag}"
82
+ @versioner.version_data_bag(data_bag)
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,101 @@
1
+ require 'git'
2
+ require 'json'
3
+
4
+ module Promote
5
+ class Versioner
6
+ def initialize(repo_root = Dir.pwd)
7
+ @repo_root = repo_root
8
+ @git = Git.open(git_root(repo_root))
9
+ version_tags = @git.tags.select { |t| t.name[/^[0-9\.]+/] }
10
+ @current_tag = version_tags[-1]
11
+ @sha1 = @git.log(10000).between(current_tag.sha).first.sha
12
+ end
13
+
14
+ def version_cookbook(cookbook_name)
15
+ dir = File.join(cookbook_directory, cookbook_name)
16
+ cookbook_name = File.basename(dir)
17
+ version = version_number(current_tag, dir)
18
+ metadata_file = File.join(dir, "metadata.rb")
19
+ metadata_content = File.read(metadata_file)
20
+ version_line = metadata_content[/^\s*version\s.*$/]
21
+ current_version = version_line[/('|").*("|')/].gsub(/('|")/,"")
22
+
23
+ if current_version != version
24
+ metadata_content = metadata_content.gsub(current_version, version)
25
+ outdata = metadata_content.gsub(/#sha1.*$/, "#sha1 '#{sha1}'")
26
+ if outdata[/#sha1.*$/].nil?
27
+ outdata += "#sha1 '#{sha1}'"
28
+ end
29
+ File.open(metadata_file, 'w') do |out|
30
+ out << outdata
31
+ end
32
+ end
33
+ end
34
+
35
+ def version_data_bag(data_bag_name)
36
+ version_json data_bag_directory, data_bag_name
37
+ end
38
+
39
+ def version_environment(environment_name)
40
+ version_json environment_directory, environment_name do | content |
41
+ content['override_attributes']
42
+ end
43
+ end
44
+
45
+ def cookbook_directory
46
+ File.join(@repo_root, "cookbooks")
47
+ end
48
+
49
+ def environment_directory
50
+ File.join(@repo_root, "environments")
51
+ end
52
+
53
+ def data_bag_directory
54
+ File.join(@repo_root, "data_bags/datacenters")
55
+ end
56
+
57
+ private
58
+
59
+ def version_json(parent_directory, file_name, &block)
60
+ version_string = "version"
61
+ file = "#{parent_directory}/#{file_name}.json"
62
+ version = version_number(current_tag, file)
63
+ content = JSON.parse(File.read(file))
64
+ current_version = '0.0'
65
+
66
+ if block_given?
67
+ content_hash = yield content
68
+ else
69
+ content_hash = content
70
+ end
71
+
72
+ if content_hash.has_key?(version_string)
73
+ current_version = content_hash[version_string]
74
+ end
75
+
76
+ if current_version != version
77
+ content_hash[version_string] = version
78
+ content_hash['sha1'] = sha1
79
+ File.open(file, 'w') do |out|
80
+ out << JSON.pretty_generate(content)
81
+ end
82
+ end
83
+ end
84
+
85
+ attr_accessor :git
86
+ attr_accessor :current_tag
87
+ attr_accessor :sha1
88
+
89
+ def version_number(current_tag, ref)
90
+ all_commit_count = git.log(10000).object(ref).between(current_tag.sha).size
91
+ bump_commit_count = git.log(10000).object(ref).between(current_tag.sha).grep("CI:versioning chef artifacts").size
92
+ commit_count = all_commit_count - bump_commit_count
93
+ "#{current_tag.name}.#{commit_count}"
94
+ end
95
+
96
+ def git_root(start_leaf)
97
+ return start_leaf if File.exist?(File.join(start_leaf, '.git'))
98
+ git_root(File.expand_path('..', start_leaf))
99
+ end
100
+ end
101
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clc-promote
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - CenturyLink Cloud
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: knife-spork
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: git
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.2'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.2.8
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.2'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.2.8
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 3.0.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: rake
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '10.3'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 10.3.2
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.3'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 10.3.2
93
+ description: Provides versioning and promotion logic for chef artifacts.
94
+ email: matt.wrock@CenturyLinkCloud.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files:
98
+ - README.md
99
+ files:
100
+ - README.md
101
+ - lib/promote.rb
102
+ - lib/promote/rake_tasks.rb
103
+ - lib/promote/versioner.rb
104
+ homepage: https://github.com/tier3/DevOps/gems/clc-promote
105
+ licenses: []
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.2.1
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: Provides versioning and promotion logic for chef artifacts.
127
+ test_files: []
128
+ has_rdoc: