diff --git a/contracts/sw.blueprint/device-instructions/contract.json b/contracts/sw.blueprint/device-instructions/contract.json new file mode 100644 index 00000000..27f3d0f9 --- /dev/null +++ b/contracts/sw.blueprint/device-instructions/contract.json @@ -0,0 +1,28 @@ +{ + "slug": "device-instructions", + "type": "sw.blueprint", + "version": "1", + "componentVersion": "1", + "aliases": [], + "tags": [], + + "data": { + "selector": { + "sw.os": "1", + "sw.image-writer": "1", + "hw.device-type": "1", + "sw.platform": "1" + }, + "output": { + "filename": "README.txt", + "type": "doc.instructions.device", + "slug": "{{children.sw.platform.slug}}-{{children.hw.device-type.slug}}:{{children.sw.os.slug}}-{{children.sw.os.version}}:{{children.sw.image-writer.slug}}", + "template": [ + { + "name": "instructions", + "data": "1. {{import partial=\"download\" combination=\"sw.os\"}} 2. {{import partial=\"download\" combination=\"sw.image-writer\"}}. {{import partial=\"flash\" combination=\"sw.image-writer+hw.device-type\"}}. 3. {{import partial=\"insert-install-media\" combination=\"hw.device-type\"}}. {{import partial=\"prepare-network\" combination=\"hw.device-type\"}}. {{import partial=\"boot-external\" combination=\"hw.device-type\"}} {{#hw.device-type.storage.internal}} 4. The device should appear on you dashboard in a configuring state. {{import partial=\"description-of-internal-process\" combination=\"sw.image-writer\"}}. {{import partial=\"visual-appearance-when-off\" combination=\"hw.device-type\"}} 5. {{import partial=\"remove-install-media\" combination=\"hw.device-type\"}}. {{import partial=\"boot-internal\" combination=\"hw.device-type\"}} {{/hw.device-type.storage.internal}} 6. Your device should appear here in the IDLE state in 30 seconds or so. Have fun! **Troubleshooting:** If, upon boot, the device LED is blinking in groups of four, it is an indication that the device cannot connect to the internet. Please ensure the network adapter is functional. {{#compare hw.device-type.media.installation \"!==\" \"dfu\"}} **Pro tip:** You can repeat the initialisation steps for any amount of {{hw.device-type.name}}'s you have available, using the same {{hw.device-type.media.installation}}. {{/compare}}" + } + ] + } + } +} diff --git a/contracts/sw.blueprint/docker-images-base/contract.json b/contracts/sw.blueprint/docker-images-base/contract.json new file mode 100644 index 00000000..5afa04d7 --- /dev/null +++ b/contracts/sw.blueprint/docker-images-base/contract.json @@ -0,0 +1,33 @@ +{ + "slug": "docker-images-base", + "type": "sw.blueprint", + "version": "1", + "componentVersion": "1", + "aliases": [], + "tags": [], + + "data": { + "selector": { + "sw.os": "1", + "sw.arch": "1", + "sw.blob": "1+" + }, + "output": { + "filename": "Dockerfile", + "type": "sw.docker-image.base", + "slug": "{{children.sw.arch.slug}}-{{children.sw.os.slug}}:{{children.sw.os.version}}", + "requires": [ + { + "type": "hw.device-type", + "arch": "{{children.sw.arch.slug}}" + } + ], + "template": [ + { + "name": "docker-images", + "data": "{{import partial=\"from\" combination=\"sw.os+sw.arch\"}}\nLABEL io.resin.architecture=\"{{sw.arch.slug}}\"\n{{import partial=\"os-config\" combination=\"sw.os+sw.arch\"}}\n{{#sw.blob.qemu}} {{import partial=\"qemu\" combination=\"sw.os+sw.arch\"}} {{/sw.blob.qemu}}\n{{import partial=\"base-dependencies\" combination=\"sw.os+sw.arch\"}}\nCOPY {{sw.blob.resin-xbuild.assets.bin.main}} /usr/bin/\nRUN ln -s {{sw.blob.resin-xbuild.assets.bin.main}} /usr/bin/cross-build-start \\\n && ln -s {{sw.blob.resin-xbuild.assets.bin.main}} /usr/bin/cross-build-end\n\nENV TINI_VERSION {{sw.blob.tini.version}}\nRUN chmod +x {{sw.blob.tini.assets.bin.main}} \\\n && mv {{sw.blob.tini.assets.bin.main}} /sbin/tini\n\n{{import partial=\"init-system\" combination=\"sw.os+sw.arch\"}}" + } + ] + } + } +} diff --git a/contracts/sw.blueprint/docker-images-device-type/contract.json b/contracts/sw.blueprint/docker-images-device-type/contract.json new file mode 100644 index 00000000..cafa452a --- /dev/null +++ b/contracts/sw.blueprint/docker-images-device-type/contract.json @@ -0,0 +1,26 @@ +{ + "slug": "docker-images-device-type", + "type": "sw.blueprint", + "version": "1", + "componentVersion": "1", + "aliases": [], + "tags": [], + + "data": { + "selector": { + "hw.device-type": "1", + "sw.docker-image.base": "1" + }, + "output": { + "filename": "Dockerfile", + "type": "sw.docker-image.device-type", + "slug": "{{children.hw.device-type.slug}}-{{children.sw.docker-image.base.children.sw.os.slug}}:{{children.hw.device-type.version}}-{{children.sw.docker-image.base.children.sw.os.version}}", + "template": [ + { + "name": "docker-images", + "data": "FROM resin/{{sw.docker-image.base.slug}}\nLABEL io.resin.device-type=\"{{hw.device-type.slug}}\"\n{{import partial=\"distro-config\" combination=\"sw.os+hw.device-type\"}}\n{{import partial=\"dependencies\" combination=\"sw.os+hw.device-type\"}}" + } + ] + } + } +} diff --git a/schema/sw.blueprint.json b/schema/sw.blueprint.json new file mode 100644 index 00000000..31f78992 --- /dev/null +++ b/schema/sw.blueprint.json @@ -0,0 +1,74 @@ +{ + "$id": "sw.blueprint.json", + "type": "object", + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "data": { + "type": "object", + "properties": { + "selector": { + "$id": "/properties/selector", + "type": "object", + "patternProperties": { + "^.*$": { + "anyOf": [ + { + "type": "string", + }, + { + "type": "array", + "additionalItems": false, + "items": { + "type": "string" + } + } + ] + } + } + }, + "output": { + "$id": "/properties/output", + "type": "object", + "additionalProperties": false, + "allOf": [ + { + "$ref": "contract.json#/definitions/partialContract" + }, + { + "properties": { + "filename": { + "$id": "/properties/output/properties/filename", + "type": "string", + "pattern": "^(\\.\\.\/|[a-zA-Z0-9_/\\\\-])*\\.[a-zA-Z0-9]+$" + }, + "template": { + "$id": "/properties/output/properties/template", + "type": "array", + "additionalItems": false, + "items": { + "$id": "/properties/output/properties/template/items", + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "$id": "/properties/output/properties/template/items/properties/name", + "type": "string" + }, + "data": { + "$id": "/properties/output/properties/template/items/properties/data", + "type": "string" + } + }, + "required": [ "name", "data" ] + } + } + }, + "required": [ "properties", "template" ] + } + ] + } + } + } + } +}