def post_build(): """ Once they submit the build form on /core/build, kick off the build with Launchpad """ opt_in = flask.request.values.get("canonicalUpdatesOptIn") full_name = flask.request.values.get("FullName") names = full_name.split(" ") email = flask.request.values.get("Email") board = flask.request.values.get("board") system = flask.request.values.get("system") snaps = flask.request.values.get("snaps", "").split(",") arch = flask.request.values.get("arch") if not user_info(flask.session): flask.abort(401) launchpad = Launchpad( username=os.environ["LAUNCHPAD_IMAGE_BUILD_USER"], token=os.environ["LAUNCHPAD_IMAGE_BUILD_TOKEN"], secret=os.environ["LAUNCHPAD_IMAGE_BUILD_SECRET"], session=session, auth_consumer=os.environ["LAUNCHPAD_IMAGE_BUILD_AUTH_CONSUMER"], ) context = {} # Submit user to marketo session.post( "https://pages.ubuntu.com/index.php/leadCapture/save", data={ "canonicalUpdatesOptIn": opt_in, "FirstName": " ".join(names[:-1]), "LastName": names[-1] if len(names) > 1 else "", "Email": email, "formid": "3546", "lpId": "2154", "subId": "30", "munchkinId": "066-EOV-335", "imageBuilderStatus": "NULL", }, ) # Ensure webhook is created if flask.request.host == "ubuntu.com": launchpad.create_update_system_build_webhook( system=system, delivery_url="https://ubuntu.com/core/build/notify", secret=flask.current_app.config["SECRET_KEY"], ) # Kick off image build try: response = launchpad.build_image( board=board, system=system, snaps=snaps, author_info={"name": full_name, "email": email, "board": board}, gpg_passphrase=flask.current_app.config["SECRET_KEY"], arch=arch, ) context["build_info"] = launchpad.session.get( response.headers["Location"] ).json() except HTTPError as http_error: if http_error.response.status_code == 400: return ( flask.render_template( "core/build/error.html", build_error=http_error.response.content.decode(), ), 400, ) else: raise http_error return flask.render_template("core/build/index.html", **context)
class LaunchpadTest(VCRTestCase): def _get_vcr_kwargs(self): """ This removes the authorization header from VCR so we don't record auth parameters """ return {"filter_headers": ["Authorization"]} def setUp(self): self.lp_for_snaps = Launchpad( username="******", token=getenv("SNAP_BUILDS_TOKEN", "secret"), secret=getenv("SNAP_BUILDS_SECRET", "secret"), session=requests.Session(), ) self.lp_for_images = Launchpad( username="******", token=getenv("IMAGE_BUILDS_TOKEN", "secret"), secret=getenv("IMAGE_BUILDS_SECRET", "secret"), session=requests.Session(), auth_consumer="image.build", ) return super().setUp() def test_01_build_image(self): response = self.lp_for_images.build_image( board="cm3", system="core16", snaps=["code", "toto"], author_info={"name": "somename", "email": "someemail"}, gpg_passphrase="fakepassword", ) self.assertEqual(response.status_code, 201) def test_02_create_webhooks(self): response = self.lp_for_images.create_update_system_build_webhook( "classic18.04", "https://design.staging.ubuntu.com/?image.build", "fake-secret", ) self.assertEqual(response.status_code, 201) def test_03_get_snap_by_store_name(self): snap = self.lp_for_snaps.get_snap_by_store_name("toto") self.assertEqual("toto", snap["store_name"]) snap = self.lp_for_snaps.get_snap_by_store_name( "snap-that-does-not-exist" ) self.assertEqual(None, snap) def test_04_create_snap(self): snap_name = "new-test-snap" git_repo = "https://github.com/build-staging-snapcraft-io/test1" self.lp_for_snaps.create_snap(snap_name, git_repo, "macaroon") # Check that the snap exist new_snap = self.lp_for_snaps.get_snap_by_store_name("new-test-snap") self.assertEqual(git_repo, new_snap["git_repository_url"]) def test_05_build_snap(self): result = self.lp_for_snaps.build_snap("toto") self.assertEqual(True, result) def test_05_delete_snap(self): result = self.lp_for_snaps.delete_snap("new-test-snap") self.assertEqual(True, result) def test_06_get_builders_status(self): result = self.lp_for_snaps.get_builders_status() for architecture in result.values(): self.assertIn("pending_jobs", architecture.keys()) self.assertIn("total_jobs_duration", architecture.keys()) self.assertIn("estimated_duration", architecture.keys())