RIC-769: Committing individual files rather than tar archive
[ric-plt/appmgr.git] / xapp_orchestrater / dev / xapp_onboarder / xapp_onboarder / api / onboard.py
1 ################################################################################
2 #   Copyright (c) 2020 AT&T Intellectual Property.                             #
3 #                                                                              #
4 #   Licensed under the Apache License, Version 2.0 (the "License");            #
5 #   you may not use this file except in compliance with the License.           #
6 #   You may obtain a copy of the License at                                    #
7 #                                                                              #
8 #       http://www.apache.org/licenses/LICENSE-2.0                             #
9 #                                                                              #
10 #   Unless required by applicable law or agreed to in writing, software        #
11 #   distributed under the License is distributed on an "AS IS" BASIS,          #
12 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
13 #   See the License for the specific language governing permissions and        #
14 #   limitations under the License.                                             #
15 ################################################################################
16
17 import logging
18 import json
19 import copy
20 from jsonschema import ValidationError, SchemaError
21 from jsonschema import validate, Draft7Validator
22 from xapp_onboarder.helm_controller.xApp_builder import xApp, xAppError
23 from xapp_onboarder.server import settings
24 from xapp_onboarder.repo_manager.repo_manager import requests_retry_session, repo_manager
25 from xapp_onboarder.api.models.response_models import error_message_model, response, status_message_model
26 from xapp_onboarder.helm_controller.xapp_schema import schema as xapp_schema
27
28 log = logging.getLogger(__name__)
29
30
31 def onboard(config_file, controls_schema_file):
32     if not repo_manager.is_repo_ready():
33         response_message = response(model=error_message_model, status_code=500,
34                                     error_source="xapp_onboarder",
35                                     error_message="Cannot connect to local helm repo.",
36                                     status="Service not ready.")
37         return response_message.get_return()
38
39     schema_file = copy.deepcopy(xapp_schema)
40
41     if controls_schema_file:
42         schema_file["properties"]["controls"] = controls_schema_file
43
44     try:
45         Draft7Validator.check_schema(schema_file)
46         validate(config_file, schema_file)
47     except ValidationError as err:
48         log.debug(err.message)
49         response_message = response(model=error_message_model, status_code=400,
50                                     error_source="config-file.json",
51                                     error_message=err.message,
52                                     status="Input payload validation failed")
53         return response_message.get_return()
54     except SchemaError as err:
55         log.debug(err.message)
56         response_message = response(model=error_message_model, status_code=400,
57                                     error_source="schema.json",
58                                     error_message=err.message,
59                                     status="Input payload validation failed")
60         return response_message.get_return()
61
62     try:
63         xapp = xApp(config_file, schema_file)
64         xapp.package_chart()
65         xapp.distribute_chart()
66     except xAppError as err:
67         log.error(str(err))
68         response_message = response(model=error_message_model, status_code=err.status_code,
69                                     error_source="xApp_builder",
70                                     error_message=str(err),
71                                     status="xApp onboarding failed")
72         return response_message.get_return()
73     return response(model=status_message_model, status_code=201, status="Created").get_return()
74
75
76 def download_config_and_schema_and_onboard(config_file_url, controls_schema_url):
77     if not repo_manager.is_repo_ready():
78         response_message = response(model=error_message_model, status_code=500,
79                                     error_source="xapp_onboarder",
80                                     error_message="Cannot connect to local helm repo.",
81                                     status="Service not ready.")
82         return response_message.get_return()
83
84     session = requests_retry_session()
85     try:
86         response_content = session.get(config_file_url, timeout=settings.HTTP_TIME_OUT)
87     except Exception as err:
88         log.error(err.message)
89         response_message = response(model=error_message_model, status_code=500,
90                                     error_source="config-file.json",
91                                     error_message=err.message,
92                                     status="Downloading config-file.json failed")
93         return response_message.get_return()
94     else:
95         if response_content.status_code != 200:
96             error_message = "Wrong response code: {}, {}".format(response_content.status_code, response_content.content.decode("utf-8"))
97             log.error(error_message)
98             response_message = response(model=error_message_model, status_code=500,
99                                         error_source="config-file.json",
100                                         error_message=error_message,
101                                         status="Downloading config-file.json failed")
102             return response_message.get_return()
103         config_file = json.loads(response_content.content)
104
105     controls_schema_file = None
106     if controls_schema_url:
107         try:
108             response_content = session.get(controls_schema_url, timeout=settings.HTTP_TIME_OUT)
109         except Exception as err:
110             log.error(err.message)
111             response_message = response(model=error_message_model, status_code=500,
112                                         error_source="schema.json",
113                                         error_message=err.message,
114                                         status="Downloading schema.json failed")
115             return response_message.get_return()
116         else:
117             if response_content.status_code != 200:
118                 error_message = "Wrong response code. {}, {}".format(response_content.status_code, response_content.content.decode("utf-8"))
119                 log.error(error_message)
120                 response_message = response(model=error_message_model, status_code=500,
121                                             error_source="schema.json",
122                                             error_message=error_message,
123                                             status="Downloading schema.json failed")
124                 return response_message.get_return()
125             controls_schema_file = json.loads(response_content.content)
126
127
128     return onboard(config_file, controls_schema_file)