simp-metadata 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +0 -0
  3. data/Rakefile +69 -0
  4. data/exe/simp-install +8 -0
  5. data/exe/simp-media +8 -0
  6. data/exe/simp-metadata +8 -0
  7. data/lib/simp/install.rb +0 -0
  8. data/lib/simp/install/command.rb +70 -0
  9. data/lib/simp/media.rb +9 -0
  10. data/lib/simp/media/command.rb +69 -0
  11. data/lib/simp/media/engine.rb +104 -0
  12. data/lib/simp/media/type.rb +14 -0
  13. data/lib/simp/media/type/base.rb +63 -0
  14. data/lib/simp/media/type/control-repo.rb +211 -0
  15. data/lib/simp/media/type/internet.rb +38 -0
  16. data/lib/simp/media/type/iso.rb +9 -0
  17. data/lib/simp/media/type/local.rb +36 -0
  18. data/lib/simp/media/type/tar.rb +71 -0
  19. data/lib/simp/metadata.rb +416 -0
  20. data/lib/simp/metadata/bootstrap_source.rb +137 -0
  21. data/lib/simp/metadata/buildinfo.rb +58 -0
  22. data/lib/simp/metadata/command.rb +92 -0
  23. data/lib/simp/metadata/commands.rb +21 -0
  24. data/lib/simp/metadata/commands/base.rb +65 -0
  25. data/lib/simp/metadata/commands/clone.rb +26 -0
  26. data/lib/simp/metadata/commands/component.rb +109 -0
  27. data/lib/simp/metadata/commands/delete.rb +26 -0
  28. data/lib/simp/metadata/commands/pry.rb +19 -0
  29. data/lib/simp/metadata/commands/release.rb +47 -0
  30. data/lib/simp/metadata/commands/releases.rb +24 -0
  31. data/lib/simp/metadata/commands/save.rb +33 -0
  32. data/lib/simp/metadata/commands/script.rb +38 -0
  33. data/lib/simp/metadata/commands/search.rb +65 -0
  34. data/lib/simp/metadata/commands/set-write-url.rb +19 -0
  35. data/lib/simp/metadata/commands/set-write.rb +19 -0
  36. data/lib/simp/metadata/commands/update.rb +46 -0
  37. data/lib/simp/metadata/component.rb +388 -0
  38. data/lib/simp/metadata/components.rb +70 -0
  39. data/lib/simp/metadata/engine.rb +101 -0
  40. data/lib/simp/metadata/fake_uri.rb +19 -0
  41. data/lib/simp/metadata/git_ssh_wrapper.sh +6 -0
  42. data/lib/simp/metadata/location.rb +198 -0
  43. data/lib/simp/metadata/locations.rb +54 -0
  44. data/lib/simp/metadata/release.rb +119 -0
  45. data/lib/simp/metadata/releases.rb +57 -0
  46. data/lib/simp/metadata/source.rb +204 -0
  47. data/spec/simp/media/command_spec.rb +12 -0
  48. data/spec/simp/media/engine_spec.rb +28 -0
  49. data/spec/simp/media/type/control_repo_spec.rb +23 -0
  50. data/spec/simp/media/type/internet_spec.rb +29 -0
  51. data/spec/simp/media/type/iso_spec.rb +15 -0
  52. data/spec/simp/media/type/local_spec.rb +16 -0
  53. data/spec/simp/media/type/tar_spec.rb +16 -0
  54. data/spec/simp/metadata/buildinfo_spec.rb +64 -0
  55. data/spec/simp/metadata/commands/clone_spec.rb +8 -0
  56. data/spec/simp/metadata/component_spec.rb +90 -0
  57. data/spec/simp/metadata/engine_spec.rb +70 -0
  58. data/spec/simp/metadata/release_spec.rb +104 -0
  59. data/spec/simp/metadata/source_spec.rb +25 -0
  60. data/spec/simp/metadata_spec.rb +175 -0
  61. data/spec/spec_helper.rb +40 -0
  62. metadata +260 -0
