Hello World Tutorial

Here we will show you step-by-step how to deploy Hello World! application to a fleet of edge devices.

Video Tutorial

Pre-requisites

  1. Have Orchestra subscription (more).

  2. Add all your edge devices to Orchestra Manager (more) or make sure the Orchestra Daemon (orchestrad) installed is version 1.4.13 or above (Updating Orchestra Daemon).

  3. Install Docker Engine on your edge devices (Install Docker Engine).

  4. Make sure your Docker Compose file docker-compose.yaml is ready and correct before proceeding. Copy the docker file from here and save in your working directory.

services:
  static-response-server:
    environment:
      HTTP_BODY: "Welcome into Carrots Server!\n"
      HTTP_CODE: 200
    image: colinodell/static-response-server
    ports:
    - 8080:8080

Steps

Step 1: List All Fleets

Begin by listing all the fleets in your system. This helps you identify existing fleets before proceeding to create a new one (more: List).

In this example we have no fleets.

$ ocli calm fleet list
$ ocli calm fleet list
No objects found

Step 2: Create a New Fleet

Now, create a fleet where you will deploy your compositions. Include all of the devices you want to deploy wirepas application on (more: Create).

$ ocli calm fleet create --name "name" --description "desc"
$ ocli calm fleet create --name "Carrots fleet" --description "Fleet of carrots doing carrots' things."
╒════════════════╤════════════════╤═════════╤═════════════╤═════════╤══════════════╤══════════════════════════╤═════════╤═════════════════╕
│ created_at     │ updated_at     │ name    │ description │ devices │ compositions │ id                       │ status  │ deployment_info │
├────────────────┼────────────────┼─────────┼─────────────┼─────────┼──────────────┼──────────────────────────┼─────────┼─────────────────┤
│ 2024-10-03     │ 2024-10-03     │ Carrots │ Fleet of    │ []      │ []           │ 66feac2c9ee4869dbe1ac116 │ UNKNOWN │                 │
│ 14:37:32+00:00 │ 14:37:32+00:00 │ fleet   │ carrots     │         │              │                          │         │                 │
│                │                │         │ doing       │         │              │                          │         │                 │
│                │                │         │ carrots'    │         │              │                          │         │                 │
│                │                │         │ things.     │         │              │                          │         │                 │
╘════════════════╧════════════════╧═════════╧═════════════╧═════════╧══════════════╧══════════════════════════╧═════════╧═════════════════╛

Step 3: Create a Composition

Next, create a composition. It defines your app and will store the versioning of this app (more: Create).

$ ocli calm composition create -n "name"
$ ocli calm composition create -n "Hello World for carrots app"
╒════════════════╤════════════════╤═════════╤══════════════════════════╤════════════════╕
│ created_at     │ updated_at     │ name    │ id                       │ latest_version │
├────────────────┼────────────────┼─────────┼──────────────────────────┼────────────────┤
│ 2024-10-03     │ 2024-10-03     │ Hello   │ 66feac83ac3bfd8b5dc6ea7b │                │
│ 14:38:59+00:00 │ 14:38:59+00:00 │ World   │                          │                │
│                │                │ for     │                          │                │
│                │                │ carrots │                          │                │
│                │                │ app     │                          │                │
╘════════════════╧════════════════╧═════════╧══════════════════════════╧════════════════╛

Step 4: Attach Composition to the Fleet

Now, attach the composition you just created to your fleet. This step ensures that the fleet is ready to deploy the specified services (more: Attach).

