[RIFT 16087] Backend changes to decouple storage semantics from user interface. Chang...
[osm/SO.git] / rwlaunchpad / plugins / rwpkgmgr / rift / tasklets / rwpkgmgr / downloader / url.py
1 #
2 # Copyright 2016 RIFT.IO Inc
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 import rift.downloader as downloader
17 from gi.repository import RwPkgMgmtYang
18
19
20 TaskStatus = RwPkgMgmtYang.TaskStatus
21
22
23 class PackageFileDownloader(downloader.UrlDownloader):
24 STATUS_MAP = {
25 downloader.DownloadStatus.STARTED: TaskStatus.QUEUED.value_nick.upper(),
26 downloader.DownloadStatus.IN_PROGRESS: TaskStatus.IN_PROGRESS.value_nick.upper(),
27 downloader.DownloadStatus.COMPLETED: TaskStatus.COMPLETED.value_nick.upper(),
28 downloader.DownloadStatus.FAILED: TaskStatus.FAILED.value_nick.upper(),
29 downloader.DownloadStatus.CANCELLED: TaskStatus.CANCELLED.value_nick.upper()
30 }
31
32 @classmethod
33 def from_rpc_input(cls, rpc_input, file_obj, proxy, log=None, auth=None):
34 """Convenience class to set up an instance form RPC data
35 """
36 url_downloader = cls(
37 rpc_input.external_url,
38 rpc_input.package_id,
39 rpc_input.package_path,
40 rpc_input.package_type,
41 rpc_input.vnfd_file_type,
42 rpc_input.nsd_file_type,
43 auth=auth,
44 proxy=proxy,
45 file_obj=file_obj,
46 log=log)
47
48 return url_downloader
49
50 def __init__(self,
51 url,
52 package_id,
53 package_path,
54 package_type,
55 vnfd_file_type,
56 nsd_file_type,
57 proxy,
58 file_obj=None,
59 delete_on_fail=True,
60 decompress_on_fly=False,
61 auth=None,
62 log=None):
63 super().__init__(
64 url,
65 file_obj=file_obj,
66 delete_on_fail=delete_on_fail,
67 decompress_on_fly=decompress_on_fly,
68 auth=auth,
69 log=log)
70
71 self.package_id = package_id
72 self.package_type = package_type
73 self.package_path = package_path
74 self.package_file_type = vnfd_file_type.lower() if vnfd_file_type else nsd_file_type.lower()
75 self.proxy = proxy
76
77 def convert_to_yang(self):
78
79 job = RwPkgMgmtYang.DownloadJob.from_dict({
80 "url": self.meta.url,
81 "download_id": self.meta.download_id,
82 "package_id": self.package_id,
83 "package_path": self.package_path,
84 "package_type": self.package_type,
85 "detail": self.meta.detail,
86 "progress_percent": self.meta.progress_percent,
87 "bytes_downloaded": self.meta.bytes_downloaded,
88 "bytes_total": self.meta.bytes_total,
89 "bytes_per_second": self.meta.bytes_per_second,
90 "start_time": self.meta.start_time,
91 "stop_time": self.meta.stop_time,
92 "status": self.STATUS_MAP[self.meta.status]
93 })
94
95 return job
96
97 # Start of delegate calls
98 def call_delegate(self, event):
99 if not self.delegate:
100 return
101
102 job = self.convert_to_yang()
103 getattr(self.delegate, event)(job)
104
105
106 def download_succeeded(self):
107
108 try:
109 # Add the file to package
110 self.proxy.package_file_add(
111 self.meta.filepath,
112 self.package_type,
113 self.package_id,
114 self.package_path,
115 self.package_file_type)
116
117 except Exception as e:
118 self.log.exception(e)
119 self.job.detail = str(e)
120 self.download_failed()
121 return
122
123 super().download_succeeded()
124