Exemple #1
0
    def install_project(self, project_name):
        logger.debug('Install project %s', project_name)

        self.installed_projects.discard(project_name)

        if project_name in self.projects and not self.installing:
            self.installing = project_name
            self.install_output = []

            project = self.projects[project_name]
            project_path = os.path.join(self.projects_dir, project_name)

            self.on_project_installing(self, project)

            if project_name in self.failed_projects:
                if os.path.exists(project_path):
                    shutil.rmtree(project_path)
                self.failed_projects.discard(project_name)

            if os.path.exists(project_path):
                subprocess.Popen(
                    args=["git", "config", "remote.origin.url",
                          project["repository"]],
                    cwd=project_path
                ).communicate()

                logger.debug('git pull from %s', project["repository"])
                p = AsyncPopen2(
                    args=["git", "pull"],
                    cwd=project_path,
                    env=self.gitenv
                )
            else:
                logger.debug('git clone')
                p = AsyncPopen2(
                    args=["git", "clone", project["repository"], project_path],
                    env=self.gitenv
                )
            p.on_output += self.collect_install_output
            p.on_end += yield gen.Callback("gitend")

            try:
                p.run()
            except OSError as error:
                logger.exception("Install command error")
                result = 9999
                self.install_output.append(str(error))
            else:
                result = yield gen.Wait("gitend")

            if result != 0:
                self.install_output.append("\ngit returned %d\n" % result)
                logger.error(
                    "Project failed to install: %s",
                    "".join(self.install_output)
                )
                self.on_project_installation_failed(
                    self, project, "".join(self.install_output))
                self.installing = None
                self.failed_projects.add(project_name)

                raise gen.Return(False)
            else:
                logger.debug(
                    "git operation: %s", "".join(self.install_output)
                )

            project_install_file = os.path.join(project_path,
                                                "warrior-install.sh")

            if os.path.exists(project_install_file):
                if not is_executable(project_install_file):
                    logger.warning('File %s is not executable. '
                        'Automatically changing it to be executable!',
                        project_install_file)
                    set_file_executable(project_install_file)

                p = AsyncPopen2(
                    args=[project_install_file],
                    cwd=project_path
                )
                p.on_output += self.collect_install_output
                p.on_end += yield gen.Callback("installend")
                try:
                    p.run()
                except OSError as error:
                    logger.exception("Custom project install file error")
                    result = 9999
                    self.install_output.append(str(error))
                else:
                    result = yield gen.Wait("installend")

                if result != 0:
                    self.install_output.append(
                        "\nCustom installer returned %d\n" % result)
                    logger.error(
                        "Custom installer failed to install: %s",
                        "".join(self.install_output)
                    )
                    self.on_project_installation_failed(
                        self, project, "".join(self.install_output))
                    self.installing = None
                    self.failed_projects.add(project_name)

                    raise gen.Return(False)
                else:
                    logger.debug('Project install file result: %s', result)

            data_dir = os.path.join(self.data_dir, "data")
            if os.path.exists(data_dir):
                shutil.rmtree(data_dir)
            os.makedirs(data_dir)

            project_data_dir = os.path.join(project_path, "data")
            if os.path.islink(project_data_dir):
                os.remove(project_data_dir)
            elif os.path.isdir(project_data_dir):
                shutil.rmtree(project_data_dir)
            os.symlink(data_dir, project_data_dir)

            self.installed_projects.add(project_name)
            logger.debug('Install complete %s', "".join(self.install_output))
            self.on_project_installed(self, project,
                                      "".join(self.install_output))

            self.installing = None

            raise gen.Return(True)

        else:
            logger.warning('Not installing project %s because it is not a '
                'known project or an install is already in progress',
                project_name)
 def test_yield_outside_with(self):
     # This pattern avoids the problem in the previous test.
     cb = yield gen.Callback('k1')
     with StackContext(functools.partial(self.context, 'c1')):
         self.io_loop.add_callback(cb)
     yield gen.Wait('k1')
 def test_yield_outside_with_exception_stack_context(self):
     cb = yield gen.Callback('k1')
     with ExceptionStackContext(lambda t, v, tb: False):
         self.io_loop.add_callback(cb)
     yield gen.Wait('k1')
