Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes for building a ppc64le stemcell for Power8 Ubuntu LE #1027

Merged
merged 26 commits into from Jan 5, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
aefbdd6
merge changes from power-2915 branch
allomov Jul 30, 2015
7ba48bd
Merge tag 'tags/stable-3029' into power-3029-stemcell
allomov Jul 30, 2015
e890e61
remote rsyslog-mmjsonparse package from stemcell builder for ubuntu
allomov Jul 30, 2015
21b61b4
change links to issues with rsyslog-mmjsonparse in stemcell builder
allomov Jul 30, 2015
ab78c3e
remove system_ixgbevf from ubuntu stage
allomov Jul 30, 2015
ce11097
fix tests for stemcell on power arch
allomov Jul 30, 2015
482a665
patch build configuration on bosh_ruby stage
allomov Aug 3, 2015
f09d400
fix problem with relative paths in bosh_ruby stage of stemcell builder
allomov Aug 3, 2015
ab76bb3
build power bosh-agent with special scripts
allomov Aug 4, 2015
a5cbc7f
Merge branch 'power-3029-stemcell' of github.com:Altoros/bosh into po…
allomov Aug 4, 2015
1662276
commpent unnecessary
allomov Aug 4, 2015
4a36067
comment unnecessary test
allomov Aug 4, 2015
b59e2fb
Merge branch 'power-3029-stemcell' into power-3031-stemcell
allomov Aug 5, 2015
a5b58f5
Merge branch 'power-3031-stemcell' into power-3033-stemcell
allomov Aug 5, 2015
6b99f82
merge with current develop
Nov 10, 2015
5a01372
fixes after testing
Nov 12, 2015
b2c5cae
final gccgo removal
Nov 12, 2015
59dfa22
Merge branch 'p-stemcell-no-gccgo' of github.com:hashmap/bosh into p-…
Nov 12, 2015
45d4715
Merge with upstream/develop
Nov 12, 2015
77fc1a8
Some refactoring
Nov 12, 2015
f70a003
remove outdated code for RHEL
Nov 16, 2015
c2a6629
Make test stemcell_rspec_command pass
Nov 16, 2015
2a2de41
Addressing comments
Nov 25, 2015
406e046
bug fixes
Nov 25, 2015
1dd3300
Fixing build_environment spec for x86
Nov 26, 2015
3a6bb50
some refactoring
Nov 26, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion bosh-dev/spec/unit/bosh/dev/artifacts_downloader_spec.rb
Expand Up @@ -52,9 +52,10 @@ module Bosh::Dev
}

let(:stemcell) { Bosh::Stemcell::Stemcell.new(definition, 'bosh-stemcell', 'fake-build-number', 'fake-disk-format')}
let(:arch) { Bosh::Stemcell::Arch.ppc64le? ? 'ppc64le-' : ''}

it 'downloads a stemcell and returns path' do
expected_remote_uri = URI('http://bosh-ci-pipeline.s3.amazonaws.com/fake-build-number/bosh-stemcell/fake-infrastructure-name/light-bosh-stemcell-fake-build-number-fake-stemcell-name-fake-disk-format.tgz')
expected_remote_uri = URI("http://bosh-ci-pipeline.s3.amazonaws.com/fake-build-number/bosh-stemcell/fake-infrastructure-name/light-bosh-stemcell-#{arch}fake-build-number-fake-stemcell-name-fake-disk-format.tgz")
expected_local_path = "fake-output-dir/#{stemcell.name}"

expect(download_adapter)
Expand Down
Expand Up @@ -7,6 +7,9 @@
require 'yaml'
require 'zlib'

# prevent using ASCII on ppc64le platform
Encoding.default_external = "UTF-8"

def gzip(string)
result = StringIO.new
zio = Zlib::GzipWriter.new(result, nil, nil)
Expand Down
17 changes: 17 additions & 0 deletions bosh-stemcell/lib/bosh/stemcell/arch.rb
@@ -0,0 +1,17 @@
module Bosh::Stemcell
class Arch

def self.arch
RbConfig::CONFIG['host_cpu']
end

def self.ppc64le?
arch == 'powerpc64le'
end

def self.x86_64?
arch == 'x86_64'
end

