Example #1
0
    def asDict(self, request=None):
        from buildbot.status.web.base import getCodebasesArg
        result = {}
        # Constant
        result['name'] = self.getName()

        # Transient
        result['text'] = self.getText()
        result['results'] = self.getResults()
        result['isStarted'] = self.isStarted()
        result['isFinished'] = self.isFinished()
        result['statistics'] = self.statistics
        result['times'] = self.getTimes()
        result['expectations'] = self.getExpectations()
        result['eta'] = self.getETA()
        result['step_number'] = self.step_number
        result['hidden'] = self.hidden

        args = getCodebasesArg(request)
        result['logs'] = [[
            l.getName(),
            self.build.builder.status.getURLForThing(l) + args
        ] for l in self.getLogs()]

        result["urls"] = self.getURLs()

        if request is not None:
            from buildbot.status.web.base import path_to_step
            result['url'] = path_to_step(request, self)

        return result
Example #2
0
    def getBox(self, req):
        urlbase = path_to_step(req, self.original)
        text = self.original.getText()
        if text is None:
            log.msg("getText() gave None", urlbase)
            text = []
        text = text[:]
        logs = self.original.getLogs()
        
        cxt = dict(text=text, logs=[], urls=[])

        for num in range(len(logs)):
            name = logs[num].getName()
            if logs[num].hasContents():
                url = urlbase + "/logs/%s" % urllib.quote(name)
            else:
                url = None
            cxt['logs'].append(dict(name=name, url=url))

        for name, target in self.original.getURLs().items():
            cxt['urls'].append(dict(link=target,name=name))

        template = req.site.buildbot_service.templates.get_template("box_macros.html")
        text = template.module.step_box(**cxt)
        
        class_ = "BuildStep " + build_get_class(self.original)
        return Box(text, class_=class_)
Example #3
0
    def getBox(self, req):
        urlbase = path_to_step(req, self.original)
        text = self.original.getText()
        if text is None:
            log.msg("getText() gave None", urlbase)
            text = []
        text = text[:]
        logs = self.original.getLogs()
        
        cxt = dict(text=text, logs=[], urls=[])

        for num in range(len(logs)):
            name = logs[num].getName()
            if logs[num].hasContents():
                url = urlbase + "/logs/%s" % urllib.quote(name)
            else:
                url = None
            cxt['logs'].append(dict(name=name, url=url))

        for name, target in self.original.getURLs().items():
            cxt['urls'].append(dict(link=target,name=name))

        template = req.site.buildbot_service.templates.get_template("box_macros.html")
        text = template.module.step_box(**cxt)
        
        class_ = "BuildStep " + build_get_class(self.original)
        return Box(text, class_=class_)
Example #4
0
    def getBox(self, req):
        urlbase = path_to_step(req, self.original)
        text = self.original.getText()
        if text is None:
            log.msg("getText() gave None", urlbase)
            text = []
        text = text[:]

        def native_link_fn(l):
            if l.hasContents():
                url = urlbase + "/logs/%s" % urllib.quote(l.getName())
            else:
                url = None
            return url

        logs, urls, _ = getStepLogsURLsAndAliases(
            self.original,
            False,
            native_link_fn,
        )

        cxt = dict(text=text, logs=logs, urls=urls)

        template = req.site.buildbot_service.templates.get_template(
            "box_macros.html")
        text = template.module.step_box(**unicodify(cxt))

        class_ = "BuildStep " + build_get_class(self.original)
        return Box(text,
                   class_=class_,
                   buildNumber=self.original.build_number,
                   builder=self.original.builder.getName(),
                   stepName=self.original.getName())
Example #5
0
def get_steps(steps_list, codebases_arg, request):
    """ This function return steps list with full description

    :param steps_list: list of steps in build (object must implement IBuildStepStatus)
    :param codebases_arg: additional parameters for url
    :param request: http request object
    :return:
    """

    steps = []
    for step in steps_list:
        step_obj = {
            'name': step.getName(),
            'css_class': 'not-started',
            'time_to_run': '',
            'link': path_to_step(request, step),
            'text': ' '.join(step.getText()),
            'urls': [],
            'logs': [],
        }
        if step.isFinished() and step.isHidden():
            continue

        if step.isFinished():
            start, end = step.getTimes()
            step_obj['css_class'] = css_classes[step.getResults()[0]]
            step_obj['time_to_run'] = formatInterval(end - start)
        elif step.isStarted():
            is_waiting = step.isWaitingForLocks()
            step_obj['css_class'] = 'waiting' if is_waiting else 'running'
            step_obj[
                'time_to_run'] = 'waiting for locks' if is_waiting else 'running'

        trigger_links = yield step.prepare_trigger_links(codebases_arg)
        for link_data in trigger_links:
            step.addURL(*link_data)

        step_obj['urls'] = __prepare_url_object(step, codebases_arg)
        step_obj['logs'] = __get_logs_for_step(step, codebases_arg, request)

        steps.append(step_obj)
    defer.returnValue(steps)
