[Solution] Update to ONAP Montreal releases version

- update controller/odlux images
- change persistence from elasticsearch to mariaDB
- improved user handling for identity
- support indentity theme
Issue-ID: OAM-403
Change-Id: I28bec223a656af1dcfe61b47f5df43fba4545a52
Signed-off-by: demskeq8 <alexander.dehn@highstreet-technologies.com>
diff --git a/solution/create_users.py b/solution/create_users.py
new file mode 100644
index 0000000..5b0964c
--- /dev/null
+++ b/solution/create_users.py
@@ -0,0 +1,88 @@
+import csv
+import json
+from argparse import ArgumentParser
+
+from jinja2 import Template
+
+
+class UserCreator:
+    template_str = """
+    {
+      "users": [
+        {% for user in users %}
+        {
+          "firstName": "{{ user.firstName }}",
+          "lastName": "{{ user.lastName }}",
+          "email": "{{ user.email }}",
+          "enabled": "{{ user.enabled }}",
+          "username": "{{ user.username }}",
+          "credentials": [
+            {
+              "type": "password",
+              "value": "{{ user.password }}",
+              {% if force_pwd_change is false %}
+              "temporary": "{{ user.force_pwd_change }}"
+              {% else %}
+              "temporary": "true"
+              {% endif %}
+            }
+          ],
+          "requiredActions": [
+            "UPDATE_PASSWORD"
+          ]
+        }{% if not loop.last %},{% endif %}
+        {% endfor %}
+      ],
+      "grants": [
+        {% for user in users %}
+        {
+          "username": "{{ user.username }}",
+          "role": "{{ user.role }}"
+        }{% if not loop.last %},{% endif %}
+        {% endfor %}
+      ]
+    }
+    """
+
+    def __init__(self, csv_file: str):
+        self.csv_file_path: str = csv_file
+
+    def get_users_from_csv(self) -> list[dict]:
+        """
+        Get the users from the CSV file
+        @return: list of users
+        """
+        users: list[dict] = []
+        with open(self.csv_file_path, "r") as file:
+            dict_reader: csv.DictReader = csv.DictReader(file)
+            for row in dict_reader:
+                users.append(row)
+        return users
+
+    def create_users_json(self, users: list[dict], output_json_path: str, force_pwd_change: bool ) -> None:
+        """
+        Create the users JSON from the users list. Uses Jinja2 template to create the JSON.
+        @param users: list of users to create the JSON
+        @param output_json_path: path to the output JSON file
+        @return: JSON string
+        """
+        if force_pwd_change is True:
+            print("Enforce password change for all users!")
+        template = Template(self.template_str)
+        users_json: str = template.render(users=users, force_pwd_change=force_pwd_change)
+        with open(output_json_path, 'w') as f:
+            json.dump(json.loads(users_json), f, indent=4)
+        print(f"Users JSON file created at {output_json_path}")
+
+
+if __name__ == '__main__':
+    parser = ArgumentParser(description="Create users JSON file from CSV file")
+    parser.add_argument("csv_file_path", type=str, help="Path to the CSV file containing the users data")
+    parser.add_argument("--output", "-o", type=str, required=False, default="authentication.json",
+                        help="Path to the output JSON file e.g. authentication.json")
+    parser.add_argument("--force-pwd-change","-f", action='store_true', help="Enforce password change for all users, overwrites value in user data" )
+
+    args = parser.parse_args()
+    user_creator = UserCreator(args.csv_file_path)
+    user_list = user_creator.get_users_from_csv()
+    user_creator.create_users_json(user_list, args.output, args.force_pwd_change)