From ce0fa3be5ff0281a7587cce9709b6fbfb548f24c Mon Sep 17 00:00:00 2001 From: Katrina Prosise Date: Thu, 17 Aug 2023 09:18:28 -0400 Subject: [PATCH] Cleanup user-guide pages mu-t The last pages of the User Guide requiring cleanup have been addressed. Simplified language and rst, style fixes. QA Steps: Did not step through all instructions. Rendered HTML was inspected visually. Ran linter and linkcheck. This commit applies to FFTK 988 Signed-off-by: Katrina Prosise --- .../_static/userguide/submodule/newrepo.png | Bin 15452 -> 0 bytes .../multi-stage-container.rst | 139 ++++++------------ .../offline-update/offline-update.rst | 19 ++- source/user-guide/submodule/submodule.rst | 137 +++++++---------- .../troubleshooting/troubleshooting.rst | 15 +- 5 files changed, 118 insertions(+), 192 deletions(-) delete mode 100644 source/_static/userguide/submodule/newrepo.png diff --git a/source/_static/userguide/submodule/newrepo.png b/source/_static/userguide/submodule/newrepo.png deleted file mode 100644 index 5f9b9a63742ec386ae864cbdadcb79f7aea952f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15452 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 ghyRImTzv70CoKR0D~ int main() @@ -65,17 +52,11 @@ Create the ``helloworld.c`` file: printf("hello, world!\n"); } - /* helloworld.c */ + /* helloworld.c \*/ Create the ``start.sh`` file: -.. prompt:: bash host:~$, auto - - host:~$ gedit start.sh - -**start.sh**: - -.. prompt:: text +.. code-block:: bash #!/bin/sh @@ -96,13 +77,9 @@ Single Stage Container Create the ``Dockerfile`` that implements the single stage container: -.. prompt:: bash host:~$, auto - - host:~$ gedit single/Dockerfile +``single/Dockerfile``: -**single/Dockerfile**: - -.. prompt:: text +.. code-block:: dockerfile FROM debian:bullseye-slim RUN echo "-------Single-Stage--------------" @@ -123,20 +100,18 @@ Create the ``Dockerfile`` that implements the single stage container: ENTRYPOINT ["/app/start.sh"] -The ``Dockerfile`` is very simple. It installs ``build-essential``, -copies the files ``helloworld.c`` and ``start.sh`` to the container image, -compiles ``helloworld.c`` and sets the entrypoint to start the ``start.sh`` script. +The ``Dockerfile`` is straightforward.. +It installs ``build-essential``, copies the files ``helloworld.c`` and ``start.sh`` to the container image, +then compiles ``helloworld.c`` and sets the entrypoint to start the ``start.sh`` script. -Build the docker example and check the image size: +Build the Docker example and check the image size: .. prompt:: bash host:~$, auto host:~$ docker build --tag single:1.0 -f single/Dockerfile . host:~$ docker image ls -**Example Output**: - -.. prompt:: text +:: docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE @@ -148,9 +123,7 @@ Run the image and open a second terminal: host:~$ docker run -it --rm --name single single:1.0 -**Example Output**: - -.. prompt:: text +:: hello, world! hello, world! @@ -162,36 +135,28 @@ In the second terminal, inspect the image and note that the spare files are pres host:~$ docker exec -it single ls /app -**Example Output**: - -.. prompt:: text +:: helloworld helloworld.c start.sh -Note that the gcc software is present in the image: +Note that the GCC compiler is present in the image: .. prompt:: bash host:~$, auto host:~$ docker exec -it single sh -c 'type gcc' -**Example Output**: - -.. prompt:: text +:: gcc is /usr/bin/gcc Multi-Stage Container --------------------- -Create the ``Dockerfile`` that implements the multi-stage container: - -.. prompt:: bash host:~$, auto - - host:~$ gedit multi/Dockerfile +Create the ``Dockerfile`` to implement the multi-stage container: -**multi/Dockerfile**: +``multi/Dockerfile``: -.. prompt:: text +.. code-block:: dockerfile FROM debian:bullseye-slim AS builder RUN echo "-------Multi-Stage--------------" @@ -226,32 +191,28 @@ Create the ``Dockerfile`` that implements the multi-stage container: ENTRYPOINT ["/app/start.sh"] -In this case, the ``Dockerfile`` is divided into two stages: ``builder`` and ``final-stage``. -The first stage starts with ``AS builder`` after specifying the starting image (first line of the Dockerfile). Next, -it installs ``build-essential`` and compiles ``helloworld.c``. +This ``Dockerfile`` is divided into two stages: ``builder`` and ``final-stage``. +The first stage starts with ``AS builder`` after specifying the starting image (first line of the Dockerfile). +Next, it installs ``build-essential`` and compiles ``helloworld.c``. -The second stage starts with ``AS final-stage`` right after specifying the image used -for the second stage (line 18 of the Dockerfile). -Finally, it ``COPY`` the ``helloworld`` binary from the first stage using the parameter ``--from=builder``. +The second stage starts with ``AS final-stage`` after specifying the image to be used. (line 18 of the Dockerfile). +Finally, ``COPY`` get the ``helloworld`` binary from the first stage using the parameter ``--from=builder``. -Build the docker example and check the image size: +Build the Docker example and check the image size: .. prompt:: bash host:~$, auto host:~$ docker build --tag multi:1.0 -f multi/Dockerfile . host:~$ docker image ls -**Example Output**: - -.. prompt:: text +:: docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE single 1.0 ba94763b6fe4 25 seconds ago 351MB multi 1.0 bdeac19070ea 50 minutes ago 80.4MB -Note the difference between the `single` and `multi` images. A simple ``helloworld`` -with just the ``build-essential`` software shows how useful a multi-stage container could be. +Note the difference between the `single` and `multi` images. Run the image and open a second terminal: @@ -259,37 +220,31 @@ Run the image and open a second terminal: host:~$ docker run -it --rm --name multi multi:1.0 -**Example Output**: - -.. prompt:: text +:: hello, world! hello, world! hello, world! -In the second terminal, inspect the image and note that only the needed files are -present in the image (``helloworld.c`` is not installed in the final stage): +In the second terminal, inspect the image. +Note that only the needed files are present in the image (``helloworld.c`` is not installed in the final stage): .. prompt:: bash host:~$, auto host:~$ docker exec -it multi ls /app -**Example Output**: - -.. prompt:: text +:: helloworld start.sh -Note that the ``gcc`` software is not installed in the final stage: +Notice how ``gcc`` is not installed in the final stage: .. prompt:: bash host:~$, auto host:~$ docker exec -it multi sh -c 'type gcc' -**Example Output**: - -.. prompt:: text +:: gcc: not found -.. _Use multi-stage builds: https://docs.docker.com/build/building/multi-stage/ +.. _multi-stage builds: https://docs.docker.com/build/building/multi-stage/ diff --git a/source/user-guide/offline-update/offline-update.rst b/source/user-guide/offline-update/offline-update.rst index 9bde4185c..f701d799f 100644 --- a/source/user-guide/offline-update/offline-update.rst +++ b/source/user-guide/offline-update/offline-update.rst @@ -13,20 +13,20 @@ Prerequisites 1. Enable Offline Update support, i.e. add ``aklite-offline`` to ``PACKAGECONFIG`` of ``aktualizr``. For example: - .. prompt:: text + .. prompt:: bash cat meta-subscriber-overrides.git/recipes-sota/aktualizr/aktualizr_%.bbappend PACKAGECONFIG:append = " aklite-offline" 2. Enable :ref:`ug-container-preloading` if you would like to update ``Compose Apps`` along with rootfs (aka ostree). -3. Ensure that :ref:`TUF keys are taken offline `. If they are not, then do it. +3. Ensure that :ref:`TUF keys are taken offline `. 4. Build an LmP image and flash it onto a target device or update the device with the image via OTA. - Obtaining Offline Update Content -------------------------------- -Once the prerequisites are met, download the offline update content from the FoundriesFactory to some medium, e.g., a USB drive, which can be attached to a target device. + +First download the offline update content from your Factory to an install medium which can be attached to the target device. The offline update content consists of: 1. `TUF metadata`_; @@ -51,6 +51,7 @@ Use the command ``fioctl targets offline-update --tag Performing the Offline Update ----------------------------- + Before doing the offline update, make the offline update content accessible on a device, e.g., attach and mount the USB drive. Use the ``aklite-offline`` CLI utility to perform an offline update. @@ -152,19 +153,21 @@ Offline Update Considerations * **Offline Update is not a packaged delivery** -The content provided by ``fioctl targets offline-update`` command should be packaged by the customer and verified by the client service. + The content provided by ``fioctl targets offline-update`` command should be packaged by you, and verified by the client service. * **Offline Update does not provide a secure delivery** -Related to the bullet above, Foundries.io™ cannot provide secure delivery of offline update content since the customer should do the packaging and delivery. + Related to the bullet above, Foundries.io™ cannot provide secure delivery of offline update content since you should do the packaging and delivery. * **Offline Update allows installing Targets from different Tags** -A custom client application should handle this case if it is not the intended behavior. + A custom client application should handle this case if it is not the intended behavior. * **Online/Offline Mixed Updates** -Toggling between online and offline modes is not tested or validated by Foundries.io. It should be handled by a custom client application. Both cases can work together, but the offline update feature was initially designed to be offline only until the device was registered. + Toggling between online and offline modes is not tested or validated by Foundries.io. + It should be handled by a custom client application. + Both cases can work together, but the offline update feature is designed to be offline only, until the device is registered. There are a few points to take into account by the custom client application: diff --git a/source/user-guide/submodule/submodule.rst b/source/user-guide/submodule/submodule.rst index efbbd452e..2a1dc6527 100644 --- a/source/user-guide/submodule/submodule.rst +++ b/source/user-guide/submodule/submodule.rst @@ -1,37 +1,27 @@ .. _ug-submodule: -Working with Git Submodules +Working With Git Submodules =========================== -This section shows how to add a git submodule to your FoundriesFactory repository. +This section shows how to add a git submodule to your FoundriesFactory® repository. -This is very helpful when you want to use an external private or public git repository, -such as GitHub_, connected to the FoundriesFactory repository as a submodule. +This is for when you want an external git repository, such as GitHub, connected to a Factory repository as a submodule. -Submodules can be used to isolate two different application teams to work -on separated repositories. In this case, each team works in their own repository -and each repository is added as a submodule in the FoundriesFactory repository. +Submodules can be used to isolate two different application teams, allowing work to take place in separate repositories. +Each team works in their own repository and each repository is added as a submodule in the Factory repository. This section can be adapted for other git repository hosting services. -Create Github Repository ------------------------- - -Go to GitHub_ and click on the button :guilabel:`New` in the upper left corner. - -.. figure:: /_static/userguide/submodule/newrepo.png - :width: 300 - :align: center +Create a GithHub Repository +--------------------------- - GitHub New Repo +Go to GitHub_ and create a new repo. -You can choose to use a private or a public repository. +You can choose to use a private or a public repository, each involves separate steps: .. tabs:: .. group-tab:: Private - - Complete the :guilabel:`Repository name` with the name that works best for your repository. Select :guilabel:`Private` and :guilabel:`Create repository`. @@ -41,10 +31,9 @@ You can choose to use a private or a public repository. New Private GitHub repository - The FoundriesFactory CI needs GitHub_ personal access token to download - the submodule content during the build. + The FoundriesFactory CI needs GitHub personal access token to download the submodule content during the build. - Go to GitHub_ and in the upper right corner, click on your avatar and :guilabel:`Settings`. + Go to GitHub and in the upper right corner, click on your avatar and :guilabel:`Settings`. .. figure:: /_static/userguide/submodule/settings.png :width: 300 @@ -54,8 +43,7 @@ You can choose to use a private or a public repository. In the left menu, click on the :guilabel:`Developer settings`. - Next, click on the :guilabel:`Personal access tokens` and click on the - button :guilabel:`Generate new token`. + Next, click on the :guilabel:`Personal access tokens` and click on the button :guilabel:`Generate new token`. .. figure:: /_static/userguide/submodule/newtoken.png :width: 800 @@ -80,7 +68,7 @@ You can choose to use a private or a public repository. Personal Token Scope - Configure your FoundriesFactory with the personal access token. + Configure your Factory with the personal access token. Use ``fioctl`` to configure the ``githubtok`` variable. @@ -90,8 +78,6 @@ You can choose to use a private or a public repository. .. group-tab:: Public - Complete the :guilabel:`Repository name` with the name work best for your repository. - Select :guilabel:`Public` and :guilabel:`Create repository`. .. figure:: /_static/userguide/submodule/public.png @@ -100,18 +86,16 @@ You can choose to use a private or a public repository. New Public GitHub repository -Preparing GitHub Repository ---------------------------- +Preparing the GitHub Repository +-------------------------------- -The GitHub_ repository created will be used to specify a Docker Compose Application. +For this guide, the GitHub repo will be used to specify a Docker Compose Application. -The requirements to the FoundriesFactory CI to build a Docker Image and create a -Docker Compose App with this image is to have a folder with a ``Dockerfile`` and a ``docker-compose.yml`` +The requirements for the FoundriesFactory CI to build this is to have a folder with a ``Dockerfile`` and a ``docker-compose.yml`` -If you are not familiar with the ``containers.git`` file structure, read the -section :ref:`tutorial-compose-app-file-structure`. +If you are not familiar with the ``containers.git`` file structure, see the section on :ref:`tutorial-compose-app-file-structure`. -That being said, create a folder to initialize the GitHub_ repository. +Create a folder to initialize the repo. .. prompt:: bash host:~$, auto @@ -136,31 +120,25 @@ Move it from the ``shellhttpd`` folder to the repo root directory: host:~$ git mv shellhttpd/Dockerfile shellhttpd/docker-compose.yml shellhttpd/httpd.sh . host:~$ git rm -r shellhttpd/ -Now you have the files required for a Docker Compose Application: +You have the files required for a Docker Compose Application: .. prompt:: bash host:~$, auto host:~$ tree ../myapp/ -Example output: - -.. prompt:: text +.. code-block:: console ../myapp/ ├── docker-compose.yml ├── Dockerfile └── httpd.sh -Update the image url in the ``docker-compose.yml`` file with your repository name. +Update the image url in ``docker-compose.yml`` with your repo's name. This example uses ``myapp``: -.. prompt:: bash host:~$, auto +``docker-compose.yml``: - host:~$ vim docker-compose.yml - -**docker-compose.yml**: - -.. prompt:: text +.. code-block:: yaml version: '3.2' @@ -180,33 +158,29 @@ Add all new files, changes and commit and push: host:~$ git add docker-compose.yml Dockerfile httpd.sh host:~$ git commit -m "Adding App Structure" - host:~$ git branch -M devel - host:~$ git push --set-upstream origin devel + host:~$ git push -Adding Submodule ----------------- +Adding the Submodule +-------------------- Clone your ``containers.git`` repo and enter its directory: .. prompt:: bash host:~$ - git clone -b devel https://source.foundries.io/factories//containers.git + git clone https://source.foundries.io/factories//containers.git cd containers .. tip:: - If you followed the Tutorials, your ``containers.git`` might have the ``shellhttpd`` - app already. If that is the case, to avoid conflict with the submodule example remove - or move it to ``shellhttpd.disabled`` + If you followed the tutorials, your ``containers.git`` might have the ``shellhttpd`` app already. + If that is the case, to avoid conflict with the submodule example remove or move it to ``shellhttpd.disabled`` -Inside the ``containers`` adapt the command below to your GitHub_ repository: +Inside the ``containers`` directory, adapt the command below using your GitHub repo: .. prompt:: bash host:~$ git submodule add git@github.com:/.git -**Example**: - .. prompt:: bash host:~$, auto host:~$ git submodule add -b devel git@github.com:munoz0raul/myapp.git @@ -217,9 +191,9 @@ Inside the ``containers`` adapt the command below to your GitHub_ repository: Go to the `web app `_, select your Factory and click on :guilabel:`Targets`: -The latest **Target** named :guilabel:`containers-devel` should be the CI job you just created. +The latest Target should be the CI job you just created. -Click anywhere on the Target’s line in the list to see more details. +Click anywhere on the Target’s line to see more details. After the CI Job finishes, refresh the page and find your application in Apps: @@ -239,15 +213,12 @@ In your Factory, click on :guilabel:`Source` and select the ``container.git`` re Note the application submodule is available but it is not possible to inspect the application files. -Updating Submodule Manually ---------------------------- +Updating the Submodule Manually +------------------------------- -The submodule inside the ``containers.git`` is pinned to the latest GitHub_ repository commit. - -As new commits are added to the GitHub_ repository, the ``containers.git`` must -be updated with the latest submodule changes. - -It is possible to do it manually or using GitHub_ Actions. +The submodule inside ``containers.git`` is pinned to the latest GitHub repo commit. +As new commits are added, ``containers.git`` must be updated with the latest submodule changes. +It is possible to do it manually or using GitHub Actions. To update it manually, go to your ``containers`` folder, inside the submodule and run: @@ -259,19 +230,18 @@ To update it manually, go to your ``containers`` folder, inside the submodule an host:~$ git commit -m "Updating submodule hash" host:~$ git push -Updating Submodule Automatically --------------------------------- +Updating the Submodule Automatically +------------------------------------ -To automate the previous steps, you have to allow GitHub_ to access your -FoundriesFactory repository. For that, you need to create a token. +To automate the previous steps, you have to allow GitHub to access your Factory repo. +For that, you need to create a token. Go to `Tokens `_ and create a new **Api Token** by clicking on :guilabel:`+ New Token`. Complete with a **Description** and the **Expiration date** and select :guilabel:`next`. -For GitHub_, check the :guilabel:`Use for source code access` box and -select your **Factory**. +For GitHub, check the :guilabel:`Use for source code access` box and select your **Factory**. .. figure:: /_static/userguide/mirror-action/mirror-action.png :width: 500 @@ -279,7 +249,7 @@ select your **Factory**. Token for source code access -Copy the token, go to the Github_ repository and find the repository :guilabel:`Settings`. +Copy the token, go to the GitHub repo and find :guilabel:`Settings`. .. figure:: /_static/userguide/submodule/reposetting.png :width: 800 @@ -297,10 +267,8 @@ Name it with ``FOUNDRIES_API_TOKEN``, paste your ```` on Value and click Action Token -Create the file ``.github/workflows/source-fio-update.yml`` inside your GitHub_ -application repository. Follow the example below and make sure you update the -```` to your Factory Name and ```` with your -submodule folder name. +Create the ``.github/workflows/source-fio-update.yml`` inside your GitHub application repo. +Follow the example below and make sure you update ```` with your Factory, and ```` with your submodule folder. .. prompt:: bash host:~$, auto @@ -308,9 +276,7 @@ submodule folder name. host:~$ mkdir -p .github/workflows/ host:~$ gedit .github/workflows/source-fio-update.yml -**docker-compose.yml**: - -.. prompt:: text +.. code-block:: yaml # .github/workflows/source-fio-update.yml @@ -333,7 +299,7 @@ submodule folder name. submodule-path: "./" remote-branch: ${{ github.ref }} -Add and commit your GitHub_ Action: +Add and commit your GitHub Action: .. prompt:: bash host:~$, auto @@ -341,8 +307,7 @@ Add and commit your GitHub_ Action: host:~$ git commit -m "Adding Action" host:~$ git push -After this commit, the submodule should be automatically updated inside the -``containers.git`` repository. As a result, it will automatically trigger a new -FoundriesFactory CI Job to build your application. +After this commit, the submodule should be automatically updated inside the ``containers.git`` repo. +As a result, it will automatically trigger a new CI Job to build your application. -.. _GitHub: https://github.com/ +.. _GitHub: https://github.com/new diff --git a/source/user-guide/troubleshooting/troubleshooting.rst b/source/user-guide/troubleshooting/troubleshooting.rst index 2895b5b55..335b34552 100644 --- a/source/user-guide/troubleshooting/troubleshooting.rst +++ b/source/user-guide/troubleshooting/troubleshooting.rst @@ -173,14 +173,14 @@ It manifests as a failed boot attempt and error in the u-boot log: This suggests that the SPL key is missing from the factory. The key is defined in the OE recipe and it defaults to ``spldev``. -.. prompt:: +:: UBOOT_SPL_SIGN_KEYNAME="spldev" This can be confirmed by checking whether files ``spldev.key`` or ``spldev.crt`` are missing from the ``lmp-manifest/factory-keys`` directory. If so, the easiest fix is to generate the keys and add them to the repository. -.. prompt:: +.. code-block:: console cd factory-keys openssl genpkey -algorithm RSA -out spldev.key \ @@ -190,7 +190,7 @@ If so, the easiest fix is to generate the keys and add them to the repository. Once the ``spldev.key`` and ``spldev.crt`` are created, add them to the repository. -.. prompt:: +.. code-block:: console git add factory-keys/spldev.key git add factory-keys/spldev.crt @@ -341,7 +341,7 @@ First, configure the **aktualizr-lite** polling interval: cd meta-subscriber-overrides mkdir -p recipes-sota/sota-fragment/sota-fragment -5. Create the ``90-sota-fragment.toml`` file under this new directory: +5. Create ``90-sota-fragment.toml`` under this new directory: .. code-block:: @@ -354,7 +354,7 @@ First, configure the **aktualizr-lite** polling interval: 6. In the ``recipes-samples/images/lmp-factory-image.bb`` file, include this new package under ``CORE_IMAGE_BASE_INSTALL``. For example: - .. code-block:: + .. code-block:: diff --- a/recipes-samples/images/lmp-factory-image.bb +++ b/recipes-samples/images/lmp-factory-image.bb @@ -518,6 +518,9 @@ Targets list for that tag. There are some cases where this can happen: -* When using :ref:`Production Targets `: A user creates a wave for Target 42 and some devices are updated. The user then cancels the wave, removing Target 42 from the Targets list. A new wave is created for Target 43. Running ``fioctl wave status`` in this case shows that some devices are running Target 42, which is not present in the Targets list, so it shows as an orphan Target. +* When using :ref:`Production Targets `: A user creates a wave for Target 42 and some devices are updated. + The user then cancels the wave, removing Target 42 from the Targets list. + A new wave is created for Target 43. + Running ``fioctl wave status`` in this case shows that some devices are running Target 42, which is not present in the Targets list, so it shows as an orphan Target. * A device runs an old Target that has been pruned from the Targets list. * A device switches from one tag to another and it is still running a Target version which is not present in the new tag.