From e18e0b7e283d476ec47e1c9665f066c5b016fad1 Mon Sep 17 00:00:00 2001 From: Taras Drozdovskyi Date: Tue, 20 Apr 2021 05:21:25 +0300 Subject: [PATCH] Add guide "how to add new platform" (#295) Signed-off-by: Taras Drozdovskyi - This PR provides a guide for adding a new platform. - Fixes #127 --- README.md | 22 +++--- docs/how-to-add-new-platform.md | 63 ++++++++++++++++++ docs/images/add-new-platform_150.png | Bin 0 -> 12284 bytes docs/platforms/raspberry_pi3/raspberry_pi3.md | 2 +- 4 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 docs/how-to-add-new-platform.md create mode 100644 docs/images/add-new-platform_150.png diff --git a/README.md b/README.md index 3f2583f0..55997f4c 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,12 @@ You can see our project roadmap and details about release notes since our projec ## Platforms supported -| **x86-64 Linux** | **Raspberry Pi3** | **HiKey960** | **Raspberry Pi3 Cluster** | **Orange Pi3** | -|------------------|-------------------|--------------|---------------------------|----------------| +| **x86-64 Linux** | **Raspberry Pi3** | **HiKey960** | **Raspberry Pi3 Cluster** | +|------------------|-------------------|--------------|---------------------------| |[![](docs/platforms/x86_64_linux/x86_64_linux.png)](docs/platforms/x86_64_linux/x86_64_linux.md)|[![](docs/platforms/raspberry_pi3/raspberry_pi3.jpg)](docs/platforms/raspberry_pi3/raspberry_pi3.md)|[![](docs/platforms/hikey960/hikey960.png)](docs/platforms/hikey960/hikey960.md)|[![](docs/platforms/raspberry_pi3_cluster/raspberry_pi3_cluster.jpg)](docs/platforms/raspberry_pi3_cluster/raspberry_pi3_cluster.md)|[![](docs/platforms/orange_pi3/orange_pi3.jpg)](docs/platforms/orange_pi3/orange_pi3.md)| +| **Orange Pi3** | **Add a new Platform** ||| +|[![](docs/platforms/orange_pi3/orange_pi3.jpg)](docs/platforms/orange_pi3/orange_pi3.md)|[![](docs/images/add-new-platform_150.png)](docs/how-to-add-new-platform.md)||| + --- @@ -55,14 +58,13 @@ You can see our project roadmap and details about release notes since our projec Please select the target platform in the table below and follow the link. -| Platform | Maintained | -|-------------------------|------------| -| [x86_64 Linux] | coconut | -| [Raspberry Pi3] | coconut | -| [HiKey960] | coconut | -| [Raspberry Pi3 Cluster] | coconut | -| [Orange Pi3] | coconut | - +| Platform | Maintained | Maintainer | Remarks | +|-------------------------|-------------|--------------| ----------------------------------| +| [x86_64 Linux] | coconut | @lf-edge/edge-home-orchestration-go-committers | | +| [Raspberry Pi3] | coconut | @t25kim | | +| [HiKey960] | coconut | @tdrozdovsky | | +| [Raspberry Pi3 Cluster] | coconut | @tdrozdovsky | | +| [Orange Pi3] | coconut | @Vitalii55 | | --- ## Documentation diff --git a/docs/how-to-add-new-platform.md b/docs/how-to-add-new-platform.md new file mode 100644 index 00000000..6a43294b --- /dev/null +++ b/docs/how-to-add-new-platform.md @@ -0,0 +1,63 @@ +# How to add a new platform + +# Contents +1. [Introduction](#1-introduction) +2. [Add a new platform](#2-add-a-new-platform) + 2.1 [Additional code structure](#21-additional-code-structure) + 2.2 [Update README.md](#22-update-readmemd) +3. [Code inclusion to Edge-Orchestration upstream](#3-code-inclusion-to-edge-orchestration-upstream) + +## 1. Introduction +This document provides a description of how to add a new platform to the Edge-Orchestration project. + +## 2. Add a new platform +First of all, you can familiarize yourself with the [Raspberry Pi 3 example](./platforms/raspberry_pi3/raspberry_pi3.md) and do the same. +Porting a new platform is a simple process with three main parts. + +### 2.1 Additional code structure + +You must first create a directory with the name of your platform ``, a file with description `.md` and a picture of the platform `.png`. Example see below: +``` +... +├── docs +│   ├── platforms +│   │   ├── +│   │   │   ├── .md +│   │   │   └── .png +│   │   ├── raspberry_pi3 +│   │   │   ├── raspberry_pi3.jpg +│   │   │   └── raspberry_pi3.md +... + +``` +#### 2.1.1 .md +The following aspects need to be described in this file: + * Describe how to create or where to download a Linux image. + * How to start and configure Linux (network configuration if required). + * How to download and run pre-built Docker image (`edge-orchestration.tar`) without building and/or describe the procedure for how to build `edge-orchestration.tar` directly on the board. + * Describe the procedure for launching a docker on the board without root permission. + + > The above points are required. If you have additional information, you can provide it without hesitation. + +#### 2.1.2 .png +The requirement for this file is as follows: + * Display the board at an angle to make it easy to recognize. + * Size no more than 150 pixels in width or height. + * Picture format `png` or `jpg`. + * Preferably white background. + +### 2.2 Update README.md +There is a section [3. Platforms Supported](https://github.com/lf-edge/edge-home-orchestration-go#platforms-supported) which lists all devices that are supported in the Edge-Orchestration, you must add your platform by specifying a link to the description and picture of the platform. +You also need to add a platform description into [Quick start guides for supported platforms](https://github.com/lf-edge/edge-home-orchestration-go#quick-start-guides-for-supported-platforms) +where: + * **Platform** - platform name and link to quick start guide + * **Maintained** - version or repository tag the Edge-Orchestration was tested latest + * **Maintainer** - contact person who can help to run Edge-Orchestration on the this platform + * **Remarks** - additional important information + +## 3. Code inclusion to Edge-Orchestration upstream +We do encourage everyone to submit their board support to the edge-orchestration project itself, so it becomes part of the official releases and will be maintained by the edge-orchestration community itself. If you intend to do so, then there are a few more things that you are supposed to do. + +If you are submitting the board support upstream and cannot give Edge-Orchestration maintainers your platform, then we are going to ask you to become the maintainer of the platform you have added. By being a maintainer for the platform you are responsible to keep it up to date and we will be ask to test every the Edge-Orchestration release on your platform. + +[README.md]: ../README.md diff --git a/docs/images/add-new-platform_150.png b/docs/images/add-new-platform_150.png new file mode 100644 index 0000000000000000000000000000000000000000..543245dc0d0572e2e6c0d9da30cf89f7bcf77226 GIT binary patch literal 12284 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