[libcalamaresui] Chase the change in Module descriptor

- most of the code becomes **simpler** because the requirement
  to handle unstructured data is now in the descriptor itself,
  rather than in consumers.
This commit is contained in:
Adriaan de Groot 2020-08-11 22:12:16 +02:00
parent ee834a7abb
commit 3c6e53ecb9
11 changed files with 42 additions and 69 deletions

View File

@ -84,13 +84,12 @@ CppJobModule::jobs() const
void void
CppJobModule::initFrom( const QVariantMap& moduleDescriptor ) CppJobModule::initFrom( const ModuleSystem::Descriptor& moduleDescriptor )
{ {
QDir directory( location() ); QDir directory( location() );
QString load; QString load = moduleDescriptor.load();
if ( !moduleDescriptor.value( "load" ).toString().isEmpty() ) if ( !load.isEmpty() )
{ {
load = moduleDescriptor.value( "load" ).toString();
load = directory.absoluteFilePath( load ); load = directory.absoluteFilePath( load );
} }
// If a load path is not specified, we look for a plugin to load in the directory. // If a load path is not specified, we look for a plugin to load in the directory.

View File

@ -39,7 +39,7 @@ public:
JobList jobs() const override; JobList jobs() const override;
protected: protected:
void initFrom( const QVariantMap& moduleDescriptor ) override; void initFrom( const ModuleSystem::Descriptor& moduleDescriptor ) override;
private: private:
explicit CppJobModule(); explicit CppJobModule();

View File

@ -52,23 +52,22 @@ moduleFromDescriptor( const Calamares::ModuleSystem::Descriptor& moduleDescripto
const QString& configFileName, const QString& configFileName,
const QString& moduleDirectory ) const QString& moduleDirectory )
{ {
using Type = Calamares::ModuleSystem::Type;
using Interface = Calamares::ModuleSystem::Interface;
std::unique_ptr< Module > m; std::unique_ptr< Module > m;
QString typeString = moduleDescriptor.value( "type" ).toString(); if ( !moduleDescriptor.isValid() ) {
QString intfString = moduleDescriptor.value( "interface" ).toString();
if ( typeString.isEmpty() || intfString.isEmpty() )
{
cError() << "Bad module descriptor format" << instanceId; cError() << "Bad module descriptor format" << instanceId;
return nullptr; return nullptr;
} }
if ( ( typeString == "view" ) || ( typeString == "viewmodule" ) ) if ( moduleDescriptor.type() == Type::View )
{ {
if ( intfString == "qtplugin" ) if ( moduleDescriptor.interface() == Interface::QtPlugin )
{ {
m.reset( new ViewModule() ); m.reset( new ViewModule() );
} }
else if ( intfString == "pythonqt" ) else if ( moduleDescriptor.interface() == Interface::PythonQt )
{ {
#ifdef WITH_PYTHONQT #ifdef WITH_PYTHONQT
m.reset( new PythonQtViewModule() ); m.reset( new PythonQtViewModule() );
@ -78,20 +77,20 @@ moduleFromDescriptor( const Calamares::ModuleSystem::Descriptor& moduleDescripto
} }
else else
{ {
cError() << "Bad interface" << intfString << "for module type" << typeString; cError() << "Bad interface" << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() ) << "for module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
} }
} }
else if ( typeString == "job" ) else if ( moduleDescriptor.type() == Type::Job )
{ {
if ( intfString == "qtplugin" ) if ( moduleDescriptor.interface() == Interface::QtPlugin )
{ {
m.reset( new CppJobModule() ); m.reset( new CppJobModule() );
} }
else if ( intfString == "process" ) else if ( moduleDescriptor.interface() == Interface::Process )
{ {
m.reset( new ProcessJobModule() ); m.reset( new ProcessJobModule() );
} }
else if ( intfString == "python" ) else if ( moduleDescriptor.interface() == Interface::Python )
{ {
#ifdef WITH_PYTHON #ifdef WITH_PYTHON
m.reset( new PythonJobModule() ); m.reset( new PythonJobModule() );
@ -101,17 +100,17 @@ moduleFromDescriptor( const Calamares::ModuleSystem::Descriptor& moduleDescripto
} }
else else
{ {
cError() << "Bad interface" << intfString << "for module type" << typeString; cError() << "Bad interface" << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() ) << "for module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
} }
} }
else else
{ {
cError() << "Bad module type" << typeString; cError() << "Bad module type" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() );
} }
if ( !m ) if ( !m )
{ {
cError() << "Bad module type (" << typeString << ") or interface string (" << intfString << ") for module " cError() << "Bad module type (" << Calamares::ModuleSystem::typeNames().find( moduleDescriptor.type() ) << ") or interface string (" << Calamares::ModuleSystem::interfaceNames().find( moduleDescriptor.interface() ) << ") for module "
<< instanceId; << instanceId;
return nullptr; return nullptr;
} }

View File

@ -114,9 +114,9 @@ ModuleManager::doInit()
if ( ok && !moduleName.isEmpty() && ( moduleName == currentDir.dirName() ) if ( ok && !moduleName.isEmpty() && ( moduleName == currentDir.dirName() )
&& !m_availableDescriptorsByModuleName.contains( moduleName ) ) && !m_availableDescriptorsByModuleName.contains( moduleName ) )
{ {
m_availableDescriptorsByModuleName.insert( moduleName, moduleDescriptorMap ); auto descriptor = Calamares::ModuleSystem::Descriptor::fromDescriptorData( moduleDescriptorMap );
m_moduleDirectoriesByModuleName.insert( moduleName, descriptor.setDirectory(descriptorFileInfo.absoluteDir().absolutePath() );
descriptorFileInfo.absoluteDir().absolutePath() ); m_availableDescriptorsByModuleName.insert( moduleName, descriptor );
} }
} }
else else
@ -132,8 +132,7 @@ ModuleManager::doInit()
} }
// At this point m_availableDescriptorsByModuleName is filled with // At this point m_availableDescriptorsByModuleName is filled with
// the modules that were found in the search paths. // the modules that were found in the search paths.
cDebug() << "Found" << m_availableDescriptorsByModuleName.count() << "modules" cDebug() << "Found" << m_availableDescriptorsByModuleName.count() << "modules";
<< m_moduleDirectoriesByModuleName.count() << "names";
emit initDone(); emit initDone();
} }
@ -169,7 +168,7 @@ getConfigFileName( const Settings::InstanceDescriptionList& descriptorList,
const ModuleSystem::InstanceKey& instanceKey, const ModuleSystem::InstanceKey& instanceKey,
const ModuleSystem::Descriptor& descriptor ) const ModuleSystem::Descriptor& descriptor )
{ {
if ( descriptor.value( "noconfig", false ).toBool() ) if ( !descriptor.hasConfig() )
{ {
// Explicitly set to no-configuration. This doesn't apply // Explicitly set to no-configuration. This doesn't apply
// to custom instances (above) since the only reason to // to custom instances (above) since the only reason to
@ -217,7 +216,7 @@ ModuleManager::loadModules()
ModuleSystem::Descriptor descriptor ModuleSystem::Descriptor descriptor
= m_availableDescriptorsByModuleName.value( instanceKey.module(), ModuleSystem::Descriptor() ); = m_availableDescriptorsByModuleName.value( instanceKey.module(), ModuleSystem::Descriptor() );
if ( descriptor.isEmpty() ) if ( !descriptor.isValid() )
{ {
cError() << "Module" << instanceKey.toString() << "not found in module search paths." cError() << "Module" << instanceKey.toString() << "not found in module search paths."
<< Logger::DebugList( m_paths ); << Logger::DebugList( m_paths );
@ -258,7 +257,7 @@ ModuleManager::loadModules()
= Calamares::moduleFromDescriptor( descriptor, = Calamares::moduleFromDescriptor( descriptor,
instanceKey.id(), instanceKey.id(),
configFileName, configFileName,
m_moduleDirectoriesByModuleName.value( instanceKey.module() ) ); descriptor.directory() );
if ( !thisModule ) if ( !thisModule )
{ {
cError() << "Module" << instanceKey.toString() << "cannot be created from descriptor" cError() << "Module" << instanceKey.toString() << "cannot be created from descriptor"
@ -358,7 +357,7 @@ ModuleManager::checkRequirements()
} }
static QStringList static QStringList
missingRequiredModules( const QStringList& required, const QMap< QString, QVariantMap >& available ) missingRequiredModules( const QStringList& required, const QMap< QString, ModuleSystem::Descriptor >& available )
{ {
QStringList l; QStringList l;
for ( const QString& depName : required ) for ( const QString& depName : required )
@ -386,12 +385,12 @@ ModuleManager::checkDependencies()
for ( auto it = m_availableDescriptorsByModuleName.begin(); it != m_availableDescriptorsByModuleName.end(); for ( auto it = m_availableDescriptorsByModuleName.begin(); it != m_availableDescriptorsByModuleName.end();
++it ) ++it )
{ {
QStringList unmet = missingRequiredModules( it->value( "requiredModules" ).toStringList(), QStringList unmet = missingRequiredModules( it->requiredModules(),
m_availableDescriptorsByModuleName ); m_availableDescriptorsByModuleName );
if ( unmet.count() > 0 ) if ( unmet.count() > 0 )
{ {
QString moduleName = it->value( "name" ).toString(); QString moduleName = it->name();
somethingWasRemovedBecauseOfUnmetDependencies = true; somethingWasRemovedBecauseOfUnmetDependencies = true;
m_availableDescriptorsByModuleName.erase( it ); m_availableDescriptorsByModuleName.erase( it );
numberRemoved++; numberRemoved++;
@ -415,7 +414,7 @@ ModuleManager::checkModuleDependencies( const Module& m )
bool allRequirementsFound = true; bool allRequirementsFound = true;
QStringList requiredModules QStringList requiredModules
= m_availableDescriptorsByModuleName[ m.name() ].value( "requiredModules" ).toStringList(); = m_availableDescriptorsByModuleName[ m.name() ].requiredModules();
for ( const QString& required : requiredModules ) for ( const QString& required : requiredModules )
{ {

View File

@ -162,7 +162,6 @@ private:
bool checkModuleDependencies( const Module& ); bool checkModuleDependencies( const Module& );
QMap< QString, ModuleSystem::Descriptor > m_availableDescriptorsByModuleName; QMap< QString, ModuleSystem::Descriptor > m_availableDescriptorsByModuleName;
QMap< QString, QString > m_moduleDirectoriesByModuleName;
QMap< ModuleSystem::InstanceKey, Module* > m_loadedModulesByInstanceKey; QMap< ModuleSystem::InstanceKey, Module* > m_loadedModulesByInstanceKey;
const QStringList m_paths; const QStringList m_paths;
RequirementsModel* m_requirementsModel; RequirementsModel* m_requirementsModel;

View File

@ -61,32 +61,14 @@ ProcessJobModule::jobs() const
void void
ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor ) ProcessJobModule::initFrom( const ModuleSystem::Descriptor& moduleDescriptor )
{ {
QDir directory( location() ); QDir directory( location() );
m_workingPath = directory.absolutePath(); m_workingPath = directory.absolutePath();
if ( !moduleDescriptor.value( "command" ).toString().isEmpty() ) m_command = moduleDescriptor.command();
{ m_secondsTimeout = std::chrono::seconds( moduleDescriptor.timeout() );
m_command = moduleDescriptor.value( "command" ).toString(); m_runInChroot = moduleDescriptor.chroot();
}
m_secondsTimeout = std::chrono::seconds( 30 );
if ( moduleDescriptor.contains( "timeout" ) && !moduleDescriptor.value( "timeout" ).isNull() )
{
int sec = moduleDescriptor.value( "timeout" ).toInt();
if ( sec < 0 )
{
sec = 0;
}
m_secondsTimeout = std::chrono::seconds( sec );
}
m_runInChroot = false;
if ( moduleDescriptor.contains( "chroot" ) && !moduleDescriptor.value( "chroot" ).isNull() )
{
m_runInChroot = moduleDescriptor.value( "chroot" ).toBool();
}
} }

View File

@ -38,7 +38,7 @@ public:
JobList jobs() const override; JobList jobs() const override;
protected: protected:
void initFrom( const QVariantMap& moduleDescriptor ) override; void initFrom( const ModuleSystem::Descriptor& moduleDescriptor ) override;
private: private:
explicit ProcessJobModule(); explicit ProcessJobModule();

View File

@ -62,15 +62,11 @@ PythonJobModule::jobs() const
void void
PythonJobModule::initFrom( const QVariantMap& moduleDescriptor ) PythonJobModule::initFrom( const ModuleSystem::Descriptor& moduleDescriptor )
{ {
QDir directory( location() ); QDir directory( location() );
m_workingPath = directory.absolutePath(); m_workingPath = directory.absolutePath();
m_scriptFileName = moduleDescriptor.script();
if ( !moduleDescriptor.value( "script" ).toString().isEmpty() )
{
m_scriptFileName = moduleDescriptor.value( "script" ).toString();
}
} }

View File

@ -35,7 +35,7 @@ public:
JobList jobs() const override; JobList jobs() const override;
protected: protected:
void initFrom( const QVariantMap& moduleDescriptor ) override; void initFrom( const ModuleSystem::Descriptor& moduleDescriptor ) override;
private: private:
explicit PythonJobModule(); explicit PythonJobModule();

View File

@ -89,13 +89,12 @@ ViewModule::jobs() const
void void
ViewModule::initFrom( const QVariantMap& moduleDescriptor ) ViewModule::initFrom( const ModuleSystem::Descriptor& moduleDescriptor )
{ {
QDir directory( location() ); QDir directory( location() );
QString load; QString load = moduleDescriptor.load();
if ( !moduleDescriptor.value( "load" ).toString().isEmpty() ) if ( !load.isEmpty() )
{ {
load = moduleDescriptor.value( "load" ).toString();
load = directory.absoluteFilePath( load ); load = directory.absoluteFilePath( load );
} }
// If a load path is not specified, we look for a plugin to load in the directory. // If a load path is not specified, we look for a plugin to load in the directory.

View File

@ -42,7 +42,7 @@ public:
RequirementsList checkRequirements() override; RequirementsList checkRequirements() override;
protected: protected:
void initFrom( const QVariantMap& moduleDescriptor ) override; void initFrom( const ModuleSystem::Descriptor& moduleDescriptor ) override;
private: private:
explicit ViewModule(); explicit ViewModule();