From e500a8268018437426faa0d37efb391021d94fd8 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Thu, 25 Feb 2021 17:08:27 +0100 Subject: [PATCH] feat: Create configurations to integrate dynamic pod creation --- config/config-dynamic.json | 37 ++++++ config/presets/cli-params.json | 5 + config/presets/pod-dynamic.json | 143 +++++++++++++++++++++++ config/templates/storage-defaults.json | 51 ++++++++ config/templates/storage-filesystem.json | 37 ++++++ config/templates/storage-memory.json | 19 +++ src/init/CliRunner.ts | 3 + test/unit/init/CliRunner.test.ts | 5 + 8 files changed, 300 insertions(+) create mode 100644 config/config-dynamic.json create mode 100644 config/presets/pod-dynamic.json create mode 100644 config/templates/storage-defaults.json create mode 100644 config/templates/storage-filesystem.json create mode 100644 config/templates/storage-memory.json diff --git a/config/config-dynamic.json b/config/config-dynamic.json new file mode 100644 index 000000000..f0810d89c --- /dev/null +++ b/config/config-dynamic.json @@ -0,0 +1,37 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/presets/acl.json", + "files-scs:config/presets/http.json", + "files-scs:config/presets/identifiers/suffix-identifiers.json", + "files-scs:config/presets/init.json", + "files-scs:config/presets/ldp.json", + "files-scs:config/presets/ldp/credentials-extractor.json", + "files-scs:config/presets/ldp/metadata-handler.json", + "files-scs:config/presets/ldp/operation-handler.json", + "files-scs:config/presets/ldp/permissions-extractor.json", + "files-scs:config/presets/ldp/response-writer.json", + "files-scs:config/presets/ldp/request-parser.json", + "files-scs:config/presets/ldp/websockets.json", + "files-scs:config/presets/logging.json", + "files-scs:config/presets/middleware.json", + "files-scs:config/presets/pod-dynamic.json", + "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", + "files-scs:config/presets/storage/backend/storage-memory.json", + "files-scs:config/presets/storage-wrapper.json", + "files-scs:config/presets/cli-params.json" + ], + "@graph": [ + { + "comment": "This configuration sets up a server that allows for the creation of dynamic pods through pod provisioning." + }, + { + "comment": "Which store to use for requests that do not match any pod", + "@id": "urn:solid-server:default:BaseUrlRouterRule", + "BaseUrlRouterRule:_baseStore": { + "@id": "urn:solid-server:default:MemoryResourceStore" + } + } + ] +} diff --git a/config/presets/cli-params.json b/config/presets/cli-params.json index bfa7e602c..7039e891b 100644 --- a/config/presets/cli-params.json +++ b/config/presets/cli-params.json @@ -24,6 +24,11 @@ { "@id": "urn:solid-server:default:variable:podTemplateFolder", "@type": "Variable" + }, + { + "comment": "Path to the JSON file used to store configuration for dynamic pods.", + "@id": "urn:solid-server:default:variable:podConfigJson", + "@type": "Variable" } ] } diff --git a/config/presets/pod-dynamic.json b/config/presets/pod-dynamic.json new file mode 100644 index 000000000..a07fdfe32 --- /dev/null +++ b/config/presets/pod-dynamic.json @@ -0,0 +1,143 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Sets up all the classes that are specifically necessary for dynamic pod generation." + }, + + { + "@id": "urn:solid-server:default:PodConfigurationStorage", + "@type": "JsonFileStorage", + "JsonFileStorage:_filePath": "urn:solid-server:default:variable:podConfigJson", + "JsonFileStorage:_locker": { + "@id": "urn:solid-server:default:ResourceLocker" + } + }, + { + "@id": "urn:solid-server:default:PodRoutingStorage", + "@type": "ResourceIdentifierStorage", + "ResourceIdentifierStorage:_source": { + "@type": "MemoryMapStorage" + } + }, + + { + "@id": "urn:solid-server:default:StoreFactory", + "@type": "BaseComponentsJsFactory" + }, + + { + "@id": "urn:solid-server:default:PodGenerator", + "@type": "TemplatedPodGenerator", + "TemplatedPodGenerator:_storeFactory": { + "@id": "urn:solid-server:default:StoreFactory" + }, + "TemplatedPodGenerator:_variableHandler": { + "@type": "ParallelHandler", + "ParallelHandler:_handlers": [ + { + "@type": "BaseUrlHandler" + }, + { + "@type": "RootFilePathHandler", + "RootFilePathHandler:_fileMapper": { + "@type": "ExtensionBasedMapper", + "ExtensionBasedMapper:_base": { + "@id": "urn:solid-server:default:variable:baseUrl" + }, + "ExtensionBasedMapper:_rootFilepath": { + "@id": "urn:solid-server:default:variable:rootFilePath" + }, + "ExtensionBasedMapper:_overrideTypes_acl": "text/turtle", + "ExtensionBasedMapper:_overrideTypes_meta": "text/turtle" + } + } + ] + }, + "TemplatedPodGenerator:_configStorage": { + "@id": "urn:solid-server:default:PodConfigurationStorage" + } + }, + + { + "@id": "urn:solid-server:default:PodManager", + "@type": "ConfigPodManager", + "ConfigPodManager:_idGenerator": { + "@type": "SuffixIdentifierGenerator", + "SuffixIdentifierGenerator:_base": { + "@id": "urn:solid-server:default:variable:baseUrl" + } + }, + "ConfigPodManager:_podGenerator": { + "@id": "urn:solid-server:default:PodGenerator" + }, + "ConfigPodManager:_routingStorage": { + "@id": "urn:solid-server:default:PodRoutingStorage" + }, + "ConfigPodManager:_resourcesGenerator": { + "@id": "urn:solid-server:default:ResourcesGenerator", + "@type": "TemplatedResourcesGenerator", + "TemplatedResourcesGenerator:_templateFolder": { + "@id": "urn:solid-server:default:variable:podTemplateFolder" + }, + "TemplatedResourcesGenerator:_factory": { + "@type": "ExtensionBasedMapperFactory" + }, + "TemplatedResourcesGenerator:_engine": { + "@type": "HandlebarsTemplateEngine" + } + } + }, + + { + "@id": "urn:solid-server:default:PodManagerHandler", + "@type": "PodManagerHttpHandler", + "PodManagerHttpHandler:_args_requestPath": "/pods", + "PodManagerHttpHandler:_args_requestParser": { + "@id": "urn:solid-server:default:RequestParser" + }, + "PodManagerHttpHandler:_args_podSettingsParser": { + "@type": "PodSettingsJsonParser" + }, + "PodManagerHttpHandler:_args_manager": { + "@id": "urn:solid-server:default:PodManager" + }, + "PodManagerHttpHandler:_args_responseWriter": { + "@id": "urn:solid-server:default:ResponseWriter" + } + }, + + { + "@id": "urn:solid-server:default:Initializer", + "comment": "Add entry to initializer list", + "SequenceHandler:_handlers": { + "@type": "ConfigPodInitializer", + "ConfigPodInitializer:_storeFactory": { + "@id": "urn:solid-server:default:StoreFactory" + }, + "ConfigPodInitializer:_configStorage": { + "@id": "urn:solid-server:default:PodConfigurationStorage" + }, + "ConfigPodInitializer:_routingStorage": { + "@id": "urn:solid-server:default:PodRoutingStorage" + } + } + }, + + { + "@id": "urn:solid-server:default:BaseUrlRouterRule", + "@type": "BaseUrlRouterRule", + "BaseUrlRouterRule:_stores": { + "@id": "urn:solid-server:default:PodRoutingStorage" + } + }, + + { + "@id": "urn:solid-server:default:RoutingResourceStore", + "@type": "RoutingResourceStore", + "RoutingResourceStore:_rule": { + "@id": "urn:solid-server:default:BaseUrlRouterRule" + } + } + ] +} diff --git a/config/templates/storage-defaults.json b/config/templates/storage-defaults.json new file mode 100644 index 000000000..6694ecccd --- /dev/null +++ b/config/templates/storage-defaults.json @@ -0,0 +1,51 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/presets/acl.json", + "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json" + ], + "@graph": [ + { + "comment": "Configures classes that are used by all other storage-*.json configurations." + }, + + { + "@id": "urn:solid-server:default:AuxiliaryStrategy", + "comment": "Copied from storage-wrapper.json since a variable is required in there", + "@type": "RoutingAuxiliaryStrategy", + "RoutingAuxiliaryStrategy:_sources": [ + { + "@id": "urn:solid-server:default:AclStrategy" + } + ] + }, + + { + "@id": "urn:solid-server:template:IdentifierStrategy", + "@type": "SingleRootIdentifierStrategy", + "SingleRootIdentifierStrategy:_baseUrl": { + "@id": "urn:solid-server:template:variable:baseUrl" + } + }, + + { + "@id": "urn:solid-server:template:ResourceStore", + "@type": "DataAccessorBasedStore", + "DataAccessorBasedStore:_accessor": { + "@id": "urn:solid-server:template:DataAccessor" + }, + "DataAccessorBasedStore:_identifierStrategy": { + "@id": "urn:solid-server:template:IdentifierStrategy" + }, + "DataAccessorBasedStore:_auxiliaryStrategy": { + "@id": "urn:solid-server:default:AuxiliaryStrategy" + } + }, + + { + "@id": "urn:solid-server:template:variable:baseUrl", + "@type": "Variable" + } + ] +} diff --git a/config/templates/storage-filesystem.json b/config/templates/storage-filesystem.json new file mode 100644 index 000000000..1c6c6439f --- /dev/null +++ b/config/templates/storage-filesystem.json @@ -0,0 +1,37 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/templates/storage-defaults.json" + ], + "@graph": [ + { + "comment": "Sets up a file data accessor with corresponding extension based file mapper." + }, + + { + "@id": "urn:solid-server:template:FileIdentifierMapper", + "@type": "ExtensionBasedMapper", + "ExtensionBasedMapper:_base": { + "@id": "urn:solid-server:template:variable:baseUrl" + }, + "ExtensionBasedMapper:_rootFilepath": { + "@id": "urn:solid-server:template:variable:rootFilePath" + }, + "ExtensionBasedMapper:_overrideTypes_acl": "text/turtle", + "ExtensionBasedMapper:_overrideTypes_meta": "text/turtle" + }, + + { + "@id": "urn:solid-server:template:DataAccessor", + "@type": "FileDataAccessor", + "FileDataAccessor:_resourceMapper": { + "@id": "urn:solid-server:template:FileIdentifierMapper" + } + }, + + { + "@id": "urn:solid-server:template:variable:rootFilePath", + "@type": "Variable" + } + ] +} diff --git a/config/templates/storage-memory.json b/config/templates/storage-memory.json new file mode 100644 index 000000000..bc44163ea --- /dev/null +++ b/config/templates/storage-memory.json @@ -0,0 +1,19 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/templates/storage-defaults.json" + ], + "@graph": [ + { + "comment": "Sets up a memory data accessor." + }, + + { + "@id": "urn:solid-server:template:DataAccessor", + "@type": "InMemoryDataAccessor", + "InMemoryDataAccessor:_strategy": { + "@id": "urn:solid-server:template:IdentifierStrategy" + } + } + ] +} diff --git a/src/init/CliRunner.ts b/src/init/CliRunner.ts index 57610b879..ac5e01d8b 100644 --- a/src/init/CliRunner.ts +++ b/src/init/CliRunner.ts @@ -37,6 +37,7 @@ export class CliRunner { port: { type: 'number', alias: 'p', default: 3000 }, rootFilePath: { type: 'string', alias: 'f', default: './' }, sparqlEndpoint: { type: 'string', alias: 's' }, + podConfigJson: { type: 'string', default: './pod-config.json' }, }) .help(); @@ -89,6 +90,8 @@ export class CliRunner { 'urn:solid-server:default:variable:sparqlEndpoint': params.sparqlEndpoint, 'urn:solid-server:default:variable:podTemplateFolder': this.resolveFilePath(params.podTemplateFolder, 'templates/pod'), + 'urn:solid-server:default:variable:podConfigJson': + this.resolveFilePath(params.podConfigJson), }; } diff --git a/test/unit/init/CliRunner.test.ts b/test/unit/init/CliRunner.test.ts index d0ad36315..ced53919e 100644 --- a/test/unit/init/CliRunner.test.ts +++ b/test/unit/init/CliRunner.test.ts @@ -60,6 +60,7 @@ describe('CliRunner', (): void => { 'urn:solid-server:default:variable:sparqlEndpoint': undefined, 'urn:solid-server:default:variable:loggingLevel': 'info', 'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../../../templates/pod'), + 'urn:solid-server:default:variable:podConfigJson': '/var/cwd/pod-config.json', }, }, ); @@ -79,6 +80,7 @@ describe('CliRunner', (): void => { '-p', '4000', '-s', 'http://localhost:5000/sparql', '-t', 'templates', + '--podConfigJson', '/different-path.json', ], }); @@ -106,6 +108,7 @@ describe('CliRunner', (): void => { 'urn:solid-server:default:variable:port': 4000, 'urn:solid-server:default:variable:rootFilePath': '/root', 'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql', + 'urn:solid-server:default:variable:podConfigJson': '/different-path.json', }, }, ); @@ -123,6 +126,7 @@ describe('CliRunner', (): void => { '--port', '4000', '--rootFilePath', 'root', '--sparqlEndpoint', 'http://localhost:5000/sparql', + '--podConfigJson', '/different-path.json', ], }); @@ -150,6 +154,7 @@ describe('CliRunner', (): void => { 'urn:solid-server:default:variable:port': 4000, 'urn:solid-server:default:variable:rootFilePath': '/var/cwd/root', 'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql', + 'urn:solid-server:default:variable:podConfigJson': '/different-path.json', }, }, );