$ ocli calm fleet attach composition -r <composition_id> <fleet_id>
$ ocli calm fleet attach composition -r 66feac83ac3bfd8b5dc6ea7b 66feac2c9ee4869dbe1ac116
╒════════════════╤════════════════╤═════════╤═════════════╤═════════╤════════════════════════════╤══════════════════════════╤═════════╤═════════════════╕
│ created_at     │ updated_at     │ name    │ description │ devices │ compositions               │ id                       │ status  │ deployment_info │
├────────────────┼────────────────┼─────────┼─────────────┼─────────┼────────────────────────────┼──────────────────────────┼─────────┼─────────────────┤
│ 2024-10-03     │ 2024-10-03     │ Carrots │ Fleet of    │ []      │ ['66feacd5683b09301a966fdd │ 66feac2c9ee4869dbe1ac116 │ UNKNOWN │ {'devices':     │
│ 14:37:32+00:00 │ 14:37:32+00:00 │ fleet   │ carrots     │         │ - Hello World for carrots  │                          │         │ [{'status':     │
│                │                │         │ doing       │         │ app']                      │                          │         │ 'TOTAL',        │
│                │                │         │ carrots'    │         │                            │                          │         │ 'count': 0}],   │
│                │                │         │ things.     │         │                            │                          │         │ 'compositions': │
│                │                │         │             │         │                            │                          │         │ [{'status':     │
│                │                │         │             │         │                            │                          │         │ 'UNKNOWN',      │
│                │                │         │             │         │                            │                          │         │ 'count': 1}]}   │
╘════════════════╧════════════════╧═════════╧═════════════╧═════════╧════════════════════════════╧══════════════════════════╧═════════╧═════════════════╛

Step 5: Attach Devices to Your Fleet

Add the required devices to your fleet. These devices will run the services defined in your composition (more: Attach).

Note

Use the arrow keys to navigate the list of devices, press Space to select devices, and hit Enter to confirm your selections.

$ ocli calm fleet attach device <fleet_id>
$ ocli calm fleet attach device 66feac2c9ee4869dbe1ac116
[?] Pick devices you want to attach to fleet 66feac2c9ee4869dbe1ac116 - Carrots fleet:
  [ ] 66d97c0b7814b7be62c5e66d - adam_raspberrypi
  [ ] 66d99f328396f822d7393967 - great_kepler__154__corrupted
  [ ] 66e13e6c2bc2262a5d5876e2 - test_adam_arm3
  [ ] 66e13e994366760572c806f7 - test_adam_adm3
  [X] 66e96c91b053f8dea450c2c0 - Harry-Test-GW #1
> [X] 66e96d25d72d0d4c0ff1962b - Harry-Test-GW #2
  [ ] 66ea8308ad532faa0af547cd - SIDO Lyon GW

╒════════════════╤════════════════╤═════════╤═════════════╤════════════════════════════╤════════════════════════════╤══════════════════════════╤═════════╤═════════════════╕
│ created_at     │ updated_at     │ name    │ description │ devices                    │ compositions               │ id                       │ status  │ deployment_info │
├────────────────┼────────────────┼─────────┼─────────────┼────────────────────────────┼────────────────────────────┼──────────────────────────┼─────────┼─────────────────┤
│ 2024-10-03     │ 2024-10-03     │ Carrots │ Fleet of    │ ['66e96c91b053f8dea450c2c0 │ ['66feacd5683b09301a966fdd │ 66feac2c9ee4869dbe1ac116 │ UNKNOWN │ {'devices':     │
│ 14:37:32+00:00 │ 14:37:32+00:00 │ fleet   │ carrots     │ - Harry-Test-GW #1',       │ - Hello World for carrots  │                          │         │ [{'status':     │
│                │                │         │ doing       │ '66e96d25d72d0d4c0ff1962b  │ app:1.0.0']                │                          │         │ 'UNKNOWN',      │
│                │                │         │ carrots'    │ - Harry-Test-GW #2']       │                            │                          │         │ 'count': 2},    │
│                │                │         │ things.     │                            │                            │                          │         │ {'status':      │
│                │                │         │             │                            │                            │                          │         │ 'TOTAL',        │
│                │                │         │             │                            │                            │                          │         │ 'count': 2}],   │
│                │                │         │             │                            │                            │                          │         │ 'compositions': │
│                │                │         │             │                            │                            │                          │         │ [{'status':     │
│                │                │         │             │                            │                            │                          │         │ 'UNKNOWN',      │
│                │                │         │             │                            │                            │                          │         │ 'count': 1}]}   │
╘════════════════╧════════════════╧═════════╧═════════════╧════════════════════════════╧════════════════════════════╧══════════════════════════╧═════════╧═════════════════╛

Step 6: Create a Composition Version

After creating the composition, create a composition version for it. This version will be linked to specific configurations in your compose file. (more: Create).

Note

Make sure your Docker Compose file docker-compose.yaml is ready and correct before proceeding.

