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.
- checksums.yaml +7 -0
- data/README.md +0 -0
- data/Rakefile +69 -0
- data/exe/simp-install +8 -0
- data/exe/simp-media +8 -0
- data/exe/simp-metadata +8 -0
- data/lib/simp/install.rb +0 -0
- data/lib/simp/install/command.rb +70 -0
- data/lib/simp/media.rb +9 -0
- data/lib/simp/media/command.rb +69 -0
- data/lib/simp/media/engine.rb +104 -0
- data/lib/simp/media/type.rb +14 -0
- data/lib/simp/media/type/base.rb +63 -0
- data/lib/simp/media/type/control-repo.rb +211 -0
- data/lib/simp/media/type/internet.rb +38 -0
- data/lib/simp/media/type/iso.rb +9 -0
- data/lib/simp/media/type/local.rb +36 -0
- data/lib/simp/media/type/tar.rb +71 -0
- data/lib/simp/metadata.rb +416 -0
- data/lib/simp/metadata/bootstrap_source.rb +137 -0
- data/lib/simp/metadata/buildinfo.rb +58 -0
- data/lib/simp/metadata/command.rb +92 -0
- data/lib/simp/metadata/commands.rb +21 -0
- data/lib/simp/metadata/commands/base.rb +65 -0
- data/lib/simp/metadata/commands/clone.rb +26 -0
- data/lib/simp/metadata/commands/component.rb +109 -0
- data/lib/simp/metadata/commands/delete.rb +26 -0
- data/lib/simp/metadata/commands/pry.rb +19 -0
- data/lib/simp/metadata/commands/release.rb +47 -0
- data/lib/simp/metadata/commands/releases.rb +24 -0
- data/lib/simp/metadata/commands/save.rb +33 -0
- data/lib/simp/metadata/commands/script.rb +38 -0
- data/lib/simp/metadata/commands/search.rb +65 -0
- data/lib/simp/metadata/commands/set-write-url.rb +19 -0
- data/lib/simp/metadata/commands/set-write.rb +19 -0
- data/lib/simp/metadata/commands/update.rb +46 -0
- data/lib/simp/metadata/component.rb +388 -0
- data/lib/simp/metadata/components.rb +70 -0
- data/lib/simp/metadata/engine.rb +101 -0
- data/lib/simp/metadata/fake_uri.rb +19 -0
- data/lib/simp/metadata/git_ssh_wrapper.sh +6 -0
- data/lib/simp/metadata/location.rb +198 -0
- data/lib/simp/metadata/locations.rb +54 -0
- data/lib/simp/metadata/release.rb +119 -0
- data/lib/simp/metadata/releases.rb +57 -0
- data/lib/simp/metadata/source.rb +204 -0
- data/spec/simp/media/command_spec.rb +12 -0
- data/spec/simp/media/engine_spec.rb +28 -0
- data/spec/simp/media/type/control_repo_spec.rb +23 -0
- data/spec/simp/media/type/internet_spec.rb +29 -0
- data/spec/simp/media/type/iso_spec.rb +15 -0
- data/spec/simp/media/type/local_spec.rb +16 -0
- data/spec/simp/media/type/tar_spec.rb +16 -0
- data/spec/simp/metadata/buildinfo_spec.rb +64 -0
- data/spec/simp/metadata/commands/clone_spec.rb +8 -0
- data/spec/simp/metadata/component_spec.rb +90 -0
- data/spec/simp/metadata/engine_spec.rb +70 -0
- data/spec/simp/metadata/release_spec.rb +104 -0
- data/spec/simp/metadata/source_spec.rb +25 -0
- data/spec/simp/metadata_spec.rb +175 -0
- data/spec/spec_helper.rb +40 -0
- metadata +260 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Simp
|
5
|
+
module Metadata
|
6
|
+
class Bootstrap_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 :components
|
15
|
+
attr_accessor :edition
|
16
|
+
|
17
|
+
def initialize(edition)
|
18
|
+
@releases = {}
|
19
|
+
@components = {}
|
20
|
+
@edition = edition
|
21
|
+
|
22
|
+
case edition
|
23
|
+
when "enterprise"
|
24
|
+
@data = {
|
25
|
+
"components" => {
|
26
|
+
"enterprise-metadata" => {
|
27
|
+
"component-type" => "simp-metadata",
|
28
|
+
"authoritative" => true,
|
29
|
+
"locations" => [
|
30
|
+
{
|
31
|
+
"url" => "simp-enterprise:///enterprise-metadata?version=master&filetype=tgz",
|
32
|
+
"method" => "file",
|
33
|
+
"extract" => true,
|
34
|
+
"primary" => true,
|
35
|
+
}
|
36
|
+
]
|
37
|
+
},
|
38
|
+
"simp-metadata" => {
|
39
|
+
"component-type" => "simp-metadata",
|
40
|
+
"authoritative" => true,
|
41
|
+
"locations" => [
|
42
|
+
{
|
43
|
+
"url" => "https://github.com/simp/simp-metadata",
|
44
|
+
"method" => "git",
|
45
|
+
"primary" => true,
|
46
|
+
}
|
47
|
+
],
|
48
|
+
},
|
49
|
+
}
|
50
|
+
}
|
51
|
+
when "enterprise-only"
|
52
|
+
@data = {
|
53
|
+
"components" => {
|
54
|
+
"enterprise-metadata" => {
|
55
|
+
"component-type" => "simp-metadata",
|
56
|
+
"authoritative" => true,
|
57
|
+
"locations" => [
|
58
|
+
{
|
59
|
+
"url" => "simp-enterprise:///enterprise-metadata?version=master&filetype=tgz",
|
60
|
+
"method" => "file",
|
61
|
+
"extract" => true,
|
62
|
+
"primary" => true,
|
63
|
+
}
|
64
|
+
]
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
else
|
69
|
+
@data = {
|
70
|
+
"components" => {
|
71
|
+
"simp-metadata" => {
|
72
|
+
"component-type" => "simp-metadata",
|
73
|
+
"authoritative" => true,
|
74
|
+
"locations" => [
|
75
|
+
{
|
76
|
+
"url" => "https://github.com/simp/simp-metadata",
|
77
|
+
"method" => "git",
|
78
|
+
"primary" => true,
|
79
|
+
}
|
80
|
+
],
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
end
|
85
|
+
@components = @data['components']
|
86
|
+
end
|
87
|
+
|
88
|
+
def release(version)
|
89
|
+
case edition
|
90
|
+
when "enterprise"
|
91
|
+
{
|
92
|
+
"enterprise-metadata" => {
|
93
|
+
"version" => "master",
|
94
|
+
},
|
95
|
+
"simp-metadata" => {
|
96
|
+
"branch" => "master"
|
97
|
+
}
|
98
|
+
}
|
99
|
+
when "enterprise-only"
|
100
|
+
{
|
101
|
+
"enterprise-metadata" => {
|
102
|
+
"version" => "master",
|
103
|
+
}
|
104
|
+
}
|
105
|
+
else
|
106
|
+
{
|
107
|
+
"simp-metadata" => {
|
108
|
+
"branch" => "master"
|
109
|
+
}
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
# Stub out 'writing' methods as they don't apply to bootstrap_source
|
114
|
+
def create_release(destination, source = 'master')
|
115
|
+
|
116
|
+
end
|
117
|
+
def writable?()
|
118
|
+
false
|
119
|
+
end
|
120
|
+
def dirty?()
|
121
|
+
false
|
122
|
+
end
|
123
|
+
def save()
|
124
|
+
true
|
125
|
+
end
|
126
|
+
def cleanup()
|
127
|
+
end
|
128
|
+
def to_s()
|
129
|
+
self.name
|
130
|
+
end
|
131
|
+
def name()
|
132
|
+
"bootstrap_metadata"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Simp
|
2
|
+
module Metadata
|
3
|
+
class Buildinfo
|
4
|
+
include Enumerable
|
5
|
+
attr_accessor :type
|
6
|
+
attr_accessor :component
|
7
|
+
|
8
|
+
def initialize(component, type)
|
9
|
+
@type = type
|
10
|
+
@component = component
|
11
|
+
end
|
12
|
+
|
13
|
+
def keys()
|
14
|
+
["type", "build_method"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def [] (index)
|
18
|
+
self.send index.to_sym
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
self.keys.each do |key|
|
23
|
+
yield key, self[key]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def fetch_data
|
28
|
+
component.fetch_data("buildinfo")
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_defaults
|
32
|
+
{
|
33
|
+
"rpm" => {
|
34
|
+
"build_method" => "simp-core",
|
35
|
+
}
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_method()
|
40
|
+
buildinfo = self.fetch_data
|
41
|
+
if (buildinfo == nil)
|
42
|
+
retval = method_defaults[type]["build_method"]
|
43
|
+
else
|
44
|
+
if (buildinfo.key?(type))
|
45
|
+
if (buildinfo[type].key?("build_method"))
|
46
|
+
retval = buildinfo[type]["build_method"]
|
47
|
+
else
|
48
|
+
retval = method_defaults[type]["build_method"]
|
49
|
+
end
|
50
|
+
else
|
51
|
+
retval = method_defaults[type]["build_method"]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
return retval
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'simp/metadata/commands'
|
2
|
+
require 'simp/metadata'
|
3
|
+
|
4
|
+
module Simp
|
5
|
+
module Metadata
|
6
|
+
class Command
|
7
|
+
def run(argv)
|
8
|
+
command = argv[0]
|
9
|
+
argv.shift
|
10
|
+
# XXX ToDo: Make this dynamic, just instantiate a class named the subcommand
|
11
|
+
if (command != "")
|
12
|
+
if (command == "-h" || command == "help")
|
13
|
+
self.help()
|
14
|
+
else
|
15
|
+
unless (command =~ /^#/)
|
16
|
+
begin
|
17
|
+
cmd = Module.const_get("Simp::Metadata::Commands::#{command.gsub("-", "_").capitalize}").new()
|
18
|
+
|
19
|
+
rescue
|
20
|
+
Simp::Metadata.critical("Unable to find command: #{command}")
|
21
|
+
self.help
|
22
|
+
exit 4
|
23
|
+
end
|
24
|
+
cmd.run(argv)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else
|
28
|
+
self.help()
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def help()
|
33
|
+
puts "Usage: simp-metadata [command] [options]"
|
34
|
+
# XXX: ToDo: make this dynamic...
|
35
|
+
subcommands = [
|
36
|
+
[
|
37
|
+
"clone",
|
38
|
+
"Clones one simp release into another",
|
39
|
+
],
|
40
|
+
[
|
41
|
+
"component",
|
42
|
+
"create, view, or update a component",
|
43
|
+
],
|
44
|
+
[
|
45
|
+
"delete",
|
46
|
+
"deletes a release",
|
47
|
+
],
|
48
|
+
[
|
49
|
+
"pry",
|
50
|
+
"opens up pry debugger",
|
51
|
+
],
|
52
|
+
[
|
53
|
+
"release",
|
54
|
+
"views components of a release",
|
55
|
+
],
|
56
|
+
[
|
57
|
+
"releases",
|
58
|
+
"lists all releases",
|
59
|
+
],
|
60
|
+
[
|
61
|
+
"save",
|
62
|
+
"Saves metadata changes",
|
63
|
+
],
|
64
|
+
[
|
65
|
+
"script",
|
66
|
+
"Execute a script containing multiple commands",
|
67
|
+
],
|
68
|
+
[
|
69
|
+
"search",
|
70
|
+
"searches for components based on attributes",
|
71
|
+
],
|
72
|
+
[
|
73
|
+
"set-write",
|
74
|
+
"Sets which metadata repo to write to if there are multiple",
|
75
|
+
],
|
76
|
+
[
|
77
|
+
"set-write-url",
|
78
|
+
"view/update/create a component",
|
79
|
+
],
|
80
|
+
[
|
81
|
+
"update",
|
82
|
+
"updates a components attributes",
|
83
|
+
]
|
84
|
+
]
|
85
|
+
subcommands.each do |components|
|
86
|
+
output_string = "#{(components[0].ljust(38)).rjust(42)}#{components[1]}"
|
87
|
+
puts output_string
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# XXX ToDo: Dynamically load all files
|
2
|
+
require 'simp/metadata/commands/base'
|
3
|
+
require 'simp/metadata/commands/release'
|
4
|
+
require 'simp/metadata/commands/releases'
|
5
|
+
require 'simp/metadata/commands/save'
|
6
|
+
require 'simp/metadata/commands/script'
|
7
|
+
require 'simp/metadata/commands/clone'
|
8
|
+
require 'simp/metadata/commands/set-write'
|
9
|
+
require 'simp/metadata/commands/delete'
|
10
|
+
require 'simp/metadata/commands/set-write-url'
|
11
|
+
require 'simp/metadata/commands/update'
|
12
|
+
require 'simp/metadata/commands/component'
|
13
|
+
require 'simp/metadata/commands/pry'
|
14
|
+
require 'simp/metadata/commands/search'
|
15
|
+
|
16
|
+
module Simp
|
17
|
+
module Metadata
|
18
|
+
module Commands
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative '../commands'
|
2
|
+
module Simp
|
3
|
+
module Metadata
|
4
|
+
module Commands
|
5
|
+
class Base
|
6
|
+
def get_engine(engine, options = {})
|
7
|
+
root = false
|
8
|
+
if (options["ssh_key"] != nil)
|
9
|
+
options["ssh_key"] = File.expand_path(options["ssh_key"])
|
10
|
+
end
|
11
|
+
if (engine == nil)
|
12
|
+
root = true
|
13
|
+
metadatarepos = {}
|
14
|
+
if (options["writable_urls"] != nil)
|
15
|
+
array = options["writable_urls"].split(',')
|
16
|
+
elements = array.size / 2;
|
17
|
+
(0...elements).each do |offset|
|
18
|
+
comp = array[offset * 2]
|
19
|
+
url = array[(offset * 2) + 1]
|
20
|
+
metadatarepos[comp] = url
|
21
|
+
end
|
22
|
+
engine = Simp::Metadata::Engine.new(nil, metadatarepos, options["edition"], options)
|
23
|
+
else
|
24
|
+
engine = Simp::Metadata::Engine.new(nil, nil, options["edition"], options)
|
25
|
+
end
|
26
|
+
else
|
27
|
+
root = false
|
28
|
+
end
|
29
|
+
return engine, root
|
30
|
+
end
|
31
|
+
# Defines default arguments for commands
|
32
|
+
def defaults(argv, &block)
|
33
|
+
|
34
|
+
options = {
|
35
|
+
"edition" => ENV.fetch('SIMP_METADATA_EDITION', 'community'),
|
36
|
+
}
|
37
|
+
if (ENV.fetch('SIMP_METADATA_WRITABLE_URLS', nil) != nil)
|
38
|
+
options["writable_urls"] = ENV['SIMP_METADATA_WRITABLE_URLS']
|
39
|
+
end
|
40
|
+
option_parser = OptionParser.new do |opts|
|
41
|
+
opts.banner = "Usage: simp-metadata <command> [options]"
|
42
|
+
opts.on("-d", "--debug [level]", "debug logging level: critical, error, warning, info, debug1, debug2") do |opt|
|
43
|
+
$simp_metadata_debug_level = opt
|
44
|
+
end
|
45
|
+
opts.on("-v", "--version [release]", "release version") do |opt|
|
46
|
+
options["release"] = opt
|
47
|
+
end
|
48
|
+
opts.on("-i", "--identity [ssh_key_file]", "specify ssh_key to be used") do |opt|
|
49
|
+
options["ssh_key"] = opt
|
50
|
+
end
|
51
|
+
opts.on("-w", "--writable-urls [component,url]", "component,url") do |opt|
|
52
|
+
options["writable_urls"] = opt
|
53
|
+
end
|
54
|
+
opts.on("-e", "--edition [edition]", "simp edition") do |opt|
|
55
|
+
options["edition"] = opt
|
56
|
+
end
|
57
|
+
yield(opts) if block_given?
|
58
|
+
end
|
59
|
+
option_parser.parse!(argv)
|
60
|
+
return options
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../commands'
|
2
|
+
module Simp
|
3
|
+
module Metadata
|
4
|
+
module Commands
|
5
|
+
class Clone < Simp::Metadata::Commands::Base
|
6
|
+
def run(argv, engine = nil)
|
7
|
+
|
8
|
+
options = defaults(argv) do |opts|
|
9
|
+
opts.banner = "Usage: simp-metadata clone <source_release> <target_release>"
|
10
|
+
end
|
11
|
+
engine, root = get_engine(engine, options)
|
12
|
+
|
13
|
+
begin
|
14
|
+
engine.releases.create(argv[1], argv[0])
|
15
|
+
if (root == true)
|
16
|
+
engine.save((["simp-metadata", "clone"] + 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,109 @@
|
|
1
|
+
require_relative '../commands'
|
2
|
+
module Simp
|
3
|
+
module Metadata
|
4
|
+
module Commands
|
5
|
+
class Component < Simp::Metadata::Commands::Base
|
6
|
+
|
7
|
+
def run(argv, engine = nil)
|
8
|
+
|
9
|
+
|
10
|
+
begin
|
11
|
+
subcommand = argv[0]
|
12
|
+
case subcommand
|
13
|
+
when "--help", "-h"
|
14
|
+
options = defaults(argv) do |opts|
|
15
|
+
opts.banner = "Usage: simp-metadata component [ create | view | update | diff ]"
|
16
|
+
end
|
17
|
+
when "create"
|
18
|
+
options = defaults(argv) do |opts|
|
19
|
+
opts.banner = "Usage: simp-metadata component create <component_name> name=<value>"
|
20
|
+
end
|
21
|
+
engine, root = get_engine(engine, options)
|
22
|
+
component = argv[1]
|
23
|
+
argv.shift
|
24
|
+
data = {"locations" => [{"primary" => true}]}
|
25
|
+
argv.each do |argument|
|
26
|
+
splitted = argument.split("=")
|
27
|
+
name = splitted[0]
|
28
|
+
value = splitted[1]
|
29
|
+
case name
|
30
|
+
when "authoritative"
|
31
|
+
data["authoritiative"] = value.to_s == "true"
|
32
|
+
when "format"
|
33
|
+
data["format"] = value
|
34
|
+
when "component-type"
|
35
|
+
data["component-type"] = value
|
36
|
+
when "primary_url"
|
37
|
+
data["locations"].first["url"] = value
|
38
|
+
when "primary_url_type"
|
39
|
+
data["locations"].first["type"] = value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
engine.components.create(component, data)
|
43
|
+
when "update"
|
44
|
+
options = defaults(argv) do |opts|
|
45
|
+
opts.banner = "Usage: simp-metadata component update <component> <setting> <value>"
|
46
|
+
end
|
47
|
+
engine, root = get_engine(engine, options)
|
48
|
+
component = argv[1]
|
49
|
+
setting = argv[2]
|
50
|
+
value = argv[3]
|
51
|
+
object = engine.components[component]
|
52
|
+
unless (object.methods.include?(setting.to_sym))
|
53
|
+
Simp::Metadata.critical("#{setting} is not a valid setting")
|
54
|
+
exit 7
|
55
|
+
end
|
56
|
+
begin
|
57
|
+
object.send("#{setting}=".to_sym, value)
|
58
|
+
rescue NoMethodError => ex
|
59
|
+
Simp::Metadata.critical("#{setting} is a read-only setting")
|
60
|
+
exit 6
|
61
|
+
end
|
62
|
+
|
63
|
+
when "view"
|
64
|
+
options = defaults(argv) do |opts|
|
65
|
+
opts.banner = "Usage: simp-metadata component view <component> [attribute]"
|
66
|
+
end
|
67
|
+
engine, root = get_engine(engine, options)
|
68
|
+
component = argv[1]
|
69
|
+
attribute = argv[2]
|
70
|
+
if (engine.components.key?(component))
|
71
|
+
if (options["release"] == nil)
|
72
|
+
comp = engine.components[component]
|
73
|
+
else
|
74
|
+
comp = engine.releases[options["release"]].components[component]
|
75
|
+
end
|
76
|
+
view = comp.view(attribute)
|
77
|
+
puts view.to_yaml
|
78
|
+
else
|
79
|
+
Simp::Metadata.critical("Unable to find component named #{component}")
|
80
|
+
exit 5
|
81
|
+
end
|
82
|
+
|
83
|
+
when "diff"
|
84
|
+
options = defaults(argv) do |opts|
|
85
|
+
opts.banner = "Usage: simp-metadata component diff <release1> <release2> <component> [attribute]"
|
86
|
+
end
|
87
|
+
engine, root = get_engine(engine, options)
|
88
|
+
release1 = argv[1]
|
89
|
+
release2 = argv[2]
|
90
|
+
component = argv[3]
|
91
|
+
attribute = argv[4]
|
92
|
+
component1 = engine.releases[release1].components[component]
|
93
|
+
component2 = engine.releases[release2].components[component]
|
94
|
+
diff = component1.diff(component2, attribute)
|
95
|
+
puts diff.to_yaml
|
96
|
+
end
|
97
|
+
|
98
|
+
if (root == true)
|
99
|
+
engine.save((["simp-metadata", "component"] + argv).join(" "))
|
100
|
+
end
|
101
|
+
rescue RuntimeError => e
|
102
|
+
Simp::Metadata.critical(e.message)
|
103
|
+
exit 5
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|