Exemple #4
0
 def f():
     (yield gen.Callback("k1"))()
     res = yield gen.Wait("k1")
     self.assertTrue(res is None)
     self.stop()
Exemple #5
0
    def get_authenticated_user(self,
                               redirect_uri,
                               callback,
                               scope=None,
                               **args):
        """
        class RenrenHandler(tornado.web.RequestHandler, RenrenGraphMixin):
            @tornado.web.asynchronous
            @gen.engine
            def get(self):
                self.get_authenticated_user(
                    callback=(yield gen.Callback('key')),
                    redirect_uri=url)
                user = yield gen.Wait('key')
                if not user:
                    raise web.HTTPError(500, "Renren auth failed")
                # do something else
                self.finish()
        """

        code = self.get_argument('code', None)
        if not code:
            self.authorize_redirect(redirect_uri, scope=scope, **args)
            return
        self.get_access_token(
            code,
            callback=(
                yield
                gen.Callback('_RenrenGraphMixin.get_authenticated_user')),
            redirect_uri=redirect_uri)

        response = yield gen.Wait('_RenrenGraphMixin.get_authenticated_user')
        if not response:
            callback(None)
            return
        try:
            user = json_decode(response.body)
        except:
            logging.warning("Error response %s fetching %s", response.body,
                            response.request.url)
            callback(None)
            return
        if 'error' in user:
            logging.warning("Error response %s fetching %s",
                            user['error_description'], response.request.url)
            callback(None)
            return

        #{{{ get session key
        self.renren_request(
            'renren_api/session_key',
            user['access_token'],
            callback=(yield gen.Callback('_RenrenGraphMixin._session_key')))
        response = yield gen.Wait('_RenrenGraphMixin._session_key')
        if response.error and not response.body:
            logging.warning("Error response %s fetching %s", response.error,
                            response.request.url)
        elif response.error:
            logging.warning("Error response %s fetching %s: %s",
                            response.error, response.request.url,
                            response.body)
        else:
            try:
                user['session'] = json_decode(response.body)
            except:
                pass
        #}}} #TODO delete when renren graph api released
        callback(user)
        return
Exemple #6
0
 def f():
     (yield gen.Callback((1, 2)))((3, 4))
     res = yield gen.Wait((1, 2))
     self.assertEqual((3, 4), res)
     self.stop()
Exemple #7
0
 def f():
     (yield gen.Callback("k1"))()
     res = yield gen.Wait("k1")
     assert res is None
     self.stop()
Exemple #8
0
 def f():
     yield gen.Callback((1, 2))
     self.stop()
Exemple #9
0
 def f():
     self.io_loop.add_callback((yield gen.Callback(0)))
     yield gen.Wait(0)
     self.stop()
Exemple #10
0
 def f():
     (yield gen.Callback("k1"))("v1")
     (yield gen.Callback("k2"))("v2")
     results = yield dict(foo=gen.Wait("k1"), bar=gen.Wait("k2"))
     self.assertEqual(results, dict(foo="v1", bar="v2"))
     self.stop()
Exemple #11
0
 def f():
     yield gen.Callback((1, 2))
     yield gen.Wait((2, 3))
     self.stop()
Exemple #12
0
 def func():
     self.db.execute('SELECT DOES NOT WORK!;',
                     callback=(yield gen.Callback('q1')))
     cursor = yield momoko.WaitOp('q1')
     self.stop()
Exemple #13
0
 def func():
     self.db.execute('SELECT 1;', callback=(yield gen.Callback('q1')))
     cursor = yield momoko.WaitOp('q1')
     self.assert_equal(cursor.fetchone(), (1, ))
     self.stop()
