예제 #1
0
 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())))
예제 #2
0
    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)
예제 #3
0
 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)
예제 #4
0
    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)
예제 #5
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)
예제 #6
0
 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)
예제 #7
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)
예제 #8
0
 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)
예제 #9
0
    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')
예제 #10
0
    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())
예제 #11
0
    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')
예제 #12
0
 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)
예제 #13
0
 def testDefaultValue(self):
     kwargs = dict(foo=3)
     tobj = persistobj.PersistentObject(self.tmpdir, 'TestObj', **kwargs)
     self.assertEqual(getattr(tobj, 'foo2', 2), 2)
예제 #14
0
 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)
예제 #15
0
 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)
예제 #16
0
    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
예제 #17
0
 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()))
예제 #18
0
 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)
예제 #19
0
 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')
예제 #20
0
 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()))