end
end
8 changes: 7 additions & 1 deletion bosh-stemcell/lib/bosh/stemcell/archive_filename.rb
@@ -1,3 +1,4 @@
require 'bosh/stemcell/arch'
require 'forwardable'

module Bosh::Stemcell
Expand All @@ -24,7 +25,12 @@ def to_s
private

def name
definition.light? ? "light-#{base_name}" : base_name
mod_name = definition.light? ? "light-#{base_name}" : base_name
if Bosh::Stemcell::Arch.ppc64le?
"#{mod_name}-ppc64le"
else
mod_name
end
end

attr_reader(
Expand Down
14 changes: 13 additions & 1 deletion bosh-stemcell/lib/bosh/stemcell/build_environment.rb
Expand Up @@ -42,7 +42,7 @@ def os_image_rspec_command
[
"cd #{STEMCELL_SPECS_DIR};",
"OS_IMAGE=#{os_image_tarball_path}",
'bundle exec rspec -fd',
"bundle exec rspec -fd#{exclude_arch_exclusions}",
"spec/os_image/#{operating_system_spec_name}_spec.rb",
].join(' ')
end
Expand Down Expand Up @@ -156,6 +156,7 @@ def persist_settings_for_bash
end

def exclude_exclusions
[
case infrastructure.name
when 'vsphere'
' --tag ~exclude_on_vsphere'
Expand All @@ -171,6 +172,17 @@ def exclude_exclusions
' --tag ~exclude_on_azure'
else
''
end,
exclude_arch_exclusions.strip
].join(' ').rstrip
end

def exclude_arch_exclusions
case RbConfig::CONFIG['host_cpu']
when 'powerpc64le'
' --tag ~exclude_on_ppc64le'
else
''
end
end

Expand Down
7 changes: 6 additions & 1 deletion bosh-stemcell/lib/bosh/stemcell/disk_image.rb
Expand Up @@ -50,7 +50,12 @@ def stemcell_loopback_device_name

def map_image
@device = shell.run("sudo losetup --show --find #{image_file_path}", output_command: verbose)
shell.run("sudo kpartx -av #{device}", output_command: verbose)
if Bosh::Stemcell::Arch.ppc64le?
# power8 guest images have a p1: PReP partition and p2: file system, we need loopp2 here
shell.run("sudo kpartx -av #{device} | grep \"^add\" | grep \"p2 \"", output_command: verbose)
else
shell.run("sudo kpartx -av #{device}", output_command: verbose)
end
end

def unmap_image
Expand Down
4 changes: 2 additions & 2 deletions bosh-stemcell/lib/bosh/stemcell/stage_collection.rb
Expand Up @@ -36,7 +36,7 @@ def agent_stages
:bosh_micro_go,
:aws_cli,
:logrotate_config,
]
].reject{ |s| Bosh::Stemcell::Arch.ppc64le? and [:bosh_ruby, :bosh_micro_go].include?(s) }
end

def build_stemcell_image_stages
Expand Down Expand Up @@ -220,7 +220,7 @@ def ubuntu_os_stages
:vim_tiny,
:cron_config,
:escape_ctrl_alt_del,
].flatten
].flatten.reject{ |s| Bosh::Stemcell::Arch.ppc64le? and s == :system_ixgbevf }
end

def photon_os_stages
Expand Down
7 changes: 6 additions & 1 deletion bosh-stemcell/lib/bosh/stemcell/stemcell_packager.rb
Expand Up @@ -46,6 +46,11 @@ def manifest(disk_format)
end

def manifest_cloud_properties(disk_format, infrastructure, stemcell_name)
architecture = 'x86_64'
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps replace with the ternary operator?

if Bosh::Stemcell::Arch.ppc64le?
architecture = 'ppc64le'
end

{
'name' => stemcell_name,
'version' => version.to_s,
Expand All @@ -56,7 +61,7 @@ def manifest_cloud_properties(disk_format, infrastructure, stemcell_name)
'container_format' => 'bare',
'os_type' => 'linux',
'os_distro' => definition.operating_system.name,
'architecture' => 'x86_64',
'architecture' => architecture,
}.merge(infrastructure.additional_cloud_properties)
end

Expand Down
6 changes: 3 additions & 3 deletions bosh-stemcell/spec/bosh/stemcell/archive_filename_spec.rb
Expand Up @@ -38,19 +38,19 @@ module Bosh::Stemcell
end