Exemple #14
0
    def install_project(self, project_name):
        logger.debug('Install project %s', project_name)

        self.installed_projects.discard(project_name)

        if project_name in self.projects and not self.installing:
            self.installing = project_name
            self.install_output = []

            project = self.projects[project_name]
            project_path = os.path.join(self.projects_dir, project_name)

            self.on_project_installing(self, project)

            if project_name in self.failed_projects:
                if os.path.exists(project_path):
                    shutil.rmtree(project_path)
                self.failed_projects.discard(project_name)

            if os.path.exists(project_path):
                subprocess.Popen(args=[
                    "git", "config", "remote.origin.url", project["repository"]
                ],
                                 cwd=project_path).communicate()

                logger.debug('git pull from %s', project["repository"])
                p = AsyncPopen2(args=["git", "pull"],
                                cwd=project_path,
                                env=self.gitenv)
            else:
                logger.debug('git clone')
                p = AsyncPopen2(
                    args=["git", "clone", project["repository"], project_path],
                    env=self.gitenv)
            p.on_output += self.collect_install_output
            p.on_end += yield gen.Callback("gitend")
            p.run()
            result = yield gen.Wait("gitend")

            if result != 0:
                self.install_output.append("\ngit returned %d\n" % result)
                logger.error("Project failed to install: %s",
                             "".join(self.install_output))
                self.on_project_installation_failed(
                    self, project, "".join(self.install_output))
                self.installing = None
                self.failed_projects.add(project_name)

                raise gen.Return(False)
            else:
                logger.debug("git operation: %s", "".join(self.install_output))

            project_install_file = os.path.join(project_path,
                                                "warrior-install.sh")

            if os.path.exists(project_install_file):
                p = AsyncPopen2(args=[project_install_file], cwd=project_path)
                p.on_output += self.collect_install_output
                p.on_end += yield gen.Callback("installend")
                p.run()
                result = yield gen.Wait("installend")

                if result != 0:
                    self.install_output.append(
                        "\nCustom installer returned %d\n" % result)
                    logger.error("Custom installer failed to install: %s",
                                 "".join(self.install_output))
                    self.on_project_installation_failed(
                        self, project, "".join(self.install_output))
                    self.installing = None
                    self.failed_projects.add(project_name)

                    raise gen.Return(False)

            data_dir = os.path.join(self.data_dir, "data")
            if os.path.exists(data_dir):
                shutil.rmtree(data_dir)
            os.makedirs(data_dir)

            project_data_dir = os.path.join(project_path, "data")
            if os.path.islink(project_data_dir):
                os.remove(project_data_dir)
            elif os.path.isdir(project_data_dir):
                shutil.rmtree(project_data_dir)
            os.symlink(data_dir, project_data_dir)

            self.installed_projects.add(project_name)
            logger.debug('Install complete %s', "".join(self.install_output))
            self.on_project_installed(self, project,
                                      "".join(self.install_output))

            self.installing = None

            raise gen.Return(True)
Exemple #15
0
 def f():
     self.io_loop.add_callback((yield gen.Callback("k1")))
     yield gen.Wait("k1")
     1 / 0
Exemple #16
0
 def f():
     self.orphaned_callback = yield gen.Callback(1)
Exemple #17
0
 def f():
     (yield gen.Callback("k1"))(42)
     res = yield gen.Wait("k1")
     self.assertEqual(42, res)
     self.stop()
Exemple #18
0
 def f():
     (yield gen.Callback("k1"))("v1")
     (yield gen.Callback("k2"))("v2")
     results = yield [gen.Wait("k1"), gen.Wait("k2")]
     self.assertEqual(results, ["v1", "v2"])
     self.stop()
Exemple #19
0
 def f():
     yield gen.Callback("k1")
     yield gen.Callback("k1")
     self.stop()
 def queryCallback( port, qry):
     return queryExecute( port, qry), gen.Callback( port)