--- services/image_factory/aeolus-image/Rakefile | 34 +++++-- .../bin/{aeolus-image.rb => aeolus-image} | 0 .../image_factory/aeolus-image/rake/rpmtask.rb | 95 ++++++++++++++++++++ .../aeolus-image/rubygem-aeolus-cli.spec | 60 ++++++++++++ 4 files changed, 180 insertions(+), 9 deletions(-) rename services/image_factory/aeolus-image/bin/{aeolus-image.rb => aeolus-image} (100%) create mode 100644 services/image_factory/aeolus-image/rake/rpmtask.rb create mode 100644 services/image_factory/aeolus-image/rubygem-aeolus-cli.spec
diff --git a/services/image_factory/aeolus-image/Rakefile b/services/image_factory/aeolus-image/Rakefile index d518ccf..29941f1 100644 --- a/services/image_factory/aeolus-image/Rakefile +++ b/services/image_factory/aeolus-image/Rakefile @@ -5,20 +5,30 @@ require 'rake/gempackagetask' require 'rake/rdoctask' require 'rake/testtask' require 'spec/rake/spectask' +require 'rake/rpmtask' + +RPMBUILD_DIR = "#{File.expand_path('~')}/rpmbuild" +RPM_SPEC = "rubygem-aeolus-cli.spec"
spec = Gem::Specification.new do |s| - s.name = 'aeolus-image' + s.name = 'aeolus-cli' s.version = '0.0.1' s.has_rdoc = true - s.extra_rdoc_files = ['README', 'LICENSE'] - s.summary = 'Your summary here' - s.description = s.summary - s.author = '' - s.email = '' - # s.executables = ['your_executable_here'] - s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*") + s.summary= 'cli for aeolus cloud suite' + s.description = 'Commandline interface for working with the aeolus cloud management suite' + s.author = 'Jason Guiditta, Martyn Taylor' + s.email = 'jguiditt@redhat.com, mtaylor@redhat.com' + s.license = 'GPL-2' + s.homepage = 'http://aeolusproject.org' + s.executables << 'aeolus-image' + s.files = %w(Rakefile) + Dir.glob("{bin,lib,spec}/**/*") s.require_path = "lib" s.bindir = "bin" + s.add_dependency('nokogiri', '>=0.4.0') + s.add_dependency('rest-client') + s.add_dependency('image_factory_console', '>=0.4.0') + + s.add_development_dependency('rspec', '~>1.3.0') end
Rake::GemPackageTask.new(spec) do |p| @@ -43,4 +53,10 @@ end Spec::Rake::SpecTask.new do |t| t.spec_files = FileList['spec/**/*.rb'] t.libs << Dir["lib"] -end \ No newline at end of file +end + +Rake::RpmTask.new(RPM_SPEC) do |rpm| + rpm.need_tar = true + rpm.package_files.include("lib/*") + rpm.topdir = "#{RPMBUILD_DIR}" +end diff --git a/services/image_factory/aeolus-image/bin/aeolus-image.rb b/services/image_factory/aeolus-image/bin/aeolus-image similarity index 100% rename from services/image_factory/aeolus-image/bin/aeolus-image.rb rename to services/image_factory/aeolus-image/bin/aeolus-image diff --git a/services/image_factory/aeolus-image/rake/rpmtask.rb b/services/image_factory/aeolus-image/rake/rpmtask.rb new file mode 100644 index 0000000..7534693 --- /dev/null +++ b/services/image_factory/aeolus-image/rake/rpmtask.rb @@ -0,0 +1,95 @@ +# Define a package task library to aid in the definition of RPM +# packages. + +require 'rubygems' +require 'rake' +require 'rake/packagetask' + +require 'rbconfig' # used to get system arch + +module Rake + + # Create a package based upon a RPM spec. + # RPM packages, can be produced by this task. + class RpmTask < PackageTask + # RPM spec containing the metadata for this package + attr_accessor :rpm_spec + + # RPM build dir + attr_accessor :topdir + + def initialize(rpm_spec) + init(rpm_spec) + yield self if block_given? + define if block_given? + end + + def init(rpm_spec) + @rpm_spec = rpm_spec + + # parse this out of the rpmbuild macros, + # not ideal but better than hardcoding this + File.open('/etc/rpm/macros.dist', "r") { |f| + f.read.scan(/%dist\s*.(.*)\n/) + @distro = $1 + } + + # Parse rpm name / version out of spec + # FIXME hacky way to do this for now + # (would be nice to implement a full blown rpm spec parser for ruby) + File.open(rpm_spec, "r") { |f| + contents = f.read + # Parse out definitions and crudely expand them + contents.scan(/%define .*\n/).each do |definition| + words = definition.strip.split(' ') + key = words[1] + value = words[2..-1].to_s + # Modify the contents with expanded values, unless they contain + # a shell command (since we're not modifying them) + contents.gsub!("%{#{key}}", value) unless value.match('%(') + end + @name = contents.scan(/\nName: .*\n/).first.split.last + @version = contents.scan(/\nVersion: .*\n/).first.split.last + @release = contents.scan(/\nRelease: .*\n/).first.split.last + @release.gsub!("%{?dist}", ".#{@distro}") + @arch = contents.scan(/\nBuildArch: .*\n/) # TODO grab local arch if not defined + if @arch.nil? + @arch = Config::CONFIG["target_cpu"] # hoping this will work for all cases, + # can just run the 'arch' cmd if we want + else + @arch = @arch.first.split.last + end + } + super(@name, @version) + + @rpmbuild_cmd = 'rpmbuild' + end + + def define + super + + directory "#{@topdir}/SOURCES" + directory "#{@topdir}/SPECS" + + desc "Build the rpms" + task :rpms => [rpm_file] + + # FIXME properly determine :package build artifact(s) to copy to sources dir + file rpm_file => [:package, "#{@topdir}/SOURCES", "#{@topdir}/SPECS"] do |t,args| + cp "#{package_dir}/#{@name}-#{@version}.tgz", "#{@topdir}/SOURCES/" + # FIXME - This seems like a hack, but we don't know the gem's name + cp "#{package_dir}/#{@name.gsub('rubygem-', '')}-#{@version}.gem", "#{@topdir}/SOURCES/" + cp @rpm_spec, "#{@topdir}/SPECS" + sh "#{@rpmbuild_cmd} " + + "--define '_topdir #{@topdir}' " + + "--define 'extra_release #{args.extra_release}' " + + "-ba #{@rpm_spec}" + end + end + + def rpm_file + # FIXME support all a spec's subpackages as well + "#{@topdir}/RPMS/#{@arch}/#{@name}-#{@version}-#{@release}.#{@arch}.rpm" + end + end +end diff --git a/services/image_factory/aeolus-image/rubygem-aeolus-cli.spec b/services/image_factory/aeolus-image/rubygem-aeolus-cli.spec new file mode 100644 index 0000000..7e44d07 --- /dev/null +++ b/services/image_factory/aeolus-image/rubygem-aeolus-cli.spec @@ -0,0 +1,60 @@ +# Generated from image_factory_console-0.2.0.gem by gem2rpm -*- rpm-spec -*- +%define ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']") +%define gemdir %(ruby -rubygems -e 'puts Gem::dir' 2>/dev/null) +%define gemname aeolus-cli +%define geminstdir %{gemdir}/gems/%{gemname}-%{version} + +Summary: Commandline interface for working with the Aeolus cloud suite +Name: rubygem-%{gemname} +Version: 0.0.1 +Release: 1%{?dist}%{?extra_release} +Group: Development/Languages +License: GPLv2+ or Ruby +URL: http://aeolusproject.org + +Source0: %{gemname}-%{version}.gem +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Requires: rubygems +Requires: rubygem(nokogiri) >= 1.4.0 +Requires: rubygem(rest-client) +Requires: rubygem(image_factory_console) >= 0.4.0 + +BuildRequires: rubygems +BuildArch: noarch +Provides: rubygem(%{gemname}) = %{version} + +%description +QMF Console for Aeolus Image Factory + + +%prep + +%build + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}%{gemdir} +gem install --local --install-dir %{buildroot}%{gemdir} \ + --force --rdoc %{SOURCE0} + +mkdir -p %{buildroot}/%{_bindir} +mv %{buildroot}%{gemdir}/bin/* %{buildroot}/%{_bindir} +rmdir %{buildroot}%{gemdir}/bin +find %{buildroot}%{geminstdir}/bin -type f | xargs chmod a+x + + +%clean +rm -rf %{buildroot} + +%files +%defattr(-, root, root, -) +%{_bindir}/aeolus-image +%{gemdir}/gems/%{gemname}-%{version}/ +%doc %{gemdir}/doc/%{gemname}-%{version} +%{gemdir}/cache/%{gemname}-%{version}.gem +%{gemdir}/specifications/%{gemname}-%{version}.gemspec + + +%changelog +* Wed Jun 15 2011 jguiditt@redhat.com - 0.0.1-1 +- Initial package