describe '#to_s' do
let(:arch) { Bosh::Stemcell::Arch.ppc64le? ? 'ppc64le-' : '' }
context 'when stemcell is NOT light' do
let(:light) { false }

it 'includes name, version, stemcell name' do
expect(archive_filename.to_s).to eq ('FAKE_NAME-007-fake-stemcell-name.tgz')
expect(archive_filename.to_s).to eq ("FAKE_NAME-#{arch}007-fake-stemcell-name.tgz")
end
end

context 'when stemcell is light' do
let(:light) { true }

it 'prefixes the name with "light-"' do
expect(archive_filename.to_s).to eq ('light-FAKE_NAME-007-fake-stemcell-name.tgz')
expect(archive_filename.to_s).to eq ("light-FAKE_NAME-#{arch}007-fake-stemcell-name.tgz")
end
end
end
Expand Down
11 changes: 7 additions & 4 deletions bosh-stemcell/spec/bosh/stemcell/build_environment_spec.rb
Expand Up @@ -186,13 +186,14 @@ module Bosh::Stemcell

describe '#os_image_rspec_command' do
context 'when operating system has version' do
let (:tag) { Bosh::Stemcell::Arch.ppc64le? ? ' --tag ~exclude_on_ppc64le' : '' }
before { allow(operating_system).to receive(:version).and_return('fake-version') }

it 'returns the correct command' do
expected_rspec_command = [
"cd #{stemcell_specs_dir};",
'OS_IMAGE=/some/os_image.tgz',
'bundle exec rspec -fd',
"bundle exec rspec -fd#{tag}",
"spec/os_image/#{operating_system.name}_#{operating_system.version}_spec.rb",
].join(' ')

Expand All @@ -202,6 +203,7 @@ module Bosh::Stemcell
end

describe '#stemcell_rspec_command' do
let (:tag) { Bosh::Stemcell::Arch.ppc64le? ? ' --tag ~exclude_on_ppc64le' : '' }
before { allow(operating_system).to receive(:version).and_return('fake-version') }

it 'returns the correct command' do
Expand All @@ -210,7 +212,7 @@ module Bosh::Stemcell
"STEMCELL_IMAGE=#{File.join(work_path, 'fake-root-disk-image.raw')}",
"STEMCELL_WORKDIR=#{work_path}",
"OS_NAME=#{operating_system.name}",
'bundle exec rspec -fd',
"bundle exec rspec -fd#{tag}",
"spec/os_image/#{operating_system.name}_#{operating_system.version}_spec.rb",
"spec/stemcells/#{operating_system.name}_#{operating_system.version}_spec.rb",
"spec/stemcells/#{agent.name}_agent_spec.rb",
Expand All @@ -235,6 +237,7 @@ module Bosh::Stemcell
end

describe '#stemcell_files' do
let(:arch) { Bosh::Stemcell::Arch.ppc64le? ? 'ppc64le-' : '' }
it 'returns the right file path' do
allow(definition).to receive(:disk_formats) { ['disk-format-1', 'disk-format-2'] }
allow(definition).to receive(:light?) { true }
Expand All @@ -243,8 +246,8 @@ module Bosh::Stemcell
with('disk-format-2') { 'infra-hypervisor-os-version-disk-format-2' }

expect(subject.stemcell_files).to eq([
File.join(work_path, 'light-bosh-stemcell-007-infra-hypervisor-os-version.tgz'),
File.join(work_path, 'light-bosh-stemcell-007-infra-hypervisor-os-version-disk-format-2.tgz'),
File.join(work_path, "light-bosh-stemcell-#{arch}007-infra-hypervisor-os-version.tgz"),
File.join(work_path, "light-bosh-stemcell-#{arch}007-infra-hypervisor-os-version-disk-format-2.tgz"),
])
end
end
Expand Down
104 changes: 81 additions & 23 deletions bosh-stemcell/spec/bosh/stemcell/disk_image_spec.rb
@@ -1,11 +1,17 @@
require 'spec_helper'
require 'bosh/stemcell/arch'
require 'bosh/stemcell/disk_image'

module Bosh::Stemcell
describe DiskImage do
let(:shell) { instance_double('Bosh::Core::Shell', run: nil) }

