simp-metadata 0.4.3

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.
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,26 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Delete < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do | opts|
9
+ opts.banner = "Usage: simp-metadata delete <component_name>"
10
+ end
11
+
12
+ engine, root = get_engine(engine, options)
13
+ begin
14
+ engine.releases.delete(argv[0])
15
+ if (root == true)
16
+ engine.save((["simp-metadata", "delete"] + argv).join(" "))
17
+ end
18
+ rescue RuntimeError => e
19
+ Simp::Metadata.critical(e.message)
20
+ exit 5
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Pry < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata pry"
10
+ end
11
+
12
+ engine, root = get_engine(engine, options)
13
+ require 'pry'
14
+ binding.pry
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Release < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata release <release_name> [components]"
10
+ opts.banner = " simp-metadata release diff <release1> <release2>"
11
+ end
12
+
13
+
14
+ engine, root = get_engine(engine, options)
15
+ begin
16
+ section = argv[0]
17
+ case section
18
+ when "components"
19
+ puts engine.releases[options["release"]].components.keys.join("\n")
20
+
21
+ when "puppetfile"
22
+ type = argv[1]
23
+ puts engine.releases[options["release"]].puppetfile({ "type" => type})
24
+
25
+ when "diff"
26
+ release1 = argv[1]
27
+ release2 = argv[2]
28
+ attribute = argv[3]
29
+ release1 = engine.releases[release1]
30
+ release2 = engine.releases[release2]
31
+ diff = release1.diff(release2, attribute)
32
+ puts diff.to_yaml
33
+ else
34
+ puts "components:"
35
+ engine.releases[options["release"]].components.keys.each do |line|
36
+ puts " #{line}"
37
+ end
38
+ end
39
+ rescue RuntimeError => e
40
+ Simp::Metadata.critical(e.message)
41
+ exit 5
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Releases < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata releases"
10
+ end
11
+
12
+
13
+ engine, root = get_engine(engine, options)
14
+ begin
15
+ puts engine.releases.keys
16
+ rescue RuntimeError => e
17
+ Simp::Metadata.critical(e.message)
18
+ exit 5
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Save < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata save [options] [message]"
10
+ end
11
+
12
+
13
+ engine, root = get_engine(engine, options)
14
+ if (argv.size == 0)
15
+ short = "Auto-saving using simp-metadata"
16
+ else
17
+ short = argv.join(" ")
18
+ end
19
+ if ($commandqueue != nil)
20
+ message = []
21
+ while $commandqueue.empty?() == false
22
+ message << $commandqueue.pop
23
+ end
24
+ puts message
25
+ engine.save("#{short}\n\nsimp-metadata log:\n #{message.join("\n ")}")
26
+ else
27
+ engine.save(short)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ require 'optparse'
2
+ require_relative '../commands'
3
+
4
+ module Simp
5
+ module Metadata
6
+ module Commands
7
+ class Script < Simp::Metadata::Commands::Base
8
+ def run(argv, engine = nil)
9
+
10
+ options = defaults(argv) do |opts|
11
+ opts.banner = "Usage: simp-metadata script [options] <filename>"
12
+ end
13
+
14
+ $commandqueue = Queue.new();
15
+
16
+ engine, root = get_engine(engine, options)
17
+ unless (argv[0] != nil)
18
+ Simp::Metadata.critical("filename must be specified")
19
+ exit 3
20
+ end
21
+ data = File.read(argv[0])
22
+ lines = data.split("\n")
23
+ lines.each do |line|
24
+ temp_argv = line.split(" ")
25
+ unless (temp_argv.size == 0)
26
+ unless (temp_argv[0] =~ /^#/)
27
+ $commandqueue.push(line);
28
+ command = Module.const_get("Simp::Metadata::Commands::#{temp_argv[0].gsub("-","_").capitalize}").new()
29
+ temp_argv.shift
30
+ command.run(temp_argv, engine)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,65 @@
1
+ require 'cgi'
2
+ require_relative '../commands'
3
+
4
+ module Simp
5
+ module Metadata
6
+ module Commands
7
+ class Search < Simp::Metadata::Commands::Base
8
+
9
+ def run(argv, engine = nil)
10
+
11
+ options = defaults(argv) do |opts|
12
+ opts.banner = "Usage: simp-metadata search <attribute>=<value>\n(supports multiple attributes as well as encoded URLs)"
13
+ end
14
+
15
+ engine, root = get_engine(engine, options)
16
+ begin
17
+ data = {}
18
+ argv.each do |argument|
19
+ splitted = argument.split("=")
20
+ name = splitted[0]
21
+ value = splitted[1]
22
+ case name
23
+ when name
24
+ data[name] = value
25
+ end
26
+ end
27
+ unless (data == {}) or data.nil?
28
+ data.each do |key, value|
29
+ if value == "" or value.nil?
30
+ puts "No value specified for #{key}"
31
+ exit
32
+ end
33
+ end
34
+ engine.components.each do |component|
35
+
36
+ result = data.all? do |key, value|
37
+ if key == "url"
38
+ component.locations.any? do |location|
39
+ location.url == value or location.url == CGI.unescape(value)
40
+ end
41
+ else
42
+ component[key] == value or component[key] == CGI.unescape(value)
43
+ end
44
+ end
45
+
46
+ if result
47
+ puts component.name
48
+ end
49
+ end
50
+ else
51
+ puts "No search parameters specified"
52
+ end
53
+ if (root == true)
54
+ engine.save
55
+ end
56
+ rescue RuntimeError => e
57
+ Simp::Metadata.critical(e.message)
58
+ exit 5
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,19 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Set_write_url < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata set-write-url <repo_name> <url>"
10
+ end
11
+
12
+
13
+ engine, root = get_engine(engine, options)
14
+ engine.writable_url(argv[0], argv[1])
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Set_write < Simp::Metadata::Commands::Base
6
+ def run(argv, engine = nil)
7
+
8
+ options = defaults(argv) do |opts|
9
+ opts.banner = "Usage: simp-metadata set-write [options]"
10
+ end
11
+
12
+
13
+ engine, root = get_engine(engine, options)
14
+ engine.writable_source_name = argv[0]
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../commands'
2
+ module Simp
3
+ module Metadata
4
+ module Commands
5
+ class Update < Simp::Metadata::Commands::Base
6
+
7
+ def run(argv, engine = nil)
8
+
9
+ options = defaults(argv) do |opts|
10
+ opts.banner = "Usage: simp-metadata update <component> <setting> <value>"
11
+ end
12
+
13
+
14
+ engine, root = get_engine(engine, options)
15
+ begin
16
+ component = argv[0]
17
+ setting = argv[1]
18
+ value = argv[2]
19
+ if (options["release"] == nil)
20
+ object = engine.components[component]
21
+ else
22
+ object = engine.releases[options["release"]].components[component]
23
+ end
24
+ unless (object.methods.include?(setting.to_sym))
25
+ Simp::Metadata.critical("#{setting} is not a valid setting")
26
+ exit 7
27
+ end
28
+ begin
29
+ object.send("#{setting}=".to_sym, value)
30
+ rescue NoMethodError => ex
31
+ Simp::Metadata.critical("#{setting} is a read-only setting")
32
+ exit 6
33
+ end
34
+
35
+ if (root == true)
36
+ engine.save((["simp-metadata", "update"] + argv).join(" "))
37
+ end
38
+ rescue RuntimeError => e
39
+ Simp::Metadata.critical(e.message)
40
+ exit 5
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,388 @@
1
+ module Simp
2
+ module Metadata
3
+ class Component
4
+ include Enumerable
5
+ attr_accessor :engine
6
+ attr_accessor :release_version
7
+
8
+ def initialize(engine, name, version)
9
+ @engine = engine
10
+ @name = name
11
+ @release_version = version
12
+ end
13
+
14
+ def to_s
15
+ self.name
16
+ end
17
+
18
+ def name(type = "component")
19
+ case type
20
+ when "component"
21
+ @name
22
+ when "puppetfile"
23
+ if (component_type == "rubygem")
24
+ "rubygem-#{@name.gsub(/\-/, '_')}"
25
+ elsif (component_type == "puppet-module")
26
+ @name.gsub(/pupmod\-/, '')
27
+ else
28
+ @name
29
+ end
30
+ end
31
+ end
32
+
33
+ def component_source()
34
+ retval = engine.sources["bootstrap_metadata"]
35
+ engine.sources.each do |name, source|
36
+ if (source.components != nil)
37
+ if (source.components.key?(self.name))
38
+ retval = source
39
+ break
40
+ end
41
+ end
42
+ end
43
+ return retval
44
+ end
45
+
46
+ def release_source()
47
+ retval = engine.sources["bootstrap_metadata"]
48
+ engine.sources.each do |name, source|
49
+ if (source.releases.key?(release_version))
50
+ if (source.releases[release_version].key?(self.name))
51
+ retval = source
52
+ break
53
+ end
54
+ else
55
+ if (source.release(release_version).key?(self.name))
56
+ retval = source
57
+ break
58
+ end
59
+ end
60
+ end
61
+ return retval
62
+ end
63
+
64
+ #
65
+ # Will be used to grab method based data in the future, rather
66
+ # then calling get_from_release or get_from_component directly,
67
+ #
68
+ # For now, just use it in Simp::Metadata::Buildinfo
69
+ def fetch_data(item)
70
+ component = get_from_component
71
+ release = get_from_release
72
+ if (release.key?(item))
73
+ release[item]
74
+ else
75
+ component[item]
76
+ end
77
+ end
78
+
79
+ def get_from_component()
80
+ return self.component_source.components[self.name]
81
+ end
82
+
83
+ def get_from_release()
84
+ retval = {}
85
+ if (self.release_source.releases.key?(release_version))
86
+ if (self.release_source.releases[release_version].key?(self.name))
87
+ retval = self.release_source.releases[release_version][self.name]
88
+ end
89
+ else
90
+ if (self.release_source.release(release_version).key?(self.name))
91
+ retval = self.release_source.release(release_version)[self.name]
92
+ end
93
+ end
94
+ return retval
95
+ end
96
+
97
+ def type
98
+ get_from_component["type"]
99
+ end
100
+
101
+ def extension
102
+ if (self.real_extension == nil)
103
+ case (self.component_type)
104
+ when "simp-metadata"
105
+ "tgz"
106
+ when "logstash-filter"
107
+ "gem"
108
+ when "rubygem"
109
+ "gem"
110
+ when "grafana-plugin"
111
+ "zip"
112
+ when "puppet-module"
113
+ "tgz"
114
+ else
115
+ ""
116
+ end
117
+ else
118
+ self.real_extension
119
+ end
120
+ end
121
+
122
+ def keys()
123
+ ["component_type", "authoritative", "asset_name", "extension", "format", "module_name", "type", "url", "method", "extract", "branch", "tag", "ref", "version", "release_source", "component_source"]
124
+ end
125
+
126
+ def [] (index)
127
+ self.send index.to_sym
128
+ end
129
+
130
+ def each(&block)
131
+ self.keys.each do |key|
132
+ yield key, self[key]
133
+ end
134
+ end
135
+
136
+ def real_extension
137
+ get_from_component["extension"]
138
+ end
139
+
140
+ def real_asset_name
141
+ case self.component_type
142
+ when "puppet-module"
143
+ get_from_component["module_name"]
144
+ when "rubygem"
145
+ get_from_component["gem_name"]
146
+ else
147
+ get_from_component["asset_name"]
148
+ end
149
+ end
150
+
151
+ def module_name
152
+ asset_name
153
+ end
154
+
155
+ def asset_name
156
+ if (self.real_asset_name == nil)
157
+ case self.component_type
158
+ when "puppet-module"
159
+ splitted = self.name.split("-")
160
+ splitted[splitted.size - 1]
161
+ else
162
+ self.name
163
+ end
164
+ else
165
+ self.real_asset_name
166
+ end
167
+ end
168
+
169
+
170
+ def output_type
171
+ if (self.compiled?)
172
+ return :file
173
+ else
174
+ return :directory
175
+ end
176
+ end
177
+
178
+ def output_filename
179
+ if (self.compiled?)
180
+ return "#{self.name}-#{self.version}.#{self.extension}"
181
+ else
182
+ return self.name
183
+ end
184
+ end
185
+
186
+ def primary
187
+ self.locations.primary
188
+ end
189
+
190
+ def url
191
+ self.locations.primary.url
192
+ end
193
+
194
+ def method
195
+ self.locations.primary.method
196
+ end
197
+
198
+ def extract
199
+ self.locations.primary.extract
200
+ end
201
+
202
+ def locations
203
+ # XXX: ToDo Allow manifest.yaml to override locations
204
+ # XXX: ToDo Use primary_source and mirrors here if locations is empty
205
+ Simp::Metadata::Locations.new({"locations" => get_from_component["locations"], "primary_source" => get_from_component["primary_source"], "mirrors" => get_from_component["mirrors"]}, self)
206
+ end
207
+
208
+ # XXX: ToDo Generate a filename, and output file type; ie, directory or file
209
+
210
+
211
+ def format
212
+ get_from_component["format"]
213
+ end
214
+
215
+ def component_type
216
+ get_from_component["component-type"]
217
+ end
218
+
219
+ def authoritative?
220
+ get_from_component["authoritative"]
221
+ end
222
+
223
+ def authoritative
224
+ get_from_component["authoritative"]
225
+ end
226
+
227
+ def ref
228
+ get_from_release["ref"]
229
+ end
230
+
231
+ def ref=(value)
232
+ release = self.release_source.releases[release_version]
233
+ if (release != nil)
234
+ if (release.key?(name))
235
+ release[name]["ref"] = value
236
+ else
237
+ release[name] = {"ref" => value}
238
+ end
239
+ end
240
+ self.release_source.dirty = true
241
+ end
242
+
243
+ def branch
244
+ get_from_release["branch"]
245
+ end
246
+
247
+ def branch=(value)
248
+ release = self.release_source.releases[release_version]
249
+ if (release != nil)
250
+ if (release.key?(name))
251
+ release[name]["branch"] = value
252
+ else
253
+ release[name] = {"branch" => value}
254
+ end
255
+ end
256
+ self.release_source.dirty = true
257
+ end
258
+
259
+ def tag
260
+ get_from_release["tag"]
261
+ end
262
+
263
+ def tag=(value)
264
+ release = self.release_source.releases[release_version]
265
+ if (release != nil)
266
+ if (release.key?(name))
267
+ release[name]["tag"] = value
268
+ else
269
+ release[name] = {"tag" => value}
270
+ end
271
+ end
272
+ self.release_source.dirty = true
273
+ end
274
+
275
+ def version
276
+ ver = ""
277
+ ["version", "tag", "ref", "branch"].each do |item|
278
+ if (get_from_release[item] != nil)
279
+ ver = get_from_release[item]
280
+ break
281
+ end
282
+ end
283
+ return ver
284
+ end
285
+
286
+ def rpm_basename
287
+ if component_type == 'puppet-module'
288
+ if name.match(/pupmod-*/)
289
+ "#{name}"
290
+ else
291
+ "pupmod-#{name}"
292
+ end
293
+ else
294
+ "#{name}"
295
+ end
296
+ end
297
+
298
+ def rpm_version
299
+ if version.match(/[v][0-9]+.[0-9]+.[0-9]+/)
300
+ version.split('v')[1]
301
+ else
302
+ version
303
+ end
304
+ end
305
+
306
+ def rpm_name
307
+ "#{rpm_basename}-#{rpm_version}.rpm"
308
+ end
309
+
310
+ def compiled?
311
+ if get_from_release.key?("compiled")
312
+ get_from_release["compiled"]
313
+ else
314
+ false
315
+ end
316
+ end
317
+
318
+ def binaryname
319
+ "#{asset_name}-#{version}.#{extension}"
320
+ end
321
+
322
+ def view(attribute)
323
+ comp = self
324
+ view_hash = {}
325
+ if attribute.nil?
326
+ comp.each do |key, value|
327
+ unless value.nil? or value == ""
328
+ view_hash[key] = value.to_s
329
+ end
330
+ end
331
+ location_hash = {}
332
+ comp.locations.each do |location|
333
+ location.each do |key, value|
334
+ unless value.nil?
335
+ location_hash.merge!(key => value.to_s)
336
+ end
337
+ end
338
+ end
339
+ buildinfo_hash = {}
340
+ comp.buildinfo.each do |buildinfo|
341
+ buildinfo.each do |key, value|
342
+ end
343
+ end
344
+ view_hash['location'] = location_hash
345
+ else
346
+ view_hash[attribute] = comp[attribute].to_s
347
+ end
348
+ return view_hash
349
+ end
350
+
351
+ def diff(component, attribute)
352
+ diff = {}
353
+
354
+ if attribute.nil?
355
+ current_hash = {}
356
+ comp_hash = {}
357
+ self.each do |attribute, value|
358
+ current_hash.merge!(attribute => value)
359
+ end
360
+ component.each do |attribute, value|
361
+ comp_hash.merge!(attribute => value)
362
+ end
363
+ unless current_hash == comp_hash
364
+ current_hash.each do |attribute, value|
365
+ diff[attribute] = {"original" => "#{current_hash[attribute]}",
366
+ "changed" => "#{comp_hash[attribute]}"} if comp_hash[attribute] != value
367
+ end
368
+ end
369
+ return diff
370
+ else
371
+ v1 = self["#{attribute}"]
372
+ v2 = component["#{attribute}"]
373
+ unless (v1 == v2)
374
+ diff[attribute] = {"original" => "#{v1}", "changed" => "#{v2}"}
375
+ return diff
376
+ end
377
+ end
378
+ end
379
+ def buildinfo(type = nil)
380
+ if (type == nil)
381
+ {}
382
+ else
383
+ Simp::Metadata::Buildinfo.new(self, type)
384
+ end
385
+ end
386
+ end
387
+ end
388
+ end