Catalog alignment
[sdc.git] / catalog-be / src / main / resources / scripts / import / tosca / importNormativeElements.py
1 import pycurl
2 import zipfile
3 from StringIO import StringIO
4 import json
5 import copy
6 from importCommon import *
7
8
9 #################################################################################################################################################################################
10 #                                                                                                                                                                                                                                                                                                                                                       #
11 # Import all users from a given file                                                                                                                                                                                                                                                                                    #
12 #                                                                                                                                                                                                                                                                                                                                                               #
13 # activation :                                                                                                                                                                                                                                                                                                                                  #
14 #       python importUsers.py [-s <scheme> | --scheme=<scheme> ] [-i <be host> | --ip=<be host>] [-p <be port> | --port=<be port> ] [-f <input file> | --ifile=<input file> ]   #
15 #                                                                                                                                                                                                                                                                                                                                                               #
16 # shortest activation (be host = localhost, be port = 8080):                                                                                                                                                                                                                                    #
17 #               python importUsers.py [-f <input file> | --ifile=<input file> ]                                                                                                                                                                                                         #
18 #                                                                                                                                                                                                                                                                                                                                                       #
19 #################################################################################################################################################################################
20 def import_element(scheme, be_host, be_port, admin_user, exit_on_success, file_dir, url_suffix, element_name, element_form_name,
21                    with_metadata=False):
22     result = createNormativeElement(scheme, be_host, be_port, admin_user, file_dir, url_suffix, element_name, element_form_name, with_metadata)
23     print_frame_line()
24     print_name_and_return_code(result[0], result[1])
25     print_frame_line()
26
27     if result[1] is None or result[1] not in [200, 201, 409]:
28         error_and_exit(1, None)
29     else:
30         if exit_on_success:
31             error_and_exit(0, None)
32
33
34
35 def createNormativeElement(scheme, be_host, be_port, admin_user, file_dir, url_suffix, element_name, element_form_name,
36                            with_metadata=False):
37     try:
38         log("in create normative element ", element_name)
39         buffer = StringIO()
40         c = pycurl.Curl()
41
42         url = scheme + '://' + be_host + ':' + be_port + url_suffix
43         c.setopt(c.URL, url)
44         c.setopt(c.POST, 1)
45
46         admin_header = 'USER_ID: ' + admin_user
47         c.setopt(pycurl.HTTPHEADER, [admin_header])
48
49         type_file_name = file_dir + "/" + element_name
50
51         multi_part_form_data = create_multipart_form_data(element_form_name, type_file_name, with_metadata, element_name)
52
53         c.setopt(pycurl.HTTPPOST, multi_part_form_data)
54         c.setopt(c.WRITEFUNCTION, buffer.write)
55
56         if scheme == 'https':
57             c.setopt(pycurl.SSL_VERIFYPEER, 0)
58             c.setopt(pycurl.SSL_VERIFYHOST, 0)
59
60         c.perform()
61
62         http_res = c.getinfo(c.RESPONSE_CODE)
63         if http_res is not None:
64             debug("http response=", http_res)
65         debug("response buffer", buffer.getvalue())
66         c.close()
67         return (element_name, http_res, buffer.getvalue())
68
69     except Exception as inst:
70         print("ERROR=" + str(inst))
71         return (element_name, None, None)
72
73
74 def create_multipart_form_data(element_form_name, type_file_name, with_metadata, element_name):
75     tosca_type_zip_part = create_zip_file_multi_part(element_form_name, type_file_name, element_name)
76     multi_part_form_data = [tosca_type_zip_part]
77     if with_metadata:
78         metadata_type_part = create_metadata_multipart(type_file_name)
79         multi_part_form_data.append(metadata_type_part)
80     debug(multi_part_form_data)
81     return multi_part_form_data
82
83
84 def create_metadata_multipart(type_file_name):
85     metadata = create_json_metadata_str(type_file_name)
86     return ("toscaTypeMetadata", metadata)
87
88
89 def create_zip_file_multi_part(element_form_name, type_file_name, element_name):
90     zf = zipfile.ZipFile(type_file_name + ".zip", "w")
91     zf.write(type_file_name + '.yml', element_name + '.yml')
92     zf.close()
93
94     tosca_type_zip_path = type_file_name + ".zip"
95     tosca_type_zip_part = (element_form_name, (pycurl.FORM_FILE, tosca_type_zip_path))
96     return tosca_type_zip_part
97
98
99 def create_json_metadata_str(file_name):
100     type_metadata_json_file = file_name + ".json"
101     debug(type_metadata_json_file)
102     json_file = open(type_metadata_json_file)
103
104     debug("before load json")
105     json_data = json.load(json_file, strict=False)
106     debug(json_data)
107
108     return json.dumps(json_data)