vanagon 0.3.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +175 -0
- data/bin/build +33 -0
- data/bin/devkit +22 -0
- data/bin/repo +26 -0
- data/bin/ship +15 -0
- data/lib/vanagon.rb +8 -0
- data/lib/vanagon/common.rb +2 -0
- data/lib/vanagon/common/pathname.rb +87 -0
- data/lib/vanagon/common/user.rb +25 -0
- data/lib/vanagon/component.rb +157 -0
- data/lib/vanagon/component/dsl.rb +307 -0
- data/lib/vanagon/component/source.rb +66 -0
- data/lib/vanagon/component/source/git.rb +60 -0
- data/lib/vanagon/component/source/http.rb +158 -0
- data/lib/vanagon/driver.rb +112 -0
- data/lib/vanagon/engine/base.rb +82 -0
- data/lib/vanagon/engine/docker.rb +40 -0
- data/lib/vanagon/engine/local.rb +40 -0
- data/lib/vanagon/engine/pooler.rb +85 -0
- data/lib/vanagon/errors.rb +28 -0
- data/lib/vanagon/extensions/string.rb +11 -0
- data/lib/vanagon/optparse.rb +62 -0
- data/lib/vanagon/platform.rb +245 -0
- data/lib/vanagon/platform/deb.rb +71 -0
- data/lib/vanagon/platform/dsl.rb +293 -0
- data/lib/vanagon/platform/osx.rb +100 -0
- data/lib/vanagon/platform/rpm.rb +76 -0
- data/lib/vanagon/platform/rpm/wrl.rb +39 -0
- data/lib/vanagon/platform/solaris_10.rb +182 -0
- data/lib/vanagon/platform/solaris_11.rb +138 -0
- data/lib/vanagon/platform/swix.rb +35 -0
- data/lib/vanagon/project.rb +251 -0
- data/lib/vanagon/project/dsl.rb +218 -0
- data/lib/vanagon/utilities.rb +299 -0
- data/spec/fixures/component/invalid-test-fixture.json +3 -0
- data/spec/fixures/component/mcollective.service +1 -0
- data/spec/fixures/component/test-fixture.json +4 -0
- data/spec/lib/vanagon/common/pathname_spec.rb +103 -0
- data/spec/lib/vanagon/common/user_spec.rb +36 -0
- data/spec/lib/vanagon/component/dsl_spec.rb +443 -0
- data/spec/lib/vanagon/component/source/git_spec.rb +19 -0
- data/spec/lib/vanagon/component/source/http_spec.rb +43 -0
- data/spec/lib/vanagon/component/source_spec.rb +99 -0
- data/spec/lib/vanagon/component_spec.rb +22 -0
- data/spec/lib/vanagon/engine/base_spec.rb +40 -0
- data/spec/lib/vanagon/engine/docker_spec.rb +40 -0
- data/spec/lib/vanagon/engine/pooler_spec.rb +54 -0
- data/spec/lib/vanagon/platform/deb_spec.rb +60 -0
- data/spec/lib/vanagon/platform/dsl_spec.rb +128 -0
- data/spec/lib/vanagon/platform/rpm_spec.rb +41 -0
- data/spec/lib/vanagon/platform/solaris_11_spec.rb +44 -0
- data/spec/lib/vanagon/platform_spec.rb +53 -0
- data/spec/lib/vanagon/project/dsl_spec.rb +203 -0
- data/spec/lib/vanagon/project_spec.rb +44 -0
- data/spec/lib/vanagon/utilities_spec.rb +140 -0
- data/templates/Makefile.erb +116 -0
- data/templates/deb/changelog.erb +5 -0
- data/templates/deb/conffiles.erb +3 -0
- data/templates/deb/control.erb +21 -0
- data/templates/deb/dirs.erb +3 -0
- data/templates/deb/docs.erb +1 -0
- data/templates/deb/install.erb +3 -0
- data/templates/deb/postinst.erb +46 -0
- data/templates/deb/postrm.erb +15 -0
- data/templates/deb/prerm.erb +17 -0
- data/templates/deb/rules.erb +25 -0
- data/templates/osx/postinstall.erb +24 -0
- data/templates/osx/preinstall.erb +19 -0
- data/templates/osx/project-installer.xml.erb +19 -0
- data/templates/rpm/project.spec.erb +217 -0
- data/templates/solaris/10/depend.erb +3 -0
- data/templates/solaris/10/pkginfo.erb +13 -0
- data/templates/solaris/10/postinstall.erb +37 -0
- data/templates/solaris/10/preinstall.erb +7 -0
- data/templates/solaris/10/preremove.erb +6 -0
- data/templates/solaris/10/proto.erb +5 -0
- data/templates/solaris/11/p5m.erb +73 -0
- metadata +172 -0
@@ -0,0 +1,245 @@
|
|
1
|
+
require 'vanagon/platform/dsl'
|
2
|
+
|
3
|
+
class Vanagon
|
4
|
+
class Platform
|
5
|
+
attr_accessor :make, :servicedir, :defaultdir, :provisioning, :num_cores, :tar
|
6
|
+
attr_accessor :build_dependencies, :name, :vmpooler_template, :cflags, :ldflags, :settings
|
7
|
+
attr_accessor :servicetype, :patch, :architecture, :codename, :os_name, :os_version
|
8
|
+
attr_accessor :docker_image, :ssh_port, :rpmbuild, :install, :platform_triple
|
9
|
+
|
10
|
+
# Platform names currently contain some information about the platform. Fields
|
11
|
+
# within the name are delimited by the '-' character, and this regex can be used to
|
12
|
+
# extract those fields.
|
13
|
+
PLATFORM_REGEX = /^(.*)-(.*)-(.*)$/
|
14
|
+
|
15
|
+
# Loads a given platform from the configdir
|
16
|
+
#
|
17
|
+
# @param name [String] the name of the platform
|
18
|
+
# @param configdir [String] the path to the platform config file
|
19
|
+
# @return [Vanagon::Platform] the platform as specified in the platform config
|
20
|
+
# @raise if the instance_eval on Platform fails, the exception is reraised
|
21
|
+
def self.load_platform(name, configdir)
|
22
|
+
platfile = File.join(configdir, "#{name}.rb")
|
23
|
+
code = File.read(platfile)
|
24
|
+
dsl = Vanagon::Platform::DSL.new(name)
|
25
|
+
dsl.instance_eval(code, __FILE__, __LINE__)
|
26
|
+
dsl._platform
|
27
|
+
rescue => e
|
28
|
+
puts "Error loading platform '#{name}' using '#{platfile}':"
|
29
|
+
puts e
|
30
|
+
puts e.backtrace.join("\n")
|
31
|
+
raise e
|
32
|
+
end
|
33
|
+
|
34
|
+
# Generate the scripts required to add a group to the package generated.
|
35
|
+
# This will also update the group if it has changed.
|
36
|
+
#
|
37
|
+
# @param user [Vanagon::Common::User] the user to reference for the group
|
38
|
+
# @return [String] the commands required to add a group to the system
|
39
|
+
def add_group(user)
|
40
|
+
cmd_args = ["'#{user.group}'"]
|
41
|
+
cmd_args.unshift '--system' if user.is_system
|
42
|
+
|
43
|
+
groupadd_args = cmd_args.join "\s"
|
44
|
+
groupmod_args = (cmd_args - ["--system"]).join "\s"
|
45
|
+
|
46
|
+
return <<-HERE.undent
|
47
|
+
if getent group '#{user.group}' > /dev/null 2>&1; then
|
48
|
+
/usr/sbin/groupmod #{groupmod_args}
|
49
|
+
else
|
50
|
+
/usr/sbin/groupadd #{groupadd_args}
|
51
|
+
fi
|
52
|
+
HERE
|
53
|
+
end
|
54
|
+
|
55
|
+
# Generate the scripts required to add a user to the package generated.
|
56
|
+
# This will also update the user if it has changed.
|
57
|
+
#
|
58
|
+
# @param user [Vanagon::Common::User] the user to create
|
59
|
+
# @return [String] the commands required to add a user to the system
|
60
|
+
def add_user(user)
|
61
|
+
cmd_args = ["'#{user.name}'"]
|
62
|
+
cmd_args.unshift "--home '#{user.homedir}'" if user.homedir
|
63
|
+
if user.shell
|
64
|
+
cmd_args.unshift "--shell '#{user.shell}'"
|
65
|
+
elsif user.is_system
|
66
|
+
cmd_args.unshift "--shell '/usr/sbin/nologin'"
|
67
|
+
end
|
68
|
+
cmd_args.unshift "--gid '#{user.group}'" if user.group
|
69
|
+
cmd_args.unshift '--system' if user.is_system
|
70
|
+
|
71
|
+
# Collapse the cmd_args array into a string that can be used
|
72
|
+
# as an argument to `useradd`
|
73
|
+
useradd_args = cmd_args.join "\s"
|
74
|
+
|
75
|
+
# Collapse the cmd_args array into a string that can be used
|
76
|
+
# as an argument to `usermod`; If this is a system account,
|
77
|
+
# then specify it as such for user addition only (strip
|
78
|
+
# --system from usermod_args)
|
79
|
+
usermod_args = (cmd_args - ["--system"]).join "\s"
|
80
|
+
|
81
|
+
return <<-HERE.undent
|
82
|
+
if getent passwd '#{user.name}' > /dev/null 2>&1; then
|
83
|
+
/usr/sbin/usermod #{useradd_args}
|
84
|
+
else
|
85
|
+
/usr/sbin/useradd #{usermod_args}
|
86
|
+
fi
|
87
|
+
HERE
|
88
|
+
end
|
89
|
+
|
90
|
+
# Platform constructor. Takes just the name. Also sets the @name, @os_name,
|
91
|
+
# \@os_version and @architecture instance attributes as a side effect
|
92
|
+
#
|
93
|
+
# @param name [String] name of the platform
|
94
|
+
# @return [Vanagon::Platform] the platform with the given name
|
95
|
+
def initialize(name)
|
96
|
+
@name = name
|
97
|
+
@os_name = os_name
|
98
|
+
@os_version = os_version
|
99
|
+
@architecture = architecture
|
100
|
+
@ssh_port = 22
|
101
|
+
@provisioning = []
|
102
|
+
@install ||= "install"
|
103
|
+
end
|
104
|
+
|
105
|
+
# This allows instance variables to be accessed using the hash lookup syntax
|
106
|
+
def [](key)
|
107
|
+
if instance_variable_get("@#{key}")
|
108
|
+
instance_variable_get("@#{key}")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Sets and gets the name of the operating system for the platform.
|
113
|
+
# Also has the side effect of setting the @os_name instance attribute
|
114
|
+
#
|
115
|
+
# @return [String] the operating system name as specified in the platform
|
116
|
+
def os_name
|
117
|
+
@os_name ||= @name.match(PLATFORM_REGEX)[1]
|
118
|
+
end
|
119
|
+
|
120
|
+
# Sets and gets the version of the operating system for the platform.
|
121
|
+
# Also has the side effect of setting the @os_version instance attribute
|
122
|
+
#
|
123
|
+
# @return [String] the operating system version as specified in the platform
|
124
|
+
def os_version
|
125
|
+
@os_version ||= @name.match(PLATFORM_REGEX)[2]
|
126
|
+
end
|
127
|
+
|
128
|
+
# Sets and gets the architecture of the platform.
|
129
|
+
# Also has the side effect of setting the @architecture instance attribute
|
130
|
+
#
|
131
|
+
# @return [String] the architecture of the platform
|
132
|
+
def architecture
|
133
|
+
@architecture ||= @name.match(PLATFORM_REGEX)[3]
|
134
|
+
end
|
135
|
+
|
136
|
+
# Utility matcher to determine is the platform is a debian variety
|
137
|
+
#
|
138
|
+
# @return [true, false] true if it is a debian variety, false otherwise
|
139
|
+
def is_deb?
|
140
|
+
return !!@name.match(/^(debian|ubuntu|cumulus)-.*$/)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Utility matcher to determine is the platform is a redhat variety or
|
144
|
+
# uses rpm under the hood
|
145
|
+
#
|
146
|
+
# @return [true, false] true if it is a redhat variety or uses rpm
|
147
|
+
# under the hood, false otherwise
|
148
|
+
def is_rpm?
|
149
|
+
return !!@name.match(/^(aix|cisco-wrlinux|el|eos|fedora|huaweios|nxos|sles)-.*$/)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Utility matcher to determine is the platform is an enterprise linux variety
|
153
|
+
#
|
154
|
+
# @return [true, false] true if it is a enterprise linux variety, false otherwise
|
155
|
+
def is_el?
|
156
|
+
return !!@name.match(/^el-.*$/)
|
157
|
+
end
|
158
|
+
|
159
|
+
# Utility matcher to determine is the platform is a sles variety
|
160
|
+
#
|
161
|
+
# @return [true, false] true if it is a sles variety, false otherwise
|
162
|
+
def is_sles?
|
163
|
+
return !!@name.match(/^sles-.*$/)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Utility matcher to determine is the platform is a fedora variety
|
167
|
+
#
|
168
|
+
# @return [true, false] true if it is a fedora variety, false otherwise
|
169
|
+
def is_fedora?
|
170
|
+
return !!@name.match(/^fedora-.*$/)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Utility matcher to determine is the platform is an aix variety
|
174
|
+
#
|
175
|
+
# @return [true, false] true if it is an aix variety, false otherwise
|
176
|
+
def is_aix?
|
177
|
+
return !!@name.match(/^aix-.*$/)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Utility matcher to determine is the platform is an eos variety
|
181
|
+
#
|
182
|
+
# @return [true, false] true if it is an eos variety, false otherwise
|
183
|
+
def is_eos?
|
184
|
+
return !!@name.match(/^eos-.*$/)
|
185
|
+
end
|
186
|
+
|
187
|
+
# Utility matcher to determine is the platform is a HuaweiOS variety
|
188
|
+
#
|
189
|
+
# @return [true, false] true if it is a HuaweiOS variety, false otherwise
|
190
|
+
def is_huaweios?
|
191
|
+
return !!@name.match(/^huaweios-.*$/)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Utility matcher to determine is the platform is an nxos variety
|
195
|
+
#
|
196
|
+
# @return [true, false] true if it is an nxos variety, false otherwise
|
197
|
+
def is_nxos?
|
198
|
+
return !!@name.match(/^nxos-.*$/)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Utility matcher to determine is the platform is a cisco-wrlinux
|
202
|
+
# variety
|
203
|
+
#
|
204
|
+
# @return [true, false] true if it is a cisco-wrlinux variety, false
|
205
|
+
# otherwise
|
206
|
+
def is_cisco_wrlinux?
|
207
|
+
return !!@name.match(/^cisco-wrlinux-.*$/)
|
208
|
+
end
|
209
|
+
|
210
|
+
# Utility matcher to determine is the platform is an osx variety
|
211
|
+
#
|
212
|
+
# @return [true, false] true if it is an osx variety, false otherwise
|
213
|
+
def is_osx?
|
214
|
+
return !!@name.match(/^osx-.*$/)
|
215
|
+
end
|
216
|
+
|
217
|
+
# Utility matcher to determine is the platform is a solaris variety
|
218
|
+
#
|
219
|
+
# @return [true, false] true if it is an solaris variety, false otherwise
|
220
|
+
def is_solaris?
|
221
|
+
return !!@name.match(/^solaris-.*$/)
|
222
|
+
end
|
223
|
+
|
224
|
+
# Utility matcher to determine is the platform is a unix variety
|
225
|
+
#
|
226
|
+
# @return [true, false] true if it is a unix variety, false otherwise
|
227
|
+
def is_unix?
|
228
|
+
return !!@name.match(/^(solaris|aix|osx)-.*$/)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Utility matcher to determine is the platform is a windows variety
|
232
|
+
#
|
233
|
+
# @return [true, false] true if it is a windows variety, false otherwise
|
234
|
+
def is_windows?
|
235
|
+
return !!@name.match(/^win-.*$/)
|
236
|
+
end
|
237
|
+
|
238
|
+
# Utility matcher to determine is the platform is a linux variety
|
239
|
+
#
|
240
|
+
# @return [true, false] true if it is a linux variety, false otherwise
|
241
|
+
def is_linux?
|
242
|
+
return (!is_windows? && !is_unix?)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class Vanagon
|
2
|
+
class Platform
|
3
|
+
class DEB < Vanagon::Platform
|
4
|
+
# The specific bits used to generate a debian package for a given project
|
5
|
+
#
|
6
|
+
# @param project [Vanagon::Project] project to build a debian package of
|
7
|
+
# @return [Array] list of commands required to build a debian package for the given project from a tarball
|
8
|
+
def generate_package(project)
|
9
|
+
target_dir = project.repo ? output_dir(project.repo) : output_dir
|
10
|
+
["mkdir -p output/#{target_dir}",
|
11
|
+
"mkdir -p $(tempdir)/#{project.name}-#{project.version}",
|
12
|
+
"cp #{project.name}-#{project.version}.tar.gz $(tempdir)/#{project.name}_#{project.version}.orig.tar.gz",
|
13
|
+
"cat file-list >> debian/install",
|
14
|
+
"cp -pr debian $(tempdir)/#{project.name}-#{project.version}",
|
15
|
+
"gunzip -c #{project.name}-#{project.version}.tar.gz | '#{@tar}' -C '$(tempdir)/#{project.name}-#{project.version}' --strip-components 1 -xf -",
|
16
|
+
"sed -i 's/\ /?/g' $(tempdir)/#{project.name}-#{project.version}/debian/install",
|
17
|
+
"(cd $(tempdir)/#{project.name}-#{project.version}; debuild --no-lintian -uc -us)",
|
18
|
+
"cp $(tempdir)/*.deb ./output/#{target_dir}"]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Method to generate the files required to build a debian package for the project
|
22
|
+
#
|
23
|
+
# @param workdir [String] working directory to stage the evaluated templates in
|
24
|
+
# @param name [String] name of the project
|
25
|
+
# @param binding [Binding] binding to use in evaluating the packaging templates
|
26
|
+
def generate_packaging_artifacts(workdir, name, binding)
|
27
|
+
deb_dir = File.join(workdir, "debian")
|
28
|
+
FileUtils.mkdir_p(deb_dir)
|
29
|
+
|
30
|
+
# Lots of templates here
|
31
|
+
["changelog", "conffiles", "control", "docs", "dirs", "install", "postinst", "postrm", "prerm", "rules"].each do |deb_file|
|
32
|
+
erb_file(File.join(VANAGON_ROOT, "templates/deb/#{deb_file}.erb"), File.join(deb_dir, deb_file), false, { :binding => binding })
|
33
|
+
end
|
34
|
+
|
35
|
+
# These could be templates, but their content is static, so that seems weird.
|
36
|
+
File.open(File.join(deb_dir, "compat"), "w") { |f| f.puts("7") }
|
37
|
+
FileUtils.mkdir_p(File.join(deb_dir, "source"))
|
38
|
+
File.open(File.join(deb_dir, "source", "format"), "w") { |f| f.puts("3.0 (quilt)") }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Method to derive the package name for the project
|
42
|
+
#
|
43
|
+
# @param project [Vanagon::Project] project to name
|
44
|
+
# @return [String] name of the debian package for this project
|
45
|
+
def package_name(project)
|
46
|
+
"#{project.name}_#{project.version}-#{project.release}#{@codename}_#{project.noarch ? 'all' : @architecture}.deb"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get the expected output dir for the debian packages. This allows us to
|
50
|
+
# use some standard tools to ship internally.
|
51
|
+
#
|
52
|
+
# @return [String] relative path to where debian packages should be staged
|
53
|
+
def output_dir(target_repo = "")
|
54
|
+
File.join("deb", @codename, target_repo)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Constructor. Sets up some defaults for the debian platform and calls the parent constructor
|
58
|
+
#
|
59
|
+
# @param name [String] name of the platform
|
60
|
+
# @return [Vanagon::Platform::DEB] the deb derived platform with the given name
|
61
|
+
def initialize(name)
|
62
|
+
@name = name
|
63
|
+
@make = "/usr/bin/make"
|
64
|
+
@tar = "tar"
|
65
|
+
@patch = "/usr/bin/patch"
|
66
|
+
@num_cores = "/usr/bin/nproc"
|
67
|
+
super(name)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,293 @@
|
|
1
|
+
require 'vanagon/platform/deb'
|
2
|
+
require 'vanagon/platform/rpm'
|
3
|
+
require 'vanagon/platform/rpm/wrl'
|
4
|
+
require 'vanagon/platform/swix'
|
5
|
+
require 'vanagon/platform/osx'
|
6
|
+
require 'vanagon/platform/solaris_10'
|
7
|
+
require 'vanagon/platform/solaris_11'
|
8
|
+
require 'securerandom'
|
9
|
+
require 'uri'
|
10
|
+
|
11
|
+
class Vanagon
|
12
|
+
class Platform
|
13
|
+
class DSL
|
14
|
+
# Constructor for the DSL object
|
15
|
+
#
|
16
|
+
# @param name [String] name of the platform
|
17
|
+
# @return [Vanagon::Platform::DSL] A DSL object to describe the {Vanagon::Platform}
|
18
|
+
def initialize(name)
|
19
|
+
@name = name
|
20
|
+
end
|
21
|
+
|
22
|
+
# Primary way of interacting with the DSL. Also a simple factory to get the right platform object.
|
23
|
+
#
|
24
|
+
# @param name [String] name of the platform
|
25
|
+
# @param block [Proc] DSL definition of the platform to call
|
26
|
+
def platform(name, &block)
|
27
|
+
@platform = case name
|
28
|
+
when /^(aix|cisco-wrlinux|el|fedora|nxos|sles)-/
|
29
|
+
Vanagon::Platform::RPM.new(@name)
|
30
|
+
when /^huaweios-/
|
31
|
+
Vanagon::Platform::RPM::WRL.new(@name)
|
32
|
+
when /^(cumulus|debian|ubuntu)-/
|
33
|
+
Vanagon::Platform::DEB.new(@name)
|
34
|
+
when /^eos-/
|
35
|
+
Vanagon::Platform::RPM::Swix.new(@name)
|
36
|
+
when /^osx-/
|
37
|
+
Vanagon::Platform::OSX.new(@name)
|
38
|
+
when /^solaris-10/
|
39
|
+
Vanagon::Platform::Solaris10.new(@name)
|
40
|
+
when /^solaris-11/
|
41
|
+
Vanagon::Platform::Solaris11.new(@name)
|
42
|
+
else
|
43
|
+
fail "Platform not implemented for '#{@name}' yet. Please go do so..."
|
44
|
+
end
|
45
|
+
|
46
|
+
block.call(self)
|
47
|
+
@platform
|
48
|
+
end
|
49
|
+
|
50
|
+
# Accessor for the platform.
|
51
|
+
#
|
52
|
+
# @return [Vanagon::Platform] the platform the DSL methods will be acting against
|
53
|
+
def _platform
|
54
|
+
@platform
|
55
|
+
end
|
56
|
+
|
57
|
+
# All purpose getter. This object, which is passed to the platform block,
|
58
|
+
# won't have easy access to the attributes of the @platform, so we make a
|
59
|
+
# getter for each attribute.
|
60
|
+
#
|
61
|
+
# We only magically handle get_ methods, any other methods just get the
|
62
|
+
# standard method_missing treatment.
|
63
|
+
#
|
64
|
+
def method_missing(method, *args)
|
65
|
+
attribute_match = method.to_s.match(/get_(.*)/)
|
66
|
+
if attribute_match
|
67
|
+
attribute = attribute_match.captures.first
|
68
|
+
else
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
@platform.send(attribute)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Set the path to make for the platform
|
76
|
+
#
|
77
|
+
# @param make_cmd [String] Full path to the make command for the platform
|
78
|
+
def make(make_cmd)
|
79
|
+
@platform.make = make_cmd
|
80
|
+
end
|
81
|
+
|
82
|
+
# Set the path to tar for the platform
|
83
|
+
#
|
84
|
+
# @param tar [String] Full path to the tar command for the platform
|
85
|
+
def tar(tar_cmd)
|
86
|
+
@platform.tar = tar_cmd
|
87
|
+
end
|
88
|
+
|
89
|
+
# Set the path to rpmbuild for the platform
|
90
|
+
#
|
91
|
+
# @param rpmbuild_cmd [String] Full path to rpmbuild with arguments to be used by default
|
92
|
+
def rpmbuild(rpmbuild_cmd)
|
93
|
+
@platform.rpmbuild = rpmbuild_cmd
|
94
|
+
end
|
95
|
+
|
96
|
+
# Set the path to the install command
|
97
|
+
# @param install_cmd [String] Full path to install with arguments to be used by default
|
98
|
+
def install(install_cmd)
|
99
|
+
@platform.install = install_cmd
|
100
|
+
end
|
101
|
+
|
102
|
+
# Set the path to patch for the platform
|
103
|
+
#
|
104
|
+
# @param patch_cmd [String] Full path to the patch command for the platform
|
105
|
+
def patch(patch_cmd)
|
106
|
+
@platform.patch = patch_cmd
|
107
|
+
end
|
108
|
+
|
109
|
+
# Sets the command to retrieve the number of cores available on a platform.
|
110
|
+
#
|
111
|
+
# @param num_cores_cmd [String] the command to retrieve the number of available cores on a platform.
|
112
|
+
def num_cores(num_cores_cmd)
|
113
|
+
@platform.num_cores = num_cores_cmd
|
114
|
+
end
|
115
|
+
|
116
|
+
# Set the command to turn the target machine into a builder for vanagon
|
117
|
+
#
|
118
|
+
# @param command [String] Command to enable the target machine to build packages for the platform
|
119
|
+
def provision_with(command)
|
120
|
+
@platform.provisioning << command
|
121
|
+
end
|
122
|
+
|
123
|
+
# Set the command to install any needed build dependencies for the target machine
|
124
|
+
#
|
125
|
+
# @param command [String] Command to install build dependencies for the target machine
|
126
|
+
# @param suffix [String] shell to be run after the main command
|
127
|
+
def install_build_dependencies_with(command, suffix = nil)
|
128
|
+
@platform.build_dependencies = OpenStruct.new({ :command => command, :suffix => suffix })
|
129
|
+
end
|
130
|
+
|
131
|
+
# Set the directory where service files or init scripts live for the platform
|
132
|
+
#
|
133
|
+
# @param dir [String] Directory where service files live on the platform
|
134
|
+
def servicedir(dir)
|
135
|
+
@platform.servicedir = dir
|
136
|
+
end
|
137
|
+
|
138
|
+
# Set the directory where default or sysconfig files live for the platform
|
139
|
+
#
|
140
|
+
# @param dir [String] Directory where default or sysconfig files live on the platform
|
141
|
+
def defaultdir(dir)
|
142
|
+
@platform.defaultdir = dir
|
143
|
+
end
|
144
|
+
|
145
|
+
# Set the servicetype for the platform so that services can be installed correctly.
|
146
|
+
#
|
147
|
+
# @param type [String] service type for the platform ('sysv' for example)
|
148
|
+
def servicetype(type)
|
149
|
+
@platform.servicetype = type
|
150
|
+
end
|
151
|
+
|
152
|
+
# Set the name of this platform as the vm pooler expects it
|
153
|
+
#
|
154
|
+
# @param name [String] name of the target template to use from the vmpooler
|
155
|
+
def vmpooler_template(name)
|
156
|
+
@platform.vmpooler_template = name
|
157
|
+
end
|
158
|
+
|
159
|
+
# Set the name of this platform as the vm pooler expects it
|
160
|
+
#
|
161
|
+
# @param name [String] name that the pooler uses for this platform
|
162
|
+
# @deprecated Please use vmpooler_template instead, this will be removed in a future vanagon release.
|
163
|
+
def vcloud_name(name)
|
164
|
+
warn "vcloud_name is a deprecated platform DSL method, and will be removed in a future vanagon release. Please use vmpooler_template instead."
|
165
|
+
self.vmpooler_template(name)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Set the name of the docker image to use
|
169
|
+
#
|
170
|
+
# @param name [String] name of the docker image to use
|
171
|
+
def docker_image(name)
|
172
|
+
@platform.docker_image = name
|
173
|
+
end
|
174
|
+
|
175
|
+
# Set the port for ssh to use if it's not 22
|
176
|
+
#
|
177
|
+
# @param port [Integer] port number for ssh
|
178
|
+
def ssh_port(port = 22)
|
179
|
+
@platform.ssh_port = port
|
180
|
+
end
|
181
|
+
|
182
|
+
# Set the platform_triple for the platform
|
183
|
+
#
|
184
|
+
# @param triple[String] platform_triple for use in building out compiled
|
185
|
+
# tools and cross-compilation
|
186
|
+
def platform_triple(triple)
|
187
|
+
@platform.platform_triple = triple
|
188
|
+
end
|
189
|
+
|
190
|
+
# Set any codename this platform may have (debian for example)
|
191
|
+
#
|
192
|
+
# @param name [String] codename for this platform (squeeze for example)
|
193
|
+
def codename(name)
|
194
|
+
@platform.codename = name
|
195
|
+
end
|
196
|
+
|
197
|
+
# Helper to setup a apt repository on a target system
|
198
|
+
#
|
199
|
+
# @param definition [String] the repo setup file, must be a valid uri, fetched with curl
|
200
|
+
# @param gpg_key [String] optional gpg key to be fetched via curl and installed
|
201
|
+
def apt_repo(definition, gpg_key = nil)
|
202
|
+
# i.e., definition = http://builds.delivery.puppetlabs.net/puppet-agent/0.2.1/repo_configs/deb/pl-puppet-agent-0.2.1-wheezy.list
|
203
|
+
# parse the definition and gpg_key if set to ensure they are both valid URIs
|
204
|
+
definition = URI.parse definition
|
205
|
+
gpg_key = URI.parse gpg_key if gpg_key
|
206
|
+
|
207
|
+
self.provision_with "apt-get -qq update && apt-get -qq install curl"
|
208
|
+
if definition.scheme =~ /^(http|ftp)/
|
209
|
+
if File.extname(definition.path) == '.deb'
|
210
|
+
# repo definition is an deb (like puppetlabs-release)
|
211
|
+
self.provision_with "curl -o local.deb '#{definition}' && dpkg -i local.deb; rm -f local.deb"
|
212
|
+
else
|
213
|
+
reponame = "#{SecureRandom.hex}-#{File.basename(definition.path)}"
|
214
|
+
reponame = "#{reponame}.list" if File.extname(reponame) != '.list'
|
215
|
+
self.provision_with "curl -o '/etc/apt/sources.list.d/#{reponame}' '#{definition}'"
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
if gpg_key
|
220
|
+
gpgname = "#{SecureRandom.hex}-#{File.basename(gpg_key.path)}"
|
221
|
+
gpgname = "#{gpgname}.gpg" if gpgname !~ /\.gpg$/
|
222
|
+
self.provision_with "curl -o '/etc/apt/trusted.gpg.d/#{gpgname}' '#{gpg_key}'"
|
223
|
+
end
|
224
|
+
|
225
|
+
self.provision_with "apt-get -qq update"
|
226
|
+
end
|
227
|
+
|
228
|
+
# Helper to setup a yum repository on a target system
|
229
|
+
#
|
230
|
+
# @param definition [String] the repo setup URI or RPM file
|
231
|
+
def yum_repo(definition)
|
232
|
+
definition = URI.parse definition
|
233
|
+
|
234
|
+
self.provision_with "rpm -q curl > /dev/null || yum -y install curl"
|
235
|
+
if definition.scheme =~ /^(http|ftp)/
|
236
|
+
if File.extname(definition.path) == '.rpm'
|
237
|
+
# repo definition is an rpm (like puppetlabs-release)
|
238
|
+
if @platform.os_version.to_i < 6
|
239
|
+
# This can likely be done with just rpm itself (minus curl) however
|
240
|
+
# with a http_proxy curl has many more options avavailable for
|
241
|
+
# usage than rpm raw does. So for the most compatibility, we have
|
242
|
+
# chosen curl.
|
243
|
+
self.provision_with "curl -o local.rpm '#{definition}'; rpm -Uvh local.rpm; rm -f local.rpm"
|
244
|
+
else
|
245
|
+
self.provision_with "yum localinstall -y '#{definition}'"
|
246
|
+
end
|
247
|
+
else
|
248
|
+
reponame = "#{SecureRandom.hex}-#{File.basename(definition.path)}"
|
249
|
+
reponame = "#{reponame}.repo" if File.extname(reponame) != '.repo'
|
250
|
+
if @platform.is_nxos? or @platform.is_cisco_wrlinux?
|
251
|
+
self.provision_with "curl -o '/etc/yum/repos.d/#{reponame}' '#{definition}'"
|
252
|
+
else
|
253
|
+
self.provision_with "curl -o '/etc/yum.repos.d/#{reponame}' '#{definition}'"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# Helper to setup a zypper repository on a target system
|
260
|
+
#
|
261
|
+
# @param definition [String] the repo setup URI or RPM file
|
262
|
+
def zypper_repo(definition)
|
263
|
+
definition = URI.parse definition
|
264
|
+
if @platform.os_version == '10'
|
265
|
+
flag = 'sa'
|
266
|
+
else
|
267
|
+
flag = 'ar'
|
268
|
+
end
|
269
|
+
self.provision_with "yes | zypper -n --no-gpg-checks install curl"
|
270
|
+
if definition.scheme =~ /^(http|ftp)/
|
271
|
+
if File.extname(definition.path) == '.rpm'
|
272
|
+
# repo definition is an rpm (like puppetlabs-release)
|
273
|
+
self.provision_with "curl -o local.rpm '#{definition}'; rpm -Uvh local.rpm; rm -f local.rpm"
|
274
|
+
else
|
275
|
+
self.provision_with "yes | zypper -n --no-gpg-checks #{flag} -t YUM --repo '#{definition}'"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
# Generic adder for build repositories
|
281
|
+
#
|
282
|
+
# @param *args [Array<String>] List of arguments to pass on to the platform specific method
|
283
|
+
# @raise [Vanagon::Error] an arror is raised if the current platform does not define add_repository
|
284
|
+
def add_build_repository(*args)
|
285
|
+
if @platform.respond_to?(:add_repository)
|
286
|
+
self.provision_with @platform.send(:add_repository, *args)
|
287
|
+
else
|
288
|
+
raise Vanagon::Error, "Adding a build repository not defined for #{@platform.name}"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|