aboutsummaryrefslogtreecommitdiffstats
path: root/test/mocks/netconf-pnp-simulator/engine/configure-modules.sh
blob: 4e1d17c256791ccd11be2dc3c40b6ff7c23006e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/ash
# shellcheck disable=SC2086

# ============LICENSE_START=======================================================
#  Copyright (C) 2020 Nordix Foundation.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
# ============LICENSE_END=========================================================

set -eu

HERE=${0%/*}
source $HERE/common.sh

MODELS_CONFIG=$CONFIG/modules
BASE_VIRTUALENVS=$HOME/.local/share/virtualenvs
GENERIC_SUBSCRIBER=/opt/bin/generic_subscriber.py

install_and_configure_yang_model()
{
    local dir=$1
    local model=$2

    log INFO Importing Yang model \"$model\"
    yang=$(find_file $dir $model.yang model.yang)
    sysrepoctl --install --yang=$yang
    data=$(find_file $dir startup.json startup.xml data.json data.xml)
    if [ -n "$data" ]; then
      log INFO Initialing Yang model \"$model\"
      sysrepocfg --datastore=startup --import=$data $model
    fi
}

configure_subscriber_execution()
{
  local dir=$1
  local model=$2
  local app=$3

  APP_PATH=$PATH
  if [ -r "$dir/requirements.txt" ]; then
    env_dir=$(create_python_venv $dir $model)
    APP_PATH=$env_dir/bin:$APP_PATH
  fi
  log INFO Preparing launching of module \"$model\" application
  # shellcheck disable=SC2153
  loguru_format="${LOGURU_FORMAT//\{module\}/$model}"
  cat > /etc/supervisord.d/$model.conf <<EOF
[program:subs-$model]
command=$app $model
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
autorestart=true
environment=PATH=$APP_PATH,PYTHONUNBUFFERED="1",LOGURU_FORMAT="$loguru_format"
EOF
}

create_python_venv()
{
  local dir=$1
  local model=$2

  log INFO Creating virtual environment for module $model
  mkdir -p $BASE_VIRTUALENVS
  env_dir=$BASE_VIRTUALENVS/$model
  (
    virtualenv --system-site-packages $env_dir
    cd $env_dir
    # shellcheck disable=SC1091
    . ./bin/activate
    pip install --no-cache-dir --requirement "$dir"/requirements.txt
  ) 1>&2
  echo $env_dir
}

for dir in "$MODELS_CONFIG"/*; do
  if [ -d $dir ]; then
    model=${dir##*/}
    install_and_configure_yang_model $dir $model
    app="$dir/subscriber.py"
    if [ -x "$app" ]; then
      log INFO Module $model is using its own subscriber
    else
      log WARN Module $model is using the generic subscriber
      app=$GENERIC_SUBSCRIBER
    fi
    configure_subscriber_execution $dir $model $app
  fi
done