@@ -0,0 +1,119 @@
1
+ require 'simp/metadata/components'
2
+ module Simp
3
+ module Metadata
4
+ class Release
5
+ attr_accessor :engine
6
+ attr_accessor :version
7
+
8
+ def initialize(engine, version)
9
+ @engine = engine
10
+ @version = version
11
+ end
12
+
13
+ def components(type = nil)
14
+ Simp::Metadata::Components.new(engine, version, type)
15
+ end
16
+
17
+ def puppetfile_component(component, options)
18
+ contents = []
19
+ contents << "mod '#{component.name("puppetfile")}',"
20
+ contents << " :git => '#{component.primary.url}',"
21
+ if (component.ref == nil)
22
+ contents << " :tag => '#{component.tag}'"
23
+ else
24
+ contents << " :ref => '#{component.ref}'"
25
+ end
26
+ contents << ""
27
+ contents
28
+ end
29
+
30
+ def puppetfile(options = {})
31
+ contents = []
32
+ if (options["type"] == "simp-core")
33
+ contents << "moduledir 'src'"
34
+ contents << ""
35
+ contents << puppetfile_component(components['simp-doc'], options)
36
+ contents << puppetfile_component(components['simp-rsync'], options)
37
+ contents << "moduledir 'src/assets'"
38
+ contents << ""
39
+ components.each do |component|
40
+ if (component.component_type == "rpm")
41
+ contents << puppetfile_component(component, options)
42
+ end
43
+ end
44
+ contents << "moduledir 'src/rubygems'"
45
+ contents << ""
46
+ components.each do |component|
47
+ if (component.component_type == "rubygem")
48
+ contents << puppetfile_component(component, options)
49
+ end
50
+ end
51
+ contents << "moduledir 'src/puppet/modules'"
52
+ contents << ""
53
+ end
54
+ components.each do |component|
55
+ if (component.component_type == "puppet-module")
56
+ contents << puppetfile_component(component, options)
57
+ end
58
+ end
59
+ contents.join("\n")
60
+ end
61
+
62
+ def to_s()
63
+ self.components.to_s
64
+ end
65
+
66
+ def diff(compare_release, attribute)
67
+ diff = {}
68
+
69
+ current_hash = {}
70
+ compare_hash = {}
71
+ self.components.each do |comp|
72
+ self_component_hash = {}
73
+ comp.each do |key, value|
74
+ if (attribute != nil)
75
+ if (key.to_s == attribute)
76
+ self_component_hash[key] = value.to_s
77
+ end
78
+ else
79
+ self_component_hash[key] = value.to_s
80
+ end
81
+ current_hash[comp.name] = self_component_hash
82
+ end
83
+ end
84
+
85
+ compare_release.components.each do |comp|
86
+ self_component_hash = {}
87
+ comp.each do |key, value|
88
+ if (attribute != nil)
89
+ if (key.to_s == attribute)
90
+ self_component_hash[key] = value.to_s
91
+ end
92
+ else
93
+ self_component_hash[key] = value.to_s
94
+ end
95
+ compare_hash[comp.name] = self_component_hash
96
+ end
97
+ end
98
+ current_hash.each do |comp, hash|
99
+
100
+ diff_hash = {}
101
+ hash.each do |key, value|
102
+ if (compare_hash.key?(comp))
103
+ if (compare_hash[comp][key] != value)
104
+ diff_hash[key] = {
105
+ "original" => "#{value}",
106
+ "changed" => "#{compare_hash[comp][key]}"
107
+ }
108
+ end
109
+ end
110
+ end
111
+ unless diff_hash.empty?
112
+ diff[comp] = diff_hash
113
+ end
114
+ end
115
+ return diff
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,57 @@
1
+ require 'simp/metadata/release'
2
+
3
+ module Simp
4
+ module Metadata
5
+ class Releases
6
+ include Enumerable
7
+ attr_accessor :engine
8
+
9
+ def initialize(engine)
10
+ @engine = engine
11
+ end
12
+
13
+ def each(&block)
14
+ self.keys.each do |version|
15
+ yield self[version]
16
+ end
17
+ end
18
+
19
+ def [](index)
20
+ Simp::Metadata::Release.new(engine, index)
21
+ end
22
+
23
+ def keys()
24
+ result = {}
25
+ engine.sources.each do |name, source|
26
+ source.releases.keys.each do |name|
27
+ result[name] = true
28
+ end
29
+ end
30
+ result.keys
31
+ end
32
+
33
+ def size()
34
+ self.keys.size
35
+ end
36
+
37
+ def to_s()
38
+ self.keys.to_s
39
+ end
40
+ def delete(version)
41
+ engine.sources.each do |name, metadata_source|
42
+ if (metadata_source.writable?)
43
+ metadata_source.delete_release(version)
44
+ end
45
+ end
46
+ end
47
+ def create(destination, source = 'master')
48
+ engine.sources.each do |name, metadata_source|
49
+ if (metadata_source.writable?)
50
+ metadata_source.create_release(destination, source)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1,204 @@
1
+ require 'yaml'
2
+ require 'uri'
3
+
4
+ module Simp
5
+ module Metadata
6
+ class Source
7
+
8
+ attr_accessor :url
9
+ attr_accessor :cachepath
10
+ attr_accessor :components
11
+ attr_accessor :releases
12
+ attr_accessor :basename
13
+ attr_accessor :data
14
+ attr_accessor :releases
15
+ attr_accessor :components
16
+ attr_accessor :name
17
+ attr_accessor :edition
18
+ attr_accessor :engine
19
+
20
+ def initialize(args)
21
+ unless (args.key?(:engine))
22
+ raise ":engine must be specified when initializing a metadata source"
23
+ end
24
+ unless (args.key?(:name))
25
+ raise ":name must be specified when initializing a metadata source"
26
+ end
27
+ unless (args.key?(:component))
28
+ raise ":component must be specified when initializing a metadata source"
29
+ end
30
+ unless (args.key?(:edition))
31
+ raise ":edition must be specified when initializing a metadata source"
32
+ end
33
+
34
+ @engine = args[:engine]
35
+ @name = args[:name]
36
+ @component = args[:component]
37
+ @edition = args[:edition]
38
+
39
+ if (args[:url])
40
+ @url = args[:url]
41
+ else
42
+ @url = @component.primary.url
43
+ end
44
+ @write_url = @url
45
+ cachepath = args[:cachepath]
46
+ @components = {}
47
+ @releases = {}
48
+ @data = {}
49
+ @cleanup = []
50
+
51
+ if (cachepath == nil)
52
+ @cachepath = Dir.mktmpdir("cachedir")
53
+ @cleanup << @cachepath
54
+ else
55
+ @cachepath = File.absolute_path(cachepath);
56
+ end
57
+ retval = Simp::Metadata.download_component(@component, {"target" => @cachepath})
58
+ load_from_dir(retval["path"])
59
+
60
+ @dirty = false
61
+ end
62
+
63
+ def to_s()
64
+ self.name
65
+ end
66
+
67
+ def writable?()
68
+ true
69
+ end
70
+ def write_url
71
+ @write_url
72
+ end
73
+ def write_url=(value)
74
+ if (value != @url)
75
+ @write_url = value
76
+ FileUtils.rm_r("#{@cachepath}/#{@component.name}")
77
+ retval = Simp::Metadata.download_component(@component, {"target" => @cachepath, "url" => value})
78
+ load_from_dir(retval["path"])
79
+ end
80
+ end
81
+ def release(version)
82
+ if (self.releases.key?(version))
83
+ self.releases[version]
84
+ else
85
+ {}
86
+ end
87
+ end
88
+
89
+ def delete_release(version)
90
+ if (@releases.key?(version))
91
+ self.dirty = true
92
+ @releases.delete(version)
93
+ end
94
+ end
95
+
96
+ def create_release(destination, source = 'master')
97
+ if (@releases.key?(destination))
98
+ raise "destination version #{destination} already exists"
99
+ end
100
+ unless (@releases.key?(source))
101
+ raise "source version #{source} doesn't exist"
102
+ end
103
+ self.dirty = true
104
+ @releases[destination] = Marshal.load(Marshal.dump(@releases[source]))
105
+ end
106
+
107
+ def dirty?()
108
+ @dirty
109
+ end
110
+
111
+ def dirty=(value)
112
+ @dirty = value
113
+ end
114
+
115
+ def save(message = "Auto-saving using simp-metadata")
116
+ if (self.dirty? == true)
117
+ puts @load_path
118
+ # XXX ToDo: Write files to yaml, commit and push (where appropriate)
119
+
120
+
121
+
122
+ Simp::Metadata.run("cd #{@load_path} && rm -rf v1")
123
+ FileUtils.mkdir_p("#{@load_path}/v1")
124
+ File.open("#{@load_path}/v1/components.yaml", 'w') {|file| file.write({"components" => @components}.to_yaml)}
125
+ @releases.each do |releasename, data|
126
+ directory = "releases"
127
+ case releasename
128
+ when /.*-[Aa][Ll][Pp][Hh][Aa].*/
129
+ directory = "prereleases"
130
+ when /.*-[Bb][Ee][Tt][Aa].*/
131
+ directory = "prereleases"
132
+ when /.*-[Rr][Cc].*/
133
+ directory = "prereleases"
134
+ when /^nightly\-/
135
+ directory = "nightlies"
136
+ when /develop/
137
+ directory = "channels"
138
+ when /development/
139
+ directory = "channels"
140
+ when /master/
141
+ directory = "channels"
142
+ when /^test\-/
143
+ directory = "tests"
144
+ else
145
+ directory = "releases"
146
+ end
147
+ FileUtils.mkdir_p("#{@load_path}/v1/#{directory}")
148
+ File.open("#{@load_path}/v1/#{directory}/#{releasename}.yaml", 'w') {|file| file.write({"releases" => {"#{releasename}" => data}}.to_yaml)}
149
+ end
150
+ Simp::Metadata.run("cd #{@load_path} && git remote add upstream #{write_url}")
151
+ Simp::Metadata.run("cd #{@load_path} && git remote set-url upstream #{write_url}")
152
+ exitcode = Simp::Metadata.run("cd #{@load_path} && git add -A && git commit -m '#{message}'; git push upstream master")
153
+ if (exitcode != 0)
154
+ Simp::Metadata.critical("error committing changes")
155
+ raise "#{exitcode}"
156
+ else
157
+ puts "Successfully updated #{name}"
158
+ end
159
+ self.dirty = false
160
+ end
161
+ end
162
+
163
+ def load_from_dir(path)
164
+ @load_path = path
165
+ Dir.chdir(path) do
166
+ Dir.glob("**/*.yaml") do |filename|
167
+ begin
168
+ hash = YAML.load_file(filename)
169
+ @data = deep_merge(@data, hash)
170
+ end
171
+ end
172
+ end
173
+ unless @data['releases'] == nil
174
+ @releases = @data['releases']
175
+ end
176
+ unless @data['components'] == nil
177
+ @components = @data['components']
178
+ end
179
+ end
180
+
181
+ def deep_merge(target_hash, source_hash)
182
+ source_hash.each do |key, value|
183
+ if (target_hash.key?(key))
184
+ if (value.class == Hash)
185
+ self.deep_merge(target_hash[key], value)
186
+ else
187
+ target_hash[key] = value
188
+ end
189
+ else
190
+ target_hash[key] = value
191
+ end
192
+ end
193
+ target_hash
194
+ end
195
+
196
+ def cleanup()
197
+ @cleanup.each do |path|
198
+ FileUtils.rmtree(path)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
204
+
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'simp/media'
3
+ require 'simp/media/command'
4
+
5
+ describe Simp::Media::Command do
6
+ xit "Should display help when no options are passed" do
7
+ # Create an output capture system.
8
+ command = Simp::Media::Command.new()
9
+ command.run([])
10
+ end
11
+
12
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'simp/media'
3
+
4
+ describe Simp::Media::Engine do
5
+ it "should throw an error if input_type is nil" do
6
+ expect { engine = Simp::Media::Engine.new({"version" => "test-stub", "input_type" => nil}) }.to raise_error(RuntimeError, "input_type must be specified")
7
+ end
8
+ it "should throw an error if output_type is nil" do
9
+ expect { engine = Simp::Media::Engine.new({"version" => "test-stub", "output_type" => nil}) }.to raise_error(RuntimeError, "output_type must be specified")
10
+ end
11
+ it "should instantiate without errors" do
12
+ tempdir = Dir.mktmpdir("simp-media-rspec")
13
+ engine = Simp::Media::Engine.new({"version" => "test-stub", "edition" => "community", "output_type" => "tar", "output" => "#{tempdir}/test.tgz"})
14
+ expect(engine.loaded?).to match(true)
15
+ engine.cleanup()
16
+ engine = nil
17
+ FileUtils.rmtree(tempdir)
18
+ end
19
+ it "should run without errors" do
20
+ tempdir = Dir.mktmpdir("simp-media-rspec")
21
+ engine = Simp::Media::Engine.new({"version" => "test-stub", "edition" => "community", "output_type" => "tar", "output" => "#{tempdir}/test.tgz"})
22
+ expect(engine.loaded?).to match(true)
23
+ engine.run
24
+ engine.cleanup()
25
+ engine = nil
26
+ FileUtils.rmtree(tempdir)
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'simp/media'
3
+
4
+ describe Simp::Media::Type::Control_repo do
5
+
6
+ it "should throw an error if output is nil" do
7
+ expect { engine = Simp::Media::Engine.new({"version" => "test-stub", "output" => nil}) }.to raise_error(RuntimeError, "output must be specified for control-repo output")
8
+ end
9
+ it "should throw an error if output is not a git repo and it's not a local directory" do
10
+ expect { engine = Simp::Media::Engine.new({"version" => "test-stub", "output" => "https://localhost:6666/repo.git"}) }.to raise_error(RuntimeError, "output is not a valid control-repo")
11
+ end
12
+
13
+ it "should create a bare repo when .git is part of the path" do
14
+ tempdir = Dir.mktmpdir("simp-media-rspec")
15
+ engine = Simp::Media::Engine.new({"version" => "test-stub", "output" => "file://#{tempdir}/control-repo.git"})
16
+ expect(engine.loaded?).to match(true)
17
+ engine.run()
18
+ engine.cleanup()
19
+ engine = nil
20
+ FileUtils.rmtree(tempdir)
21
+ end
22
+
23
+ end