def testUpdate(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) tobj2 = persistobj.PersistentObject(self.tmpdir, 'TestObj', filename=tobj.filename) self.assertEqual(list(sorted(tobj.items())), list(sorted(tobj2.items()))) kwargs['foo1'] = 'bar2' tobj.Update(**kwargs) tobj3 = persistobj.PersistentObject(self.tmpdir, 'TestObj', filename=tobj.filename) self.assertEqual(list(sorted(tobj.items())), list(sorted(tobj3.items())))
def testCommandKey(self): kwargs = dict(command_key='testCommandKey') stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=None) self.assertEqual(dl.CommandKey(), kwargs['command_key']) kwargs = dict() stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=None) self.assertEqual(dl.CommandKey(), None)
def testRestoreMultiple(self): (dm, _) = self.allocTestDM() numdl = 4 for i in range(numdl): args = { 'command_key': 'TestCommandKey' + str(i), 'file_type': 'TestFileType', 'url': 'http://example.com/', 'username': '******', 'password': '******', 'file_size': 99, 'target_filename': 'TestFilename', 'delay_seconds': 30 } persistobj.PersistentObject(objdir=dm.config_dir, rootname=download.DNLDROOTNAME, filename=None, **args) dm.RestoreDownloads() self.assertEqual(len(mock_downloads), numdl) for i in range(numdl): dl = mock_downloads[i] self.assertFalse(dl.do_start_called) self.assertFalse(dl.immediate_complete_called) self.assertTrue(dl.reboot_callback_called)
def NewDownload(self, command_key=None, file_type=None, url=None, username=None, password=None, file_size=0, target_filename=None, delay_seconds=0): """Initiate a new download, handling a tr-69 Download RPC. Args: command_key, file_type, url, username, password, file_size: target_filename, delay_seconds: as defined in tr-69 Amendment 3 (page 82 of $SPEC) Raises: core.ResourcesExceededError: too many simultaneous downloads core.FileTransferProtocolError: Unsupported URL type, ex: ftp Returns: (code, starttime, endtime): code = status to return (1 == send TransferComplete later, $SPEC pg 85) starttime, endtime = two floating point numbers in seconds for the StartTime and CompleteTime of the DownloadResponse. """ # TODO(dgentry) check free space? if len(self._downloads) >= self.MAXDOWNLOADS: faultstring = 'Max downloads (%d) reached.' % self.MAXDOWNLOADS raise core.ResourcesExceededError(faultstring) o = urlparse.urlparse(url) if o.scheme not in DOWNLOAD_CLIENT: raise core.FileTransferProtocolError('Unsupported URL scheme %s' % o.scheme) kwargs = dict(command_key=command_key, file_type=file_type, url=url, username=username, password=password, file_size=file_size, target_filename=target_filename, delay_seconds=delay_seconds, event_code='M Download') pobj = persistobj.PersistentObject(objdir=self.config_dir, rootname=DNLDROOTNAME, filename=None, ignore_errors=True, **kwargs) dl = DOWNLOADOBJ(stateobj=pobj, transfer_complete_cb=self.TransferCompleteCallback, download_dir=self.download_dir) self._downloads.append(dl) dl.do_start() return (1, 0.0, 0.0)
def Reboot(self, command_key): """Reboot the system.""" kwargs = dict(command_key=command_key) pobj = persistobj.PersistentObject(objdir=self.config_dir, rootname=BOOTROOTNAME, filename=None, **kwargs) self.ioloop.add_callback(self._DelayedReboot)
def testRestoreNoCommandKey(self): (dm, _) = self.allocTestDM() args = {'delay_seconds': 30} persistobj.PersistentObject(objdir=dm.config_dir, rootname=download.DNLDROOTNAME, filename=None, **args) dm.RestoreDownloads() self.assertEqual(len(mock_downloads), 0)
def testReadFromFile(self): contents = '{"foo": "bar", "baz": 4}' with tempfile.NamedTemporaryFile(dir=self.tmpdir, delete=False) as f: f.write(contents) f.close() tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', filename=f.name) self.assertEqual(tobj.foo, 'bar') self.assertEqual(tobj.baz, 4)
def testRestoreReboots(self): (dm, _) = self.allocTestDM() expected = set() numrb = 3 for i in range(numrb): key = u'TestCommandKey' + str(i) args = {'command_key': key} persistobj.PersistentObject(objdir=dm.config_dir, rootname=download.BOOTROOTNAME, filename=None, **args) expected.add(('M Reboot', key)) # Plus an invalid object args = {'foo': 'bar'} persistobj.PersistentObject(objdir=dm.config_dir, rootname=download.BOOTROOTNAME, filename=None, **args) reboots = set(dm.RestoreReboots()) self.assertEqual(reboots, expected)
def testInstallNoReboot(self): ioloop = MockIoloop() cmpl = MockTransferComplete() time.time = self.mockTime kwargs = dict(command_key='testCommandKey', url='http://example.com/foo', delay_seconds=1) stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=cmpl.SendTransferComplete, ioloop=ioloop) # Step 1: Wait delay_seconds dl.do_start() self.assertEqual(ioloop.timeout, _Delta(kwargs['delay_seconds'])) # Step 2: HTTP Download dl.timer_callback() self.assertEqual(len(mock_http_downloads), 1) http = mock_http_downloads[0] self.assertEqual(http.url, kwargs['url']) # Step 3: Install dlfile = MockFile('/path/to/downloaded/file') http.download_complete_cb(0, '', dlfile) self.assertEqual(len(mock_installers), 1) inst = mock_installers[0] self.assertTrue(inst.did_install) self.assertEqual(inst.filename, dlfile.name) self.assertFalse(inst.did_reboot) # Step 4: Install Succeeded, no reboot inst.install_callback(0, '', must_reboot=False) self.assertTrue(cmpl.transfer_complete_called) self.assertEqual(cmpl.command_key, kwargs['command_key']) self.assertEqual(cmpl.faultcode, 0) self.assertEqual(cmpl.faultstring, '') self.assertEqual(cmpl.starttime, self.mockTime()) self.assertEqual(cmpl.endtime, self.mockTime()) self.assertEqual(cmpl.event_code, 'M Download')
def testCancelRefused(self): ioloop = MockIoloop() cmpl = MockTransferComplete() kwargs = dict(command_key='testCommandKey', url='http://example.com/foo') stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=cmpl.SendTransferComplete, ioloop=ioloop) dl.do_start() # Step 1: Wait delay_seconds dl.timer_callback() # Step 2: HTTP Download dl.download_complete_callback(0, None, None) # Step 3: Install self.assertTrue(dl.cleanup()) dl.installer_callback(0, None, must_reboot=True) # Step 4: Reboot self.assertTrue(dl.cleanup()) dl.reboot_callback(0, '') # Step 5: Rebooted self.assertFalse(dl.cleanup())
def testDownloadFailed(self): ioloop = MockIoloop() cmpl = MockTransferComplete() time.time = self.mockTime kwargs = dict(command_key='testCommandKey', url='http://example.com/foo', delay_seconds=1) stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=cmpl.SendTransferComplete, ioloop=ioloop) # Step 1: Wait delay_seconds dl.do_start() self.assertEqual(ioloop.timeout, _Delta(kwargs['delay_seconds'])) # Step 2: HTTP Download dl.timer_callback() self.assertEqual(len(mock_http_downloads), 1) http = mock_http_downloads[0] self.assertEqual(http.url, kwargs['url']) # Step 3: Download fails http.download_complete_cb(100, 'TestDownloadError', None) self.assertEqual(len(mock_installers), 0) self.assertTrue(cmpl.transfer_complete_called) self.assertEqual(cmpl.command_key, kwargs['command_key']) self.assertEqual(cmpl.faultcode, 100) self.assertEqual(cmpl.faultstring, 'TestDownloadError') self.assertEqual(cmpl.starttime, 0.0) self.assertEqual(cmpl.endtime, 0.0) self.assertEqual(cmpl.event_code, 'M Download')
def Reboot(self, command_key): """Reboot the system.""" kwargs = dict(command_key=command_key) persistobj.PersistentObject(objdir=self.config_dir, rootname=BOOTROOTNAME, filename=None, **kwargs) session.RunAtEnd(self._DelayedReboot)
def testDefaultValue(self): kwargs = dict(foo=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) self.assertEqual(getattr(tobj, 'foo2', 2), 2)
def testDelete(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) tobj.Delete() self.assertRaises(OSError, os.stat, tobj.filename)
def testPersistentObjectAttrs(self): kwargs = {'foo1': 'bar1', 'foo2': 'bar2', 'foo3': 3} tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) self.assertEqual(tobj.foo1, 'bar1') self.assertEqual(tobj.foo2, 'bar2') self.assertEqual(tobj.foo3, 3)
def testSuccess(self): ioloop = MockIoloop() cmpl = MockTransferComplete() time.time = self.mockTime kwargs = dict(command_key='testCommandKey', file_type='testFileType', url='http://example.com/foo', username='******', password='******', file_size=1000, target_filename='testTargetFilename', delay_seconds=99) stateobj = persistobj.PersistentObject(objdir=self.tmpdir, rootname='testObj', filename=None, **kwargs) dl = download.Download(stateobj=stateobj, transfer_complete_cb=cmpl.SendTransferComplete, ioloop=ioloop) self.assertEqual(self.QCheckBoring(dl, kwargs), 1) # 1: Not Yet Started # Step 1: Wait delay_seconds dl.do_start() self.assertEqual(ioloop.timeout, _Delta(kwargs['delay_seconds'])) self.assertEqual(self.QCheckBoring(dl, kwargs), 1) # 1: Not Yet Started # Step 2: HTTP Download dl.timer_callback() self.assertEqual(len(mock_http_downloads), 1) http = mock_http_downloads[0] self.assertEqual(http.url, kwargs['url']) self.assertEqual(http.username, kwargs['username']) self.assertEqual(http.password, kwargs['password']) self.assertTrue(http.download_complete_cb) self.assertTrue(http.did_fetch) self.assertEqual(self.QCheckBoring(dl, kwargs), 2) # 2: In process # Step 3: Install dlfile = MockFile('/path/to/downloaded/file') http.download_complete_cb(0, '', dlfile) self.assertEqual(len(mock_installers), 1) inst = mock_installers[0] self.assertTrue(inst.did_install) self.assertEqual(inst.file_type, kwargs['file_type']) self.assertEqual(inst.target_filename, kwargs['target_filename']) self.assertEqual(inst.filename, dlfile.name) self.assertFalse(inst.did_reboot) self.assertEqual(self.QCheckBoring(dl, kwargs), 2) # 2: In process # Step 4: Reboot inst.install_callback(0, '', must_reboot=True) self.assertTrue(inst.did_reboot) self.assertEqual(self.QCheckBoring(dl, kwargs), 2) # 2: In process # Step 5: Send Transfer Complete dl.reboot_callback(0, '') self.assertTrue(cmpl.transfer_complete_called) self.assertEqual(cmpl.command_key, kwargs['command_key']) self.assertEqual(cmpl.faultcode, 0) self.assertEqual(cmpl.faultstring, '') self.assertEqual(cmpl.starttime, self.mockTime()) self.assertEqual(cmpl.endtime, self.mockTime()) self.assertEqual(cmpl.event_code, 'M Download') self.assertEqual(self.QCheckBoring(dl, kwargs), 3) # 3: Cleaning up # Step 6: Wait for Transfer Complete Response self.assertFalse(dl.cleanup()) self.assertEqual(self.QCheckBoring(dl, kwargs), 3) # 3: Cleaning up
def testReversibleEncoding(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) encoded = tobj._ToJson() decoded = tobj._FromJson(encoded) self.assertEqual(sorted(kwargs.items()), sorted(decoded.items()))
def testUpdateFails(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) tobj.objdir = '/this_path_should_not_exist_hijhgvWRQ4MVVSDHuheifuh' kwargs['foo1'] = 'bar2' self.assertRaises(OSError, tobj.Update, **kwargs)
def testUpdateInline(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) tobj.Update(foo1='bar2') self.assertEqual(tobj.foo1, 'bar2')
def testWriteToFile(self): kwargs = dict(foo1='bar1', foo3=3) tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs) encoded = open(tobj.filename).read() decoded = tobj._FromJson(encoded) self.assertEqual(sorted(kwargs.items()), sorted(decoded.items()))