Example #6
0
 def getBox(self, req):
     urlbase = path_to_step(req, self.original)
     text = self.original.getText()
     if text is None:
         log.msg("getText() gave None", urlbase)
         text = []
     text = text[:]
     logs = self.original.getLogs()
     for num in range(len(logs)):
         name = logs[num].getName()
         if logs[num].hasContents():
             url = urlbase + "/logs/%s" % urllib.quote(name)
             text.append("<a href=\"%s\">%s</a>" % (url, html.escape(name)))
         else:
             text.append(html.escape(name))
     urls = self.original.getURLs()
     ex_url_class = "BuildStep external"
     for name, target in urls.items():
         text.append('[<a href="%s" class="%s">%s</a>]' %
                     (target, ex_url_class, html.escape(name)))
     class_ = "BuildStep " + build_get_class(self.original)
     return Box(text, class_=class_)
Example #7
0
 def getBox(self, req):
     urlbase = path_to_step(req, self.original)
     text = self.original.getText()
     if text is None:
         log.msg("getText() gave None", urlbase)
         text = []
     text = text[:]
     logs = self.original.getLogs()
     for num in range(len(logs)):
         name = logs[num].getName()
         if logs[num].hasContents():
             url = urlbase + "/logs/%s" % urllib.quote(name)
             text.append("<a href=\"%s\">%s</a>" % (url, html.escape(name)))
         else:
             text.append(html.escape(name))
     urls = self.original.getURLs()
     ex_url_class = "BuildStep external"
     for name, target in urls.items():
         text.append('[<a href="%s" class="%s">%s</a>]' %
                     (target, ex_url_class, html.escape(name)))
     class_ = "BuildStep " + build_get_class(self.original)
     return Box(text, class_=class_)
