def get(self, step_id): jobstep = JobStep.query.options(joinedload( 'project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 jobplan = JobPlan.query.filter( JobPlan.job_id == jobstep.job_id, ).first() # determine if there's an expected snapshot outcome expected_image = SnapshotImage.query.filter( SnapshotImage.job_id == jobstep.job_id, ).first() current_image = None # we only send a current snapshot if we're not expecting to build # a new image if not expected_image: current_snapshot = Snapshot.get_current(jobstep.project_id) if current_snapshot and jobplan: current_image = self.get_snapshot_image( current_snapshot.id, jobplan.plan_id) elif current_app.config['DEFAULT_SNAPSHOT']: current_image = { 'id': current_app.config['DEFAULT_SNAPSHOT'], } context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_image) context['expectedSnapshot'] = self.serialize(expected_image) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def get(self, step_id): jobstep = JobStep.query.options( joinedload('project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 jobplan = JobPlan.query.filter( JobPlan.job_id == jobstep.job_id, ).first() # determine if there's an expected snapshot outcome expected_image = SnapshotImage.query.filter( SnapshotImage.job_id == jobstep.job_id, ).first() current_image = None # we only send a current snapshot if we're not expecting to build # a new image if not expected_image: current_snapshot = Snapshot.get_current(jobstep.project_id) if current_snapshot and jobplan: current_image = self.get_snapshot_image(current_snapshot.id, jobplan.plan_id) elif current_app.config['DEFAULT_SNAPSHOT']: current_image = { 'id': current_app.config['DEFAULT_SNAPSHOT'], } context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_image) context['expectedSnapshot'] = self.serialize(expected_image) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def post(self, project_id): project = self._get_project(project_id) if project is None: return '', 404 args = self.parser.parse_args() for name, value in args.iteritems(): if value is None: continue # If we're rolling back a snapshot, take note. if name == 'snapshot.current': current = Snapshot.get_current(project.id) if current: # If value is empty, we're deactivating a snapshot without replacing it, # and that's a downgrade too. replacement = value and Snapshot.query.get(value) if not replacement or replacement.date_created < current.date_created: _report_snapshot_downgrade(project) create_or_update(ProjectOption, where={ 'project': project, 'name': name, }, values={ 'value': value, }) return '', 200
def create_snapshot(self, project, **kwargs): snapshot = Snapshot( project_id=project.id, project=project, **kwargs ) db.session.add(snapshot) db.session.commit() return snapshot
def execute_build(build, snapshot_id, no_snapshot): if no_snapshot: assert snapshot_id is None, 'Cannot specify snapshot with no_snapshot option' # TODO(dcramer): most of this should be abstracted into sync_build as if it # were a "im on step 0, create step 1" project = build.project # We choose a snapshot before creating jobplans. This is so that different # jobplans won't end up using different snapshots in a build. if snapshot_id is None and not no_snapshot: snapshot = Snapshot.get_current(project.id) if snapshot: snapshot_id = snapshot.id jobs = [] for plan in get_build_plans(project): job = Job( build=build, build_id=build.id, project=project, project_id=project.id, source=build.source, source_id=build.source_id, status=build.status, label=plan.label, ) db.session.add(job) jobplan = JobPlan.build_jobplan(plan, job, snapshot_id=snapshot_id) db.session.add(jobplan) jobs.append(job) db.session.commit() for job in jobs: create_job.delay( job_id=job.id.hex, task_id=job.id.hex, parent_task_id=job.build_id.hex, ) db.session.commit() sync_build.delay( build_id=build.id.hex, task_id=build.id.hex, ) return build
def get(self, step_id): jobstep = JobStep.query.options(joinedload( 'project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 current_snapshot = Snapshot.get_current(jobstep.project_id) context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_snapshot) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def post(self, project_id): """Initiates a new snapshot for this project.""" project = Project.get(project_id) if not project: return '', 404 # TODO(adegtiar): initialize a snapshot build. snapshot = Snapshot(project_id=project.id, ) db.session.add(snapshot) db.session.commit() # TODO(adegtiar): execute the build. return self.respond(snapshot)
def post(self, project_id): project = self._get_project(project_id) if project is None: return "", 404 args = self.parser.parse_args() for name, value in args.iteritems(): if value is None: continue # If we're rolling back a snapshot, take note. if name == "snapshot.current": current = Snapshot.get_current(project.id) if current: replacement = Snapshot.query.get(value) if replacement.date_created < current.date_created: _report_snapshot_downgrade(project) create_or_update(ProjectOption, where={"project": project, "name": name}, values={"value": value}) return "", 200
def post(self, project_id): """Initiates a new snapshot for this project.""" project = Project.get(project_id) if not project: return '', 404 args = self.post_parser.parse_args() repository = project.repository try: revision = identify_revision(repository, args.sha) except MissingRevision: # if the default fails, we absolutely can't continue and the # client should send a valid revision return '{"error": "Unable to find a matching revision."}', 400 if revision: sha = revision.sha else: sha = args.sha plan_list = get_snapshottable_plans(project) if not plan_list: return '{"error": "No snapshottable plans associated with project."}', 400 source, _ = get_or_create(Source, where={ 'repository': repository, 'revision_sha': sha, 'patch_id': None, }) build = Build( source_id=source.id, source=source, project_id=project.id, project=project, label='Create Snapshot', status=Status.queued, cause=Cause.snapshot, target=sha[:12], ) db.session.add(build) # TODO(dcramer): this needs to update with the build result snapshot = Snapshot( project_id=project.id, source_id=source.id, build_id=build.id, status=SnapshotStatus.pending, ) db.session.add(snapshot) jobs = [] for plan in plan_list: job = Job( build=build, build_id=build.id, project=project, project_id=project.id, source=build.source, source_id=build.source_id, status=build.status, label='Create Snapshot: %s' % (plan.label, ), ) db.session.add(job) jobplan = JobPlan.build_jobplan(plan, job) db.session.add(jobplan) image = SnapshotImage( job=job, snapshot=snapshot, plan=plan, ) db.session.add(image) jobs.append(job) db.session.commit() for job in jobs: create_job.delay( job_id=job.id.hex, task_id=job.id.hex, parent_task_id=job.build_id.hex, ) db.session.commit() sync_build.delay( build_id=build.id.hex, task_id=build.id.hex, ) return self.respond(snapshot)