Feature 7184 New Generation RO
[osm/RO.git] / NG-RO / osm_ng_ro / html_out.py
1 # Licensed under the Apache License, Version 2.0 (the "License");
2 # you may not use this file except in compliance with the License.
3 # You may obtain a copy of the License at
4 #
5 # http://www.apache.org/licenses/LICENSE-2.0
6 #
7 # Unless required by applicable law or agreed to in writing, software
8 # distributed under the License is distributed on an "AS IS" BASIS,
9 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
10 # implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 """
15 Contains html text in variables to make and html response
16 """
17
18 import yaml
19 from http import HTTPStatus
20 from html import escape as html_escape
21
22 __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
23
24 html_start = """
25 <!DOCTYPE html>
26 <html>
27 <head>
28 <link href="/ro/static/style.css" rel="stylesheet">
29 <title>Welcome to OSM</title>
30 </head>
31 <body>
32 <div id="osm_topmenu">
33 <div>
34 <a href="https://osm.etsi.org"> <img src="/ro/static/OSM-logo.png" height="42" width="100"
35 style="vertical-align:middle"> </a>
36 <a>( {} )</a>
37 <a href="/ro/ns/v1/deploy">NSs </a>
38 <a href="/ro/admin/v1/k8srepos">K8s_repos </a>
39 <a href="/ro/admin/v1/tokens?METHOD=DELETE">logout </a>
40 </div>
41 </div>
42 """
43
44 html_body = """
45 <h1>{item}</h1>
46 """
47
48 html_end = """
49 </body>
50 </html>
51 """
52
53 html_body_error = "<h2> Error <pre>{}</pre> </h2>"
54
55
56 html_auth2 = """
57 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
58 <html>
59 <head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
60 <link href="/ro/static/style.css" rel="stylesheet">
61 <title>OSM Login</title>
62 </head>
63 <body>
64 <div id="osm_header">
65 <div>
66 <a href="https://osm.etsi.org"> <h1><img src="/ro/static/OSM-logo.png" style="vertical-align:middle"></h1> </a>
67 </div>
68 </div>
69 <div id="osm_error_message">
70 <h1>{error}</h1>
71 </div>
72 <div class="gerritBody" id="osm_body">
73 <h1>Sign in to OSM</h1>
74 <form action="/ro/admin/v1/tokens" id="login_form" method="POST">
75 <table style="border: 0;">
76 <tr><th>Username</th><td><input id="f_user" name="username" size="25" tabindex="1" type="text"></td></tr>
77 <tr><th>Password</th><td><input id="f_pass" name="password" size="25" tabindex="2" type="password"></td></tr>
78 <tr><td><input tabindex="3" type="submit" value="Sign In"></td></tr>
79 </table>
80 </form>
81 <div style="clear: both; margin-top: 15px; padding-top: 2px; margin-bottom: 15px;">
82 <div id="osm_footer">
83 <div></div>
84 </div>
85 </div>
86 </div>
87 <script src="/ro/static/login.js"> </script>
88 </body>
89 </html>
90 """
91
92
93 html_nslcmop_body = """
94 <a href="/ro/nslcm/v1/ns_lcm_op_occs?nsInstanceId={id}">nslcm operations </a>
95 <a href="/ro/nslcm/v1/vnf_instances?nsr-id-ref={id}">VNFRS </a>
96 <form action="/ro/nslcm/v1/ns_instances/{id}/terminate" method="post" enctype="multipart/form-data">
97 <h3> <table style="border: 0;"> <tr>
98 <td> <input type="submit" value="Terminate"/> </td>
99 </tr> </table> </h3>
100 </form>
101 """
102
103 html_nsilcmop_body = """
104 <a href="/ro/nsilcm/v1/nsi_lcm_op_occs?netsliceInstanceId={id}">nsilcm operations </a>
105 <form action="/ro/nsilcm/v1/netslice_instances/{id}/terminate" method="post" enctype="multipart/form-data">
106 <h3> <table style="border: 0;"> <tr>
107 <td> <input type="submit" value="Terminate"/> </td>
108 </tr> </table> </h3>
109 </form>
110 """
111
112
113 def format(data, request, response, toke_info):
114 """
115 Format a nice html response, depending on the data
116 :param data:
117 :param request: cherrypy request
118 :param response: cherrypy response
119 :return: string with teh html response
120 """
121 response.headers["Content-Type"] = 'text/html'
122 if response.status == HTTPStatus.UNAUTHORIZED.value:
123 if response.headers.get("WWW-Authenticate") and request.config.get("auth.allow_basic_authentication"):
124 response.headers["WWW-Authenticate"] = "Basic" + response.headers["WWW-Authenticate"][6:]
125 return
126 else:
127 return html_auth2.format(error=data)
128 if request.path_info in ("/version", "/system"):
129 return "<pre>" + yaml.safe_dump(data, explicit_start=False, indent=4, default_flow_style=False) + "</pre>"
130 body = html_body.format(item=request.path_info)
131 if response.status and response.status > 202:
132 body += html_body_error.format(yaml.safe_dump(data, explicit_start=True, indent=4, default_flow_style=False))
133 elif isinstance(data, (list, tuple)):
134 # if request.path_info == "/ns/v1/deploy":
135 # body += html_upload_body.format(request.path_info + "_content", "VNFD")
136 # elif request.path_info == "/nsd/v1/ns_descriptors":
137 # body += html_upload_body.format(request.path_info + "_content", "NSD")
138 # elif request.path_info == "/nst/v1/nst_templates":
139 # body += html_upload_body.format(request.path_info + "_content", "NSTD")
140 for k in data:
141 if isinstance(k, dict):
142 data_id = k.pop("_id", None)
143 elif isinstance(k, str):
144 data_id = k
145 if request.path_info == "/ns/v1/deploy":
146 body += '<p> <a href="/ro/{url}/{id}?METHOD=DELETE"> <img src="/ro/static/delete.png" height="25"' \
147 ' width="25"> </a><a href="/ro/{url}/{id}">{id}</a>: {t} </p>' \
148 .format(url=request.path_info, id=data_id, t=html_escape(str(k)))
149 else:
150 body += '<p> <a href="/ro/{url}/{id}">{id}</a>: {t} </p>'.format(url=request.path_info, id=data_id,
151 t=html_escape(str(k)))
152 elif isinstance(data, dict):
153 if "Location" in response.headers:
154 body += '<a href="{}"> show </a>'.format(response.headers["Location"])
155 else:
156 body += '<a href="/ro/{}?METHOD=DELETE"> <img src="/ro/static/delete.png" height="25" width="25"> </a>'\
157 .format(request.path_info[:request.path_info.rfind("/")])
158 if request.path_info.startswith("/nslcm/v1/ns_instances_content/") or \
159 request.path_info.startswith("/nslcm/v1/ns_instances/"):
160 _id = request.path_info[request.path_info.rfind("/")+1:]
161 body += html_nslcmop_body.format(id=_id)
162 elif request.path_info.startswith("/nsilcm/v1/netslice_instances_content/") or \
163 request.path_info.startswith("/nsilcm/v1/netslice_instances/"):
164 _id = request.path_info[request.path_info.rfind("/")+1:]
165 body += html_nsilcmop_body.format(id=_id)
166 body += "<pre>" + html_escape(yaml.safe_dump(data, explicit_start=True, indent=4, default_flow_style=False)) + \
167 "</pre>"
168 elif data is None:
169 if request.method == "DELETE" or "METHOD=DELETE" in request.query_string:
170 body += "<pre> deleted </pre>"
171 else:
172 body = html_escape(str(data))
173 user_text = " "
174 if toke_info:
175 if toke_info.get("username"):
176 user_text += "user: {}".format(toke_info.get("username"))
177 if toke_info.get("project_id"):
178 user_text += ", project: {}".format(toke_info.get("project_name"))
179 return html_start.format(user_text) + body + html_end
180 # yaml.safe_dump(data, explicit_start=True, indent=4, default_flow_style=False)
181 # tags=False,
182 # encoding='utf-8', allow_unicode=True)