Example #8
0
    def content(self, req, cxt):
        b = self.build_status
        status = self.getStatus(req)
        req.setHeader('Cache-Control', 'no-cache')

        builder = self.build_status.getBuilder()
        cxt['builder'] = builder
        cxt['builder_name'] = builder.getFriendlyName()
        cxt['build_number'] = b.getNumber()
        cxt['builder_name_link'] = urllib.quote(
            self.build_status.getBuilder().getName(), safe='')
        cxt['b'] = b
        project = cxt['selectedproject'] = builder.getProject()
        cxt['path_to_builder'] = path_to_builder(req, b.getBuilder())
        cxt['path_to_builders'] = path_to_builders(req, project)
        cxt['path_to_codebases'] = path_to_codebases(req, project)
        cxt['build_url'] = path_to_build(req, b, False)
        cxt['slave_debug_url'] = self.getBuildmaster(
            req).config.slave_debug_url
        cxt['customBuildUrls'] = b.getCustomUrls()
        codebases_arg = cxt['codebases_arg'] = getCodebasesArg(request=req)
        cxt['build_chain_top_build_url'] = yield b.getTopBuildUrl(
            codebases_arg)

        if not b.isFinished():
            cxt['stop_build_chain'] = False
            step = b.getCurrentStep()
            if not step:
                cxt['current_step'] = "[waiting for build slave]"
            else:
                if step.isWaitingForLocks():
                    cxt['current_step'] = "%s [waiting for build slave]" % step.getName(
                    )
                else:
                    cxt['current_step'] = step.getName()
            when = b.getETA()
            if when is not None:
                cxt['when'] = util.formatInterval(when)
                cxt['when_time'] = time.strftime(
                    "%H:%M:%S", time.localtime(time.time() + when))

        else:
            cxt['result_css'] = css_classes[b.getResults()]
            if b.getTestResults():
                cxt['tests_link'] = req.childLink("tests")

        ssList = b.getSourceStamps()
        sourcestamps = cxt['sourcestamps'] = ssList

        all_got_revisions = b.getAllGotRevisions()
        cxt['got_revisions'] = all_got_revisions

        try:
            slave_obj = status.getSlave(b.getSlavename())

            if slave_obj is not None:
                cxt['slave_friendly_name'] = slave_obj.getFriendlyName()
                cxt['slave_url'] = path_to_slave(req, slave_obj)
            else:
                cxt['slave_friendly_name'] = b.getSlavename()
                cxt['slave_url'] = ""

        except KeyError:
            pass

        if b.resume:
            cxt['resume'] = b.resume

        cxt['steps'] = []

        for s in b.getSteps():
            step = {'name': s.getName()}

            if s.isFinished():
                if s.isHidden():
                    continue

                step['css_class'] = css_classes[s.getResults()[0]]
                (start, end) = s.getTimes()
                step['time_to_run'] = util.formatInterval(end - start)
            elif s.isStarted():
                if s.isWaitingForLocks():
                    step['css_class'] = "waiting"
                    step['time_to_run'] = "waiting for locks"
                else:
                    step['css_class'] = "running"
                    step['time_to_run'] = "running"
            else:
                step['css_class'] = "not-started"
                step['time_to_run'] = ""

            cxt['steps'].append(step)

            step['link'] = path_to_step(req, s)
            step['text'] = " ".join(s.getText())
            urls = []
            getUrls = s.getURLs().items()
            for k, v in s.getURLs().items():
                if isinstance(v, dict):
                    if 'results' in v.keys() and v['results'] in css_classes:
                        url_dict = dict(logname=k,
                                        url=v['url'] + codebases_arg,
                                        results=css_classes[v['results']])
                    else:
                        url_dict = dict(logname=k,
                                        url=v['url'] + codebases_arg)
                else:
                    url_dict = dict(logname=k, url=v + codebases_arg)
                urls.append(url_dict)

            step['urls'] = urls

            step['logs'] = []
            for l in s.getLogs():
                logname = l.getName()
                step['logs'].append({
                    'link':
                    req.childLink(
                        "steps/%s/logs/%s%s" %
                        (urllib.quote(s.getName(), safe=''),
                         urllib.quote(logname, safe=''), codebases_arg)),
                    'name':
                    logname
                })

        scheduler = b.getProperty("scheduler", None)
        parameters = {}
        master = self.getBuildmaster(req)
        for sch in master.allSchedulers():
            if isinstance(sch, ForceScheduler) and scheduler == sch.name:
                for p in sch.all_fields:
                    parameters[p.name] = p

        ps = cxt['properties'] = []
        for name, value, source in b.getProperties().asList():
            if not isinstance(value, dict):
                cxt_value = unicode(value)
            else:
                cxt_value = value

            if name == 'submittedTime':
                cxt_value = time.ctime(value)

            p = {'name': name, 'value': cxt_value, 'source': source}
            if len(cxt_value) > 500:
                p['short_value'] = cxt_value[:500]
            if name in parameters:
                param = parameters[name]
                if isinstance(param, TextParameter):
                    p['text'] = param.value_to_text(value)
                    p['cols'] = param.cols
                    p['rows'] = param.rows
                p['label'] = param.label
            ps.append(p)

        (start, end) = b.getTimes()
        cxt['start'] = time.ctime(start)
        cxt['elapsed'] = None
        if end and start:
            cxt['end'] = time.ctime(end)
            cxt['elapsed'] = util.formatInterval(end - start)
        elif start:
            now = util.now()
            cxt['elapsed'] = util.formatInterval(now - start)

        has_changes = False
        for ss in sourcestamps:
            has_changes = has_changes or ss.changes
        cxt['has_changes'] = has_changes
        cxt['authz'] = self.getAuthz(req)

        filters = {"number": b.getNumber()}

        build_json = BuildJsonResource(status, b)
        build_dict = yield build_json.asDict(req)
        cxt['instant_json']['build'] = {
            "url": path_to_json_build(status, req, builder.name,
                                      b.getNumber()),
            "data": json.dumps(build_dict, separators=(',', ':')),
            "waitForPush": status.master.config.autobahn_push,
            "pushFilters": {
                "buildStarted": filters,
                "buildFinished": filters,
                "stepStarted": filters,
                "stepFinished": filters,
            }
        }

        template = req.site.buildbot_service.templates.get_template(
            "build.html")
        defer.returnValue(template.render(**cxt))