def copr_build_module(copr): form = forms.ModuleFormUploadFactory(csrf_enabled=False) if not form.validate_on_submit(): # @TODO Prettier error raise LegacyApiError(form.errors) modulemd = form.modulemd.data.read() ActionsLogic.send_build_module(copr, modulemd) db.session.commit() return flask.jsonify({ "output": "ok", "message": "Module build was submitted", "modulemd": modulemd, })
def update_state_from_dict(cls, build, upd_dict): """ :param build: :param upd_dict: example: { "builds":[ { "id": 1, "copr_id": 2, "started_on": 1390866440 }, { "id": 2, "copr_id": 1, "status": 0, "chroot": "fedora-18-x86_64", "result_dir": "baz", "ended_on": 1390866440 }] } """ log.info("Updating build {} by: {}".format(build.id, upd_dict)) # create the package if it doesn't exist pkg_name = upd_dict.get('pkg_name', None) if pkg_name: if not PackagesLogic.get(build.copr_dir.id, pkg_name).first(): try: package = PackagesLogic.add( build.copr.user, build.copr_dir, pkg_name, build.source_type, build.source_json) db.session.add(package) db.session.commit() except (IntegrityError, DuplicateException) as e: app.logger.exception(e) db.session.rollback() return build.package = PackagesLogic.get(build.copr_dir.id, pkg_name).first() for attr in ["built_packages", "srpm_url", "pkg_version"]: value = upd_dict.get(attr, None) if value: setattr(build, attr, value) # update source build status if str(upd_dict.get("task_id")) == str(build.task_id): build.result_dir = upd_dict.get("result_dir", "") new_status = upd_dict.get("status") if new_status == StatusEnum("succeeded"): new_status = StatusEnum("importing") chroot_status=StatusEnum("waiting") if not build.build_chroots: # create the BuildChroots from Package setting, if not # already set explicitly for concrete build for chroot in build.package.chroots: buildchroot = models.BuildChroot( build=build, status=chroot_status, mock_chroot=chroot, git_hash=None, ) db.session.add(buildchroot) else: for buildchroot in build.build_chroots: buildchroot.status = chroot_status db.session.add(buildchroot) build.source_status = new_status if new_status == StatusEnum("failed") or \ new_status == StatusEnum("skipped"): for ch in build.build_chroots: ch.status = new_status ch.ended_on = upd_dict.get("ended_on") or time.time() db.session.add(ch) if new_status == StatusEnum("failed"): build.fail_type = FailTypeEnum("srpm_build_error") cls.process_update_callback(build) db.session.add(build) return if "chroot" in upd_dict: # update respective chroot status for build_chroot in build.build_chroots: if build_chroot.name == upd_dict["chroot"]: build_chroot.result_dir = upd_dict.get("result_dir", "") if "status" in upd_dict and build_chroot.status not in BuildsLogic.terminal_states: build_chroot.status = upd_dict["status"] if upd_dict.get("status") in BuildsLogic.terminal_states: build_chroot.ended_on = upd_dict.get("ended_on") or time.time() if upd_dict.get("status") == StatusEnum("starting"): build_chroot.started_on = upd_dict.get("started_on") or time.time() db.session.add(build_chroot) # If the last package of a module was successfully built, # then send an action to create module repodata on backend if (build.module and upd_dict.get("status") == StatusEnum("succeeded") and all(b.status == StatusEnum("succeeded") for b in build.module.builds)): ActionsLogic.send_build_module(build.copr, build.module) cls.process_update_callback(build) db.session.add(build)