Add charmcraft.yaml debug_mode to charmed-osm

- Added a debug_mode option to lcm, mon, nbi, pol, and ro charms
- Added a script to prepare pods for debugging:
  - setup .ssh/config to easily ssh from vscode to the pods
- Added a README that explains how to prepare the environment for
testing

Change-Id: Ieb56b565c15e61c68ad000b60897abd27e1eeb0e
Signed-off-by: David Garcia <david.garcia@canonical.com>
diff --git a/installers/charm/mon/charmcraft.yaml b/installers/charm/mon/charmcraft.yaml
new file mode 100644
index 0000000..0a285a9
--- /dev/null
+++ b/installers/charm/mon/charmcraft.yaml
@@ -0,0 +1,37 @@
+# Copyright 2021 Canonical Ltd.
+#
+# 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: legal@canonical.com
+#
+# To get in touch with the maintainers, please contact:
+# osm-charmers@lists.launchpad.net
+##
+
+type: charm
+bases:
+  - build-on:
+      - name: ubuntu
+        channel: "20.04"
+        architectures: ["amd64"]
+    run-on:
+      - name: ubuntu
+        channel: "20.04"
+        architectures:
+          - amd64
+          - aarch64
+          - arm64
+parts:
+  charm:
+    build-packages: [git]
diff --git a/installers/charm/mon/config.yaml b/installers/charm/mon/config.yaml
index ee593ff..b8477b1 100644
--- a/installers/charm/mon/config.yaml
+++ b/installers/charm/mon/config.yaml
@@ -93,3 +93,13 @@
       ImagePullPolicy configuration for the pod.
       Possible values: always, ifnotpresent, never
     default: always
+  debug_mode:
+    description: |
+      If true, debug mode is activated. It means that the service will not run,
+      and instead, the command for the container will be a `sleep infinity`.
+    type: boolean
+    default: false
+  debug_pubkey:
+    description: |
+      Public SSH key that will be injected to the application pod.
+    type: string
diff --git a/installers/charm/mon/src/charm.py b/installers/charm/mon/src/charm.py
index 1b7c74b..f253c09 100755
--- a/installers/charm/mon/src/charm.py
+++ b/installers/charm/mon/src/charm.py
@@ -119,7 +119,13 @@
 
 class MonCharm(CharmedOsmBase):
     def __init__(self, *args) -> NoReturn:
-        super().__init__(*args, oci_image="image")
+        super().__init__(
+            *args,
+            oci_image="image",
+            debug_mode_config_key="debug_mode",
+            debug_pubkey_config_key="debug_pubkey",
+            vscode_workspace=VSCODE_WORKSPACE,
+        )
 
         self.kafka_client = KafkaClient(self, "kafka")
         self.framework.observe(self.on["kafka"].relation_changed, self.configure_pod)
@@ -239,5 +245,46 @@
         return pod_spec_builder.build()
 
 
+VSCODE_WORKSPACE = {
+    "folders": [
+        {"path": "/usr/lib/python3/dist-packages/osm_mon"},
+        {"path": "/usr/lib/python3/dist-packages/osm_common"},
+        {"path": "/usr/lib/python3/dist-packages/n2vc"},
+    ],
+    "settings": {},
+    "launch": {
+        "version": "0.2.0",
+        "configurations": [
+            {
+                "name": "MON Server",
+                "type": "python",
+                "request": "launch",
+                "module": "osm_mon.cmd.mon_server",
+                "justMyCode": False,
+            },
+            {
+                "name": "MON evaluator",
+                "type": "python",
+                "request": "launch",
+                "module": "osm_mon.cmd.mon_evaluator",
+                "justMyCode": False,
+            },
+            {
+                "name": "MON collector",
+                "type": "python",
+                "request": "launch",
+                "module": "osm_mon.cmd.mon_collector",
+                "justMyCode": False,
+            },
+            {
+                "name": "MON dashboarder",
+                "type": "python",
+                "request": "launch",
+                "module": "osm_mon.cmd.mon_dashboarder",
+                "justMyCode": False,
+            },
+        ],
+    },
+}
 if __name__ == "__main__":
     main(MonCharm)
diff --git a/installers/charm/mon/tox.ini b/installers/charm/mon/tox.ini
index f207ac3..c341c8e 100644
--- a/installers/charm/mon/tox.ini
+++ b/installers/charm/mon/tox.ini
@@ -95,13 +95,15 @@
 #######################################################################################
 [testenv:build]
 passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
-deps = charmcraft
 whitelist_externals =
   charmcraft
-  cp
+  sh
 commands =
   charmcraft build
-  cp -r build release
+  sh -c 'ubuntu_version=20.04; \
+        architectures="amd64-aarch64-arm64"; \
+        charm_name=`cat metadata.yaml | grep -E "^name: " | cut -f 2 -d " "`; \
+        mv $charm_name"_ubuntu-"$ubuntu_version-$architectures.charm $charm_name.charm'
 
 #######################################################################################
 [flake8]