let(:kpartx_map_output) { 'add map FAKE_LOOP1p1 (252:3): 0 3997984 linear /dev/loop1 63' }
if Bosh::Stemcell::Arch.ppc64le?
# power8 guest images have a p1: PReP partition and p2: file system, we need loopXp2 here
let(:kpartx_map_output) { 'add map FAKE_LOOP1p2 (252:9): 0 20953088 linear /dev/loop1 18432' }
else
let(:kpartx_map_output) { 'add map FAKE_LOOP1p1 (252:3): 0 3997984 linear /dev/loop1 63' }
end
let(:options) do
{
image_file_path: '/path/to/FAKE_IMAGE',
Expand Down Expand Up @@ -39,26 +45,42 @@ module Bosh::Stemcell
it 'maps the file to a loop device' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
expect(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
if Bosh::Stemcell::Arch.ppc64le?
expect(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
else
expect(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
end

disk_image.mount
end

it 'mounts the loop device' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)

expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p2 /fake/mnt', output_command: false)
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
end

disk_image.mount
end

context 'when the device does not exist' do
let(:mount_command) do
'sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt'
if Bosh::Stemcell::Arch.ppc64le?
'sudo mount /dev/mapper/FAKE_LOOP1p2 /fake/mnt'
else
'sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt'
end
end

let(:mount_error) do
Expand All @@ -72,8 +94,14 @@ module Bosh::Stemcell
it 'runs mount a second time after sleeping long enough for the device node to be created' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
end
expect(shell).to receive(:run).with(mount_command, output_command: false).ordered.and_raise(mount_error)
expect(disk_image).to receive(:sleep).with(0.5)
expect(shell).to receive(:run).with(mount_command, output_command: false).ordered
Expand All @@ -85,8 +113,14 @@ module Bosh::Stemcell
it 'raises an error' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
end
expect(shell).to receive(:run).
with(mount_command, output_command: false).ordered.twice.and_raise(mount_error)

Expand All @@ -99,11 +133,21 @@ module Bosh::Stemcell
it 'runs mount a second time' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).
with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false).ordered.
and_raise(RuntimeError, 'UNEXEPECTED')

if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).
with('sudo mount /dev/mapper/FAKE_LOOP1p2 /fake/mnt', output_command: false).ordered.
and_raise(RuntimeError, 'UNEXEPECTED')
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).
with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false).ordered.
and_raise(RuntimeError, 'UNEXEPECTED')
end

expect { disk_image.mount }.to raise_error(RuntimeError, 'UNEXEPECTED')
end
Expand Down Expand Up @@ -137,9 +181,16 @@ module Bosh::Stemcell
fake_thing = double('FakeThing')
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p2 /fake/mnt', output_command: false)
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
end
allow(fake_thing).to receive(:fake_call).with(disk_image).ordered
expect(shell).to receive(:run).with('sudo umount /fake/mnt', output_command: false).ordered
expect(shell).to receive(:run).with('sudo kpartx -dv /dev/loop0', output_command: false).ordered
Expand All @@ -154,9 +205,16 @@ module Bosh::Stemcell
it 'mounts the disk, calls the provided block, and unmounts' do
losetup_commad = 'sudo losetup --show --find /path/to/FAKE_IMAGE'
allow(shell).to receive(:run).with(losetup_commad, output_command: false).and_return('/dev/loop0')
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
if Bosh::Stemcell::Arch.ppc64le?
allow(shell).to receive(:run).
with("sudo kpartx -av /dev/loop0 | grep \"^add\" | grep \"p2 \"",
output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p2 /fake/mnt', output_command: false)
else
allow(shell).to receive(:run).
with('sudo kpartx -av /dev/loop0', output_command: false).and_return(kpartx_map_output)
expect(shell).to receive(:run).with('sudo mount /dev/mapper/FAKE_LOOP1p1 /fake/mnt', output_command: false)
end
expect(shell).to receive(:run).with('sudo umount /fake/mnt', output_command: false).ordered
expect(shell).to receive(:run).with('sudo kpartx -dv /dev/loop0', output_command: false).ordered
expect(shell).to receive(:run).with('sudo losetup -dv /dev/loop0', output_command: false).ordered
Expand Down