summaryrefslogtreecommitdiffstats
path: root/installer/OpenSLX/OSExport/Engine.pm
diff options
context:
space:
mode:
authorOliver Tappe2007-06-20 20:04:19 +0200
committerOliver Tappe2007-06-20 20:04:19 +0200
commit898eca2232289d3f64431bc3763da4b65bb3ae61 (patch)
tree2a213ff0429b76037a6cc0f2fbf9f99ec025ed2a /installer/OpenSLX/OSExport/Engine.pm
parent* added support for invoking a chrooted shell for any installed vendor-OS, (diff)
downloadcore-898eca2232289d3f64431bc3763da4b65bb3ae61.tar.gz
core-898eca2232289d3f64431bc3763da4b65bb3ae61.tar.xz
core-898eca2232289d3f64431bc3763da4b65bb3ae61.zip
* split export type into filesystem and (optional) blockdevice, closing
ticket#139 * code-reformatting with perltidy git-svn-id: http://svn.openslx.org/svn/openslx/trunk@1176 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'installer/OpenSLX/OSExport/Engine.pm')
-rw-r--r--installer/OpenSLX/OSExport/Engine.pm242
1 files changed, 142 insertions, 100 deletions
diff --git a/installer/OpenSLX/OSExport/Engine.pm b/installer/OpenSLX/OSExport/Engine.pm
index 6668416a..5d08c177 100644
--- a/installer/OpenSLX/OSExport/Engine.pm
+++ b/installer/OpenSLX/OSExport/Engine.pm
@@ -14,13 +14,14 @@
package OpenSLX::OSExport::Engine;
use vars qw(@ISA @EXPORT $VERSION);
-$VERSION = 1.01; # API-version . implementation-version
+$VERSION = 1.01; # API-version . implementation-version
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
- %supportedExportTypes %supportedDistros
+ %supportedExportFileSystems %supportedExportBlockDevices
+ @supportedExportTypes %supportedDistros
);
use strict;
@@ -30,28 +31,27 @@ use File::Basename;
use OpenSLX::Basics;
use OpenSLX::Utils;
-use vars qw(%supportedExportTypes %supportedDistros);
+use vars qw(
+ %supportedExportFileSystems %supportedExportBlockDevices
+ @supportedExportTypes %supportedDistros
+);
-%supportedExportTypes = (
- 'nfs'
- => { module => 'NFS' },
- 'nbd'
- => { module => 'NBD_Squash' },
+%supportedExportFileSystems = (
+ 'nfs' => 'NFS',
+ 'sqfs' => 'SquashFS',
);
+%supportedExportBlockDevices = ('nbd' => 'NBD', 'aoe' => 'AoE');
+
+@supportedExportTypes = ('nfs', 'sqfs-aoe', 'sqfs-nbd');
+
%supportedDistros = (
- '<any>'
- => { module => 'Any' },
- 'debian'
- => { module => 'Debian' },
- 'fedora'
- => { module => 'Fedora' },
- 'gentoo'
- => { module => 'Gentoo' },
- 'suse'
- => { module => 'SUSE' },
- 'ubuntu'
- => { module => 'Ubuntu' },
+ '<any>' => {module => 'Any'},
+ 'debian' => {module => 'Debian'},
+ 'fedora' => {module => 'Fedora'},
+ 'gentoo' => {module => 'Gentoo'},
+ 'suse' => {module => 'SUSE'},
+ 'ubuntu' => {module => 'Ubuntu'},
);
################################################################################
@@ -61,55 +61,52 @@ sub new
{
my $class = shift;
- my $self = {
- };
+ my $self = {};
return bless $self, $class;
}
sub initializeFromExisting
{
- my $self = shift;
+ my $self = shift;
my $exportName = shift;
my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
$openslxDB->connect();
- my $export
- = $openslxDB->fetchExportByFilter({'name' => $exportName});
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName});
if (!defined $export) {
die _tr("Export '%s' not found in DB, giving up!", $exportName);
}
- my $vendorOS
- = $openslxDB->fetchVendorOSByFilter({ 'id' => $export->{vendor_os_id} });
+ my $vendorOS =
+ $openslxDB->fetchVendorOSByFilter({'id' => $export->{vendor_os_id}});
$openslxDB->disconnect();
- $self->_initialize($vendorOS->{name}, $vendorOS->{id},
- $export->{name}, $export->{type});
+ $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $export->{name},
+ $export->{type});
}
sub initializeForNew
{
- my $self = shift;
+ my $self = shift;
my $vendorOSName = shift;
- my $exportType = lc(shift);
+ my $exportType = lc(shift);
my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
$openslxDB->connect();
- my $vendorOS
- = $openslxDB->fetchVendorOSByFilter({ 'name' => $vendorOSName });
+ my $vendorOS = $openslxDB->fetchVendorOSByFilter({'name' => $vendorOSName});
if (!defined $vendorOS) {
die _tr("vendor-OS '%s' not found in DB, giving up!", $vendorOSName);
}
- my $exportName = "$vendorOSName-$exportType";
+ my $exportName = "$vendorOSName:$exportType";
$openslxDB->disconnect();
- $self->_initialize($vendorOS->{name}, $vendorOS->{id},
- $exportName, $exportType);
+ $self->_initialize($vendorOS->{name}, $vendorOS->{id}, $exportName,
+ $exportType);
}
sub exportVendorOS
@@ -117,27 +114,37 @@ sub exportVendorOS
my $self = shift;
if (!$self->{'exporter'}->checkRequirements($self->{'vendor-os-path'})) {
- die _tr("clients wouldn't be able to access the exported root-fs!\nplease install the missing module(s) or use another export-type.");
+ die _tr(
+ "clients wouldn't be able to access the exported root-fs!\nplease "
+ . "install the missing module(s) or use another export-type.");
}
- $self->{'exporter'}->exportVendorOS(
- $self->{'vendor-os-path'},
- $self->{'export-path'}
+ $self->{'exporter'}->exportVendorOS($self->{'vendor-os-path'},);
+ vlog(
+ 0,
+ _tr(
+ "vendor-OS '%s' successfully exported to '%s'!",
+ $self->{'vendor-os-path'},
+ $self->{exporter}->{'export-path'}
+ )
);
- vlog 0, _tr("vendor-OS '%s' successfully exported to '%s'!",
- $self->{'vendor-os-path'}, $self->{'export-path'});
- $self->addExportToConfigDB();
+ $self->_addExportToConfigDB();
}
sub purgeExport
{
my $self = shift;
- if ($self->{'exporter'}->purgeExport($self->{'export-path'})) {
- vlog 0, _tr("export '%s' successfully removed!",
- $self->{'export-path'});
- }
- $self->removeExportFromConfigDB();
+ if ($self->{'exporter'}->purgeExport()) {
+ vlog(
+ 0,
+ _tr(
+ "export '%s' successfully removed!",
+ $self->{exporter}->{'export-path'}
+ )
+ );
+ }
+ $self->_removeExportFromConfigDB();
}
sub generateExportURI
@@ -159,23 +166,28 @@ sub requiredFSMods
################################################################################
sub _initialize
{
- my $self = shift;
+ my $self = shift;
my $vendorOSName = shift;
- my $vendorOSId = shift;
- my $exportName = shift;
- my $exportType = lc(shift);
-
- if (!exists $supportedExportTypes{lc($exportType)}) {
- print _tr("Sorry, export type '%s' is unsupported.\n", $exportType);
- print _tr("List of supported export types:\n\t");
- print join("\n\t", sort keys %supportedExportTypes)."\n";
+ my $vendorOSId = shift;
+ my $exportName = shift;
+ my $exportType = lc(shift);
+
+ if (!grep { $_ eq $exportType } @supportedExportTypes) {
+ vlog(0,
+ _tr("Sorry, export type '%s' is unsupported.\n", $exportType)
+ . _tr("List of supported export types:\n\t")
+ . join("\n\t", sort @supportedExportTypes));
exit 1;
}
+ $exportType =~ m[^(\w+)(?:-(\w+))?$];
+ my $exportFS = lc($1);
+ my $exportBD = lc($2);
+ vlog(2, "export-fs='$exportFS' export-bd='$exportBD'");
$self->{'vendor-os-name'} = $vendorOSName;
- $self->{'vendor-os-id'} = $vendorOSId;
- $self->{'export-name'} = $exportName;
- $self->{'export-type'} = $exportType;
+ $self->{'vendor-os-id'} = $vendorOSId;
+ $self->{'export-name'} = $exportName;
+ $self->{'export-type'} = $exportType;
$vendorOSName =~ m[^(.+?\-[^-]+)];
my $distroName = $1;
$self->{'distro-name'} = $distroName;
@@ -194,55 +206,78 @@ sub _initialize
}
}
my $distroModuleName = $supportedDistros{lc($distroName)}->{module};
- my $distro
- = instantiateClass("OpenSLX::OSExport::Distro::$distroModuleName");
+ my $distro =
+ instantiateClass("OpenSLX::OSExport::Distro::$distroModuleName");
$distro->initialize($self);
$self->{distro} = $distro;
# load module for the requested export type:
- my $typeModuleName = $supportedExportTypes{lc($exportType)}->{module};
- my $exporter
- = instantiateClass("OpenSLX::OSExport::ExportType::$typeModuleName");
- $exporter->initialize($self);
+ my $fsModuleName = $supportedExportFileSystems{$exportFS};
+ my $exporter =
+ instantiateClass("OpenSLX::OSExport::FileSystem::$fsModuleName");
+ if (length($exportBD)) {
+ my $blockModuleName = $supportedExportBlockDevices{$exportBD};
+ my $blockDevice =
+ instantiateClass("OpenSLX::OSExport::BlockDevice::$blockModuleName");
+ $blockDevice->initialize($self, $exporter);
+ $exporter->initialize($self, $blockDevice);
+ } else {
+ $exporter->initialize($self);
+ }
$self->{'exporter'} = $exporter;
# setup source and target paths:
- $self->{'vendor-os-path'}
- = "$openslxConfig{'private-path'}/stage1/$vendorOSName";
- my $exportBasePath = "$openslxConfig{'public-path'}/export";
- $self->{'export-path'} = "$exportBasePath/$exportType/$vendorOSName";
- vlog 1, _tr("vendor-OS from '%s' will be exported to '%s'",
- $self->{'vendor-os-path'}, $self->{'export-path'});
+ $self->{'vendor-os-path'} =
+ "$openslxConfig{'private-path'}/stage1/$vendorOSName";
+ vlog(
+ 1,
+ _tr(
+ "vendor-OS from '%s' will be exported to '%s'",
+ $self->{'vendor-os-path'},
+ $exporter->{'export-path'}
+ )
+ );
}
-sub addExportToConfigDB
+sub _addExportToConfigDB
{
my $self = shift;
my $openslxDB = instantiateClass("OpenSLX::ConfigDB");
$openslxDB->connect();
- my $export
- = $openslxDB->fetchExportByFilter({
- 'name' => $self->{'export-name'},
+ my $export = $openslxDB->fetchExportByFilter(
+ {
+ 'name' => $self->{'export-name'},
'vendor_os_id' => $self->{'vendor-os-id'},
- });
+ }
+ );
if (defined $export) {
- vlog 0, _tr("No need to change export '%s' in OpenSLX-database.\n",
- $self->{'export-name'});
+ vlog(
+ 0,
+ _tr(
+ "No need to change export '%s' in OpenSLX-database.\n",
+ $self->{'export-name'}
+ )
+ );
$self->{exporter}->showExportConfigInfo($export);
} else {
$export = {
'vendor_os_id' => $self->{'vendor-os-id'},
- 'name' => $self->{'export-name'},
- 'type' => $self->{'export-type'},
+ 'name' => $self->{'export-name'},
+ 'type' => $self->{'export-type'},
};
-
+
my $id = $self->{exporter}->addExportToConfigDB($export, $openslxDB);
- vlog 0, _tr("Export '%s' has been added to DB (ID=%s)...\n",
- $self->{'export-name'}, $id);
+ vlog(
+ 0,
+ _tr(
+ "Export '%s' has been added to DB (ID=%s)...\n",
+ $self->{'export-name'}, $id
+ )
+ );
- $self->{exporter}->showExportConfigInfo($export) if $id;
+ $self->{exporter}->showExportConfigInfo($export) if $id;
# now create a default system for that export, using the standard kernel:
system("slxconfig add-system $self->{'export-name'}");
@@ -251,7 +286,7 @@ sub addExportToConfigDB
$openslxDB->disconnect();
}
-sub removeExportFromConfigDB
+sub _removeExportFromConfigDB
{
my $self = shift;
@@ -260,26 +295,32 @@ sub removeExportFromConfigDB
# remove export from DB:
my $exportName = $self->{'export-name'};
- my $export
- = $openslxDB->fetchExportByFilter({
- 'name' => $exportName,
- });
+ my $export = $openslxDB->fetchExportByFilter({'name' => $exportName,});
if (!defined $export) {
- vlog 0, _tr("Export '%s' doesn't exist in OpenSLX-database.\n",
- $exportName);
+ vlog(
+ 0,
+ _tr(
+ "Export '%s' doesn't exist in OpenSLX-database.\n", $exportName
+ )
+ );
} else {
# remove all systems using this export and then remove the
# export itself:
- my @systemIDs
- = map { $_->{id} }
- $openslxDB->fetchSystemByFilter(
- { 'export_id' => $export->{id} }, 'id'
- );
- vlog 1, _tr("removing systems '%s' from DB, since they belong to the export being deleted.\n",
- join ',', @systemIDs);
+ my @systemIDs =
+ map { $_->{id} }
+ $openslxDB->fetchSystemByFilter({'export_id' => $export->{id}}, 'id');
+ vlog(
+ 1,
+ _tr(
+ "removing systems '%s' from DB, since they belong to the export"
+ . " being deleted.\n",
+ join ',',
+ @systemIDs
+ )
+ );
$openslxDB->removeSystem(\@systemIDs);
$openslxDB->removeExport($export->{id});
- vlog 0, _tr("Export '%s' has been removed from DB.\n", $exportName);
+ vlog(0, _tr("Export '%s' has been removed from DB.\n", $exportName));
}
$openslxDB->disconnect();
@@ -301,3 +342,4 @@ OpenSLX::OSExport::Engine -
...
=cut
+