$ ocli calm composition-version create -f <path to docker compose .yaml file> -v <version e.g. 1.0.0> -d "description" <composition_id>
$ ocli calm composition-version create -f docker_compose.yaml -v 1.0.0 -d "This is an initial version of Hello World for carrots app" 66feac83ac3bfd8b5dc6ea7b
╒════════════════╤════════════════╤══════════════════════════╤═════════╤═════════════╤══════════════╤══════════════════════════╤══════════════════╕
│ created_at     │ updated_at     │ composition_id           │ version │ description │ compose_file │ id                       │ composition_name │
├────────────────┼────────────────┼──────────────────────────┼─────────┼─────────────┼──────────────┼──────────────────────────┼──────────────────┤
│ 2024-10-03     │ 2024-10-03     │ 66feac83ac3bfd8b5dc6ea7b │ 1.0.0   │ This is an  │ OK           │ 66feacd5683b09301a966fdd │ Hello World for  │
│ 14:40:21+00:00 │ 14:40:21+00:00 │                          │         │ initial     │              │                          │ carrots app      │
│                │                │                          │         │ version of  │              │                          │                  │
│                │                │                          │         │ Hello World │              │                          │                  │
│                │                │                          │         │ for carrots │              │                          │                  │
│                │                │                          │         │ app         │              │                          │                  │
╘════════════════╧════════════════╧══════════════════════════╧═════════╧═════════════╧══════════════╧══════════════════════════╧══════════════════╛

Step 7: Release Your Composition

Finally, release the desired composition version to your fleet. This will deploy the services across the devices in the fleet (more: Release).

$ ocli calm release create -v <composition_version_id> -f <fleet_id>
$ ocli calm release create -v 66feacd5683b09301a966fdd -f 66feac2c9ee4869dbe1ac116
Release successfully requested.
Check your fleet in a few minutes.

Step 8: Check The Release

After few minutes let’s check if the release succeeded. Use the fleet get command (more: Get).

If the status is RECONFIGURING wait a few minutes more.

$ ocli calm fleet get <fleet_id>
$ ocli calm fleet get 66feac2c9ee4869dbe1ac116
╒════════════════╤════════════════╤═════════╤═════════════╤════════════════════════════╤════════════════════════════╤═══════════════════╤═══════════════╤══════════════════╕
│ created_at     │ updated_at     │ name    │ description │ devices                    │ compositions               │ id                │ status        │ deployment_info  │
├────────────────┼────────────────┼─────────┼─────────────┼────────────────────────────┼────────────────────────────┼───────────────────┼───────────────┼──────────────────┤
│ 2024-10-03     │ 2024-10-03     │ Carrots │ Fleet of    │ ['66e96c91b053f8dea450c2c0 │ ['66feacd5683b09301a966fdd │ 66feac2c9ee4869db │ OK            │ {'devices':      │
│ 14:37:32+00:00 │ 14:37:32+00:00 │ fleet   │ carrots     │ - Harry-Test-GW #1',       │ - Hello World for carrots  │ e1ac116           │               │ [{'status':      │
│                │                │         │ doing       │ '66e96d25d72d0d4c0ff1962b  │ app:1.0.0']                │                   │               │ 'OK',            │
│                │                │         │ carrots'    │ - Harry-Test-GW #2']       │                            │                   │               │ 'count': 2},     │
│                │                │         │ things.     │                            │                            │                   │               │ {'status':       │
│                │                │         │             │                            │                            │                   │               │ 'TOTAL',         │
│                │                │         │             │                            │                            │                   │               │ 'count': 2}],    │
│                │                │         │             │                            │                            │                   │               │ 'compositions':  │
│                │                │         │             │                            │                            │                   │               │ [{'status':      │
│                │                │         │             │                            │                            │                   │               │ 'OK',            │
│                │                │         │             │                            │                            │                   │               │ 'count': 1}]}    │
╘════════════════╧════════════════╧═════════╧═════════════╧════════════════════════════╧════════════════════════════╧═══════════════════╧═══════════════╧══════════════════╛

Check it

After deploying user can check if is working by running:

If is called inside your device:

$ curl http://localhost:8080
"Welcome into Carrots Server!"

And if device is exposed we can externally knowing its IP:

$ curl http://XXX.XXX.XXX.XXX:8080
"Welcome into Carrots Server!"

Success!

Use Variables

Now when you already seen how easy you can deploy your service, we can show you how to use variables:

First add variable:

$ ocli calm variable create -k HTTP_BODY -v "Awesome response" -d "Response" global

Then restart composition:

$ ocli calm release restart -f <fleet_id>

That’s it!

Note

If you are facing any problems or have suggestions please contact us through our Customer Portal.