141 - Support for Package Management in SO
[osm/SO.git] / rwlaunchpad / plugins / rwpkgmgr / rift / tasklets / rwpkgmgr / downloader / url.py
1 import rift.downloader as downloader
2 from gi.repository import RwPkgMgmtYang
3
4
5 TaskStatus = RwPkgMgmtYang.TaskStatus
6
7
8 class PackageFileDownloader(downloader.UrlDownloader):
9 STATUS_MAP = {
10 downloader.DownloadStatus.STARTED: TaskStatus.QUEUED.value_nick.upper(),
11 downloader.DownloadStatus.IN_PROGRESS: TaskStatus.IN_PROGRESS.value_nick.upper(),
12 downloader.DownloadStatus.COMPLETED: TaskStatus.COMPLETED.value_nick.upper(),
13 downloader.DownloadStatus.FAILED: TaskStatus.FAILED.value_nick.upper(),
14 downloader.DownloadStatus.CANCELLED: TaskStatus.CANCELLED.value_nick.upper()
15 }
16
17 @classmethod
18 def from_rpc_input(cls, rpc_input, file_obj, proxy, log=None, auth=None):
19 """Convenience class to set up an instance form RPC data
20 """
21 url_downloader = cls(
22 rpc_input.external_url,
23 rpc_input.package_id,
24 rpc_input.package_path,
25 rpc_input.package_type,
26 auth=auth,
27 proxy=proxy,
28 file_obj=file_obj,
29 log=log)
30
31 return url_downloader
32
33 def __init__(self,
34 url,
35 package_id,
36 package_path,
37 package_type,
38 proxy,
39 file_obj=None,
40 delete_on_fail=True,
41 decompress_on_fly=False,
42 auth=None,
43 log=None):
44 super().__init__(
45 url,
46 file_obj=file_obj,
47 delete_on_fail=delete_on_fail,
48 decompress_on_fly=decompress_on_fly,
49 auth=auth,
50 log=log)
51
52 self.package_id = package_id
53 self.package_type = package_type
54 self.package_path = package_path
55 self.proxy = proxy
56
57 def convert_to_yang(self):
58
59 job = RwPkgMgmtYang.DownloadJob.from_dict({
60 "url": self.meta.url,
61 "download_id": self.meta.download_id,
62 "package_id": self.package_id,
63 "package_path": self.package_path,
64 "package_type": self.package_type,
65 "detail": self.meta.detail,
66 "progress_percent": self.meta.progress_percent,
67 "bytes_downloaded": self.meta.bytes_downloaded,
68 "bytes_total": self.meta.bytes_total,
69 "bytes_per_second": self.meta.bytes_per_second,
70 "start_time": self.meta.start_time,
71 "stop_time": self.meta.stop_time,
72 "status": self.STATUS_MAP[self.meta.status]
73 })
74
75 return job
76
77 # Start of delegate calls
78 def call_delegate(self, event):
79 if not self.delegate:
80 return
81
82 job = self.convert_to_yang()
83 getattr(self.delegate, event)(job)
84
85
86 def download_succeeded(self):
87
88 try:
89 # Add the file to package
90 self.proxy.package_file_add(
91 self.meta.filepath,
92 self.package_type,
93 self.package_id,
94 self.package_path)
95
96 except Exception as e:
97 self.log.exception(e)
98 self.job.detail = str(e)
99 self.download_failed()
100 return
101
102 super().download_succeeded()
103