#1601 frontend: cli: api: tests: Setting isolation option per chroot
Merged 3 years ago by schlupov. Opened 3 years ago by schlupov.
copr/ schlupov/copr isolation_option_per_chroot  into  master

file modified
+1 -3
@@ -12,9 +12,7 @@ 

  

  config_opts['root'] = '{{ rootdir }}'

  

- {%- if isolation == "default" %}

- config_opts['isolation'] = 'auto'

- {%- elif isolation %}

+ {%- if isolation not in ["default", None] %}

  config_opts['isolation'] = '{{ isolation }}'

  {%- endif %}

  

file modified
+5 -2
@@ -623,6 +623,7 @@ 

              comps=args.upload_comps, delete_comps=args.delete_comps,

              additional_packages=args.packages, additional_repos=args.repos,

              bootstrap=args.bootstrap, bootstrap_image=args.bootstrap_image,

+             isolation=args.isolation,

          )

          print("Edit chroot operation was successful.")

  
@@ -1011,7 +1012,7 @@ 

      parser_modify.add_argument("--auto-prune", choices=["on", "off"],

                                 help="If auto-deletion of project's obsoleted builds should be enabled.\

                                 This option can only be specified by a COPR admin.")

-     parser_modify.add_argument("--isolation", choices=["simple", "nspawn", "default"], default="default",

+     parser_modify.add_argument("--isolation", choices=["simple", "nspawn", "default"],

                                 help="Choose the isolation method for running commands in buildroot.")

  

      parser_modify.add_argument(
@@ -1155,7 +1156,7 @@ 

                                       help="If you don't need this build for all the project's chroots. You can use it several times for each chroot you need.")

      parser_build_parent.add_argument("--background", dest="background", action="store_true", default=False,

                                       help="Mark the build as a background job. It will have lesser priority than regular builds.")

-     parser_build_parent.add_argument("--isolation", choices=["simple", "nspawn", "default"], default="default",

+     parser_build_parent.add_argument("--isolation", choices=["simple", "nspawn", "default"], default="unchanged",

                                       help="Choose the isolation method for running commands in buildroot.")

  

      parser_build_parent.add_argument(
@@ -1279,6 +1280,8 @@ 

                                        help="space separated string of package names to be added to buildroot")

      parser_edit_chroot.add_argument("--repos",

                                        help="space separated string of additional repo urls for chroot")

+     parser_edit_chroot.add_argument("--isolation", choices=["simple", "nspawn", "default"], default="unchanged",

+                                     help="Choose the isolation method for running commands in buildroot.")

  

      parser_edit_chroot.add_argument(

          "--bootstrap",

file modified
+16 -2
@@ -106,6 +106,7 @@ 

                         [--unlisted-on-hp {on,off}]

                         [--persistent]

                         [--auto-prune {on,off}]

+                        [--isolation {default, nspawn, simple}]

                         name

  

  --chroot::
@@ -138,6 +139,9 @@ 

  --auto-prune::

  If backend auto-prunning script should be run for this project. This option can only be specified by a COPR admin.

  

+ --isolation ISOLATION::

+ Choose the isolation method for running commands in buildroot

+ 

  name::

  Can be just name of the project or in form username/projectname or @groupname/projectname.

  
@@ -152,6 +156,7 @@ 

                         [--enable-net {on,off}]

                         [--unlisted-on-hp {on,off}]

                         [--auto-prune {on,off}]

+                        [--isolation {default, nspawn, simple}]

                         name

  

  Alters only specified project property.
@@ -183,6 +188,9 @@ 

  --auto-prune::

  If backend auto-prunning script should be run for this project. This option can only be specified by a COPR admin.

  

+ --isolation ISOLATION::

+ Choose the isolation method for running commands in buildroot

+ 

  name::

  Can be just name of the project or in form username/projectname or @groupname/projectname.

  
@@ -193,7 +201,7 @@ 

  ~~~~~~~~~~~~~~~~~~~~~~~~~~

  

  usage: copr-cli build [-h] [-r, --chroot CHROOTS] [--memory MEMORY] [--timeout TIMEOUT] [--nowait]

-                       [--background]

+                       [--background] [--isolation {default, nspawn, simple}]

                        copr_repo PKG [PKG ...]

  

  -r, --chroot::
@@ -211,6 +219,9 @@ 

  --background::

  Run the build at a lower priority.

  

+ --isolation ISOLATION::

+ Choose the isolation method for running commands in buildroot.

+ 

  copr_repo::

  The copr repository to build the package in. This can be a simple name of some of

  your projects or it can be specified fully as username/project or @groupname/project.
@@ -402,7 +413,7 @@ 

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  

  usage: copr edit-chroot [-h] [--upload-comps FILEPATH | --delete-comps]

-                         [--packages PACKAGES] [--repos REPOS]

+                         [--packages PACKAGES] [--repos REPOS] [--isolation {default, nspawn, simple}]

                          coprchroot

  

  Edit the specified coprchroot.
@@ -422,6 +433,9 @@ 

  --repos REPOS::

  space separated string of additional repo urls for chroot (e.g. "http://foo http://bar")

  

+ --isolation ISOLATION::

+ Choose the isolation method for running commands in buildroot

+ 

  

  `copr-cli get-chroot coprchroot`

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

file modified
+15
@@ -396,6 +396,21 @@ 

      assert stdout == "New project was successfully created.\n"

  

  

+ @mock.patch('copr.v3.proxies.project_chroot.ProjectChrootProxy.edit')

+ @mock.patch('copr_cli.main.config_from_file', return_value=mock_config)

+ def test_edit_chroot_with_isolation(_config_from_file, project_chroot_proxy_edit, capsys):

+     main.main(argv=[

+         "edit-chroot", "foo/f20",

+         "--isolation", "simple",

+     ])

+     stdout, stderr = capsys.readouterr()

+     project_chroot_proxy_edit.assert_called_once()

+     kwargs = project_chroot_proxy_edit.call_args[1]

+     assert stderr == ''

+     assert kwargs["isolation"] == "simple"

+     assert stdout == "Edit chroot operation was successful.\n"

+ 

+ 

  @mock.patch('copr.v3.proxies.project.ProjectProxy.add')

  @mock.patch('copr_cli.main.config_from_file', return_value=mock_config)

  def test_create_multilib_project(config_from_file, project_proxy_add, capsys):

file modified
+2 -2
@@ -41,7 +41,7 @@ 

              'chroots': None,

              'background': False,

              'progress_callback': None,

-             'isolation': 'default',

+             'isolation': 'unchanged',

          },

          'packagename': 'test',

          'distgit': None,
@@ -90,7 +90,7 @@ 

                  "chroots": ['fedora-rawhide-x86_64'],

                  "background": True,

                  "progress_callback": None,

-                 'isolation': 'default',

+                 'isolation': 'unchanged',

              },

          })

          assert call[1] == result

@@ -74,6 +74,7 @@ 

              "use_bootstrap_container": False,

              "with_opts": [],

              "without_opts":[],

+             "isolation": "default"

          })

  

      @pytest.yield_fixture
@@ -160,7 +161,7 @@ 

              "config_opts['root'] = 'test-test_fedora-rawhide-x86_64'\n",

              "")

  

-     def test_no_repos(self, f_get_build_config, f_test_config, capsys):

+     def test_no_repos_with_additional(self, f_get_build_config, f_test_config, capsys):

          config = self.get_build_config_result()

          additional = {

              'id': 'x',

@@ -0,0 +1,22 @@ 

+ """

+ isolation option for chroot

+ 

+ Revision ID: 8fd7c4714189

+ Revises: d6cbf6cd74da

+ Create Date: 2020-11-27 14:57:55.008281

+ """

+ 

+ import sqlalchemy as sa

+ from alembic import op

+ 

+ 

+ revision = '8fd7c4714189'

+ down_revision = 'd6cbf6cd74da'

+ 

+ 

+ def upgrade():

+     op.add_column('copr_chroot', sa.Column('isolation', sa.Text(), nullable=True))

+ 

+ 

+ def downgrade():

+     op.drop_column('copr_chroot', 'isolation')

@@ -107,7 +107,9 @@ 

          ('simple', 'simple chroot'),

      ]

  

-     if level == 'build':

+     if level == "build":

+         choices.append(("unchanged", "Use project/chroot settings"))

+     elif level == "chroot":

          choices.append(("unchanged", "Use project settings"))

  

      choices.extend(default_choices)
@@ -1327,7 +1329,7 @@ 

  

      bootstrap = create_mock_bootstrap_field("chroot")

      bootstrap_image = create_mock_bootstrap_image_field()

-     isolation = create_isolation_field("build")

+     isolation = create_isolation_field("chroot")

  

      def validate(self, *args, **kwargs):  # pylint: disable=signature-differs

          """ We need to special-case custom_image configuration """

@@ -423,8 +423,8 @@ 

              'chroot': chroot_id,

              'with_opts': chroot.with_opts.split(),

              'without_opts': chroot.without_opts.split(),

-             'isolation': copr.isolation,

          }

+         config_dict.update(chroot.isolation_setup)

          config_dict.update(chroot.bootstrap_setup)

          return config_dict

  
@@ -455,8 +455,6 @@ 

          if build.isolation_set:

              isolation["isolation"] = build.isolation

  

-         if isolation["isolation"] == "default":

-             del isolation['isolation']

          return isolation

  

      @classmethod

@@ -218,7 +218,7 @@ 

      @classmethod

      def add(cls, user, name, selected_chroots, repos=None, description=None,

              instructions=None, check_for_duplicates=False, group=None, persistent=False,

-             auto_prune=True, bootstrap=None, follow_fedora_branching=False,

+             auto_prune=True, bootstrap=None, follow_fedora_branching=False, isolation=None,

              **kwargs):

  

          if not flask.g.user.admin and flask.g.user != user:
@@ -244,6 +244,7 @@ 

                             persistent=persistent,

                             auto_prune=auto_prune,

                             bootstrap=bootstrap,

+                            isolation=isolation,

                             follow_fedora_branching=follow_fedora_branching,

                             **kwargs)

  
@@ -654,7 +655,7 @@ 

      def create_chroot(cls, user, copr, mock_chroot, buildroot_pkgs=None, repos=None, comps=None, comps_name=None,

                        with_opts="", without_opts="",

                        delete_after=None, delete_notify=None, module_toggle="",

-                       bootstrap=None, bootstrap_image=None):

+                       bootstrap=None, bootstrap_image=None, isolation=None):

          """

          :type user: models.User

          :type mock_chroot: models.MockChroot
@@ -670,7 +671,7 @@ 

          chroot = models.CoprChroot(copr=copr, mock_chroot=mock_chroot)

          cls._update_chroot(buildroot_pkgs, repos, comps, comps_name, chroot,

                             with_opts, without_opts, delete_after, delete_notify,

-                            module_toggle, bootstrap, bootstrap_image)

+                            module_toggle, bootstrap, bootstrap_image, isolation)

  

          # reassign old build_chroots, if the chroot is re-created

          get_old = logic.builds_logic.BuildChrootsLogic.by_copr_and_mock_chroot
@@ -682,7 +683,7 @@ 

      @classmethod

      def update_chroot(cls, user, copr_chroot, buildroot_pkgs=None, repos=None, comps=None, comps_name=None,

                        with_opts="", without_opts="", delete_after=None, delete_notify=None, module_toggle="",

-                       bootstrap=None, bootstrap_image=None):

+                       bootstrap=None, bootstrap_image=None, isolation=None):

          """

          :type user: models.User

          :type copr_chroot: models.CoprChroot
@@ -693,13 +694,13 @@ 

  

          cls._update_chroot(buildroot_pkgs, repos, comps, comps_name,

                             copr_chroot, with_opts, without_opts, delete_after, delete_notify, module_toggle,

-                            bootstrap, bootstrap_image)

+                            bootstrap, bootstrap_image, isolation)

          return copr_chroot

  

      @classmethod

      def _update_chroot(cls, buildroot_pkgs, repos, comps, comps_name,

                         copr_chroot, with_opts, without_opts, delete_after, delete_notify, module_toggle,

-                        bootstrap, bootstrap_image):

+                        bootstrap, bootstrap_image, isolation):

          if buildroot_pkgs is not None:

              copr_chroot.buildroot_pkgs = buildroot_pkgs

  
@@ -729,6 +730,9 @@ 

          if bootstrap is not None:

              copr_chroot.bootstrap = bootstrap

  

+         if isolation is not None:

+             copr_chroot.isolation = isolation

+ 

          if bootstrap_image is not None:

              # By CLI/API we can set custom_image, and keep bootstrap unset.  In

              # such case set also bootstrap to correct value.

@@ -1536,6 +1536,8 @@ 

      bootstrap = db.Column(db.Text)

      bootstrap_image = db.Column(db.Text)

  

+     isolation = db.Column(db.Text, default="unchanged")

+ 

      def update_comps(self, comps_xml):

          if isinstance(comps_xml, str):

              data = comps_xml.encode("utf-8")
@@ -1646,6 +1648,17 @@ 

              return {}

          return settings

  

+     @property

+     def isolation_setup(self):

+         """ Is isolation config from project overwritten by chroot? """

+         settings = {'isolation': self.copr.isolation}

+         if self.isolation and self.isolation != 'unchanged':

+             settings['isolation'] = self.isolation

+         if settings['isolation'] in [None, "default"]:

+             return {}

+         return settings

+ 

+ 

  class BuildChroot(db.Model, helpers.Serializer):

      """

      Representation of Build<->MockChroot relation

@@ -59,6 +59,8 @@ 

  

      {{ render_bootstrap_options(form) }}

  

+     {{ render_field(form.isolation, placeholder='unchanged') }}

+ 

      <div class="form-group">

        <label class="col-sm-2 control-label" for="textInput-markup">

          comps.xml

@@ -272,6 +272,7 @@ 

      if not flask.g.user.can_build_in(copr):

          raise AccessRestricted("User {} is not allowed to build in the copr: {}"

                                 .format(flask.g.user.username, copr.full_name))

+     form.isolation.data = "unchanged" if form.isolation.data is None else form.isolation.data

  

      generic_build_options = {

          'chroot_names': form.selected_chroots,

@@ -20,6 +20,7 @@ 

          "with_opts": str_to_list(project_chroot.with_opts),

          "without_opts": str_to_list(project_chroot.without_opts),

          "delete_after_days": project_chroot.delete_after_days,

+         "isolation": project_chroot.isolation,

      }

  

  
@@ -33,6 +34,7 @@ 

          "enable_net": project_chroot.copr.enable_net,

          "with_opts":  str_to_list(project_chroot.with_opts),

          "without_opts": str_to_list(project_chroot.without_opts),

+         "isolation": project_chroot.isolation,

      }

      for option in ['bootstrap', 'bootstrap_image']:

          if option in config:
@@ -106,6 +108,7 @@ 

          flask.g.user, chroot, buildroot_pkgs, repos, comps=comps_xml, comps_name=comps_name,

          with_opts=with_opts, without_opts=without_opts,

          bootstrap=form.bootstrap.data,

-         bootstrap_image=form.bootstrap_image.data)

+         bootstrap_image=form.bootstrap_image.data,

+         isolation=form.isolation.data)

      db.session.commit()

      return flask.jsonify(to_dict(chroot))

@@ -25,7 +25,8 @@ 

                              module_toggle=chroot.module_toggle, with_opts=chroot.with_opts,

                              without_opts=chroot.without_opts,

                              bootstrap=chroot.bootstrap,

-                             bootstrap_image=chroot.bootstrap_image)

+                             bootstrap_image=chroot.bootstrap_image,

+                             isolation=chroot.isolation)

      return render_chroot_edit(form, copr, chroot)

  

  
@@ -79,6 +80,7 @@ 

                  module_toggle=form.module_toggle.data,

                  bootstrap=form.bootstrap.data,

                  bootstrap_image=form.bootstrap_image.data,

+                 isolation=form.isolation.data,

              )

  

          elif action == "delete_comps":

@@ -42,7 +42,7 @@ 

          raise NotImplementedError

  

      def edit_chroot(self, project, chroot, bootstrap=None,

-                     bootstrap_image=None, owner=None):

+                     bootstrap_image=None, owner=None, isolation=None):

          """ Modify CoprChroot """

          raise NotImplementedError

  
@@ -84,7 +84,7 @@ 

          return resp

  

      def edit_chroot(self, project, chroot, bootstrap=None,

-                     bootstrap_image=None, owner=None):

+                     bootstrap_image=None, owner=None, isolation=None):

          """ Change CoprChroot using the web-UI """

          route = "/coprs/{user}/{project}/update_chroot/{chroot}/".format(

              user=owner or self.transaction_username,
@@ -100,6 +100,8 @@ 

              data["bootstrap"] = bootstrap

          if bootstrap_image is not None:

              data["bootstrap_image"] = bootstrap_image

+         if isolation is not None:

+             data["isolation"] = isolation

  

          resp = self.client.post(route, data=data)

          if self.success_expected:
@@ -204,7 +206,7 @@ 

          return resp

  

      def edit_chroot(self, project, chroot, bootstrap=None,

-                     bootstrap_image=None, owner=None):

+                     bootstrap_image=None, owner=None, isolation=None):

          route = "/api_3/project-chroot/edit/{owner}/{project}/{chroot}".format(

              owner=owner or self.transaction_username,

              project=project,
@@ -215,6 +217,8 @@ 

              data["bootstrap"] = bootstrap

          if bootstrap_image is not None:

              data["bootstrap_image"] = bootstrap_image

+         if isolation is not None:

+             data["isolation"] = isolation

          resp = self.post(route, data)

          return resp

  

@@ -145,7 +145,7 @@ 

          timeout = buildopts.get("timeout")

          if timeout:

              assert build.timeout == timeout

-         assert build.isolation == "default"

+         assert build.isolation == "unchanged"

  

      @pytest.mark.usefixtures("f_users", "f_users_api", "f_coprs",

                               "f_mock_chroots", "f_other_distgit", "f_db")

@@ -22,18 +22,38 @@ 

          route = "/coprs/{}/{}/edit_chroot/{}/".format(

              self.transaction_username, project, chroot,

          )

-         def get_selected(html):

+         def get_selected(html, element_id):

              soup = BeautifulSoup(html, "html.parser")

-             return (soup.find("select", id="bootstrap")

+             return (soup.find("select", id=element_id)

                      .find("option", attrs={'selected': True}))

  

          resp = self.test_client.get(route)

-         assert get_selected(resp.data) is None

+         assert get_selected(resp.data, "bootstrap") is None

  

          self.web_ui.edit_chroot("test", chroot, bootstrap="on")

  

          resp = self.test_client.get(route)

-         assert get_selected(resp.data)["value"] == "on"

+         assert get_selected(resp.data, "bootstrap")["value"] == "on"

+         assert get_selected(resp.data, "isolation")["value"] == "unchanged"

+ 

+         self.web_ui.edit_chroot("test", chroot, isolation="simple")

+ 

+         resp = self.test_client.get(route)

+         assert get_selected(resp.data, "isolation")["value"] == "simple"

+ 

+     @TransactionDecorator("u1")

+     @pytest.mark.usefixtures("f_users", "f_users_api", "f_mock_chroots", "f_db")

+     def test_v3_edit_chroot(self):

+         chroot = "fedora-rawhide-i386"

+         project = "test"

+         self.api3.new_project(project, [chroot])

+ 

+         r = self.api3.edit_chroot(project, chroot, isolation="nspawn")

+         assert r.status_code == 200

+ 

+         copr = self.models.Copr.query.first()

+         for chroot in copr.active_copr_chroots:

+             assert chroot.isolation == "nspawn"

  

      @TransactionDecorator("u2")

      @pytest.mark.usefixtures("f_users", "f_users_api", "f_mock_chroots", "f_db")

@@ -85,12 +85,43 @@ 

      "build": "default",

      "expected": "default",

  }, {

+     "project": "default",

+     "chroot": "fedora-rawhide-i386",

+     "build": "unchanged",

+     "expected": "default",

+ }, {

      "project": "nspawn",

      "chroot": "fedora-rawhide-i386",

      "build": "simple",

      "expected": "simple",

  }]

  

+ VALID_ISOLATION_CONFIG_CASES_CHROOT = [{

+     "project": None,

+     "chroot": "fedora-rawhide-i386",

+     "build": "default",

+     "chroot_isolation": "simple",

+     "expected": "default",

+ }, {

+     "project": "simple",

+     "chroot": "fedora-rawhide-i386",

+     "build": "unchanged",

+     "chroot_isolation": "unchanged",

+     "expected": "simple",

+ }, {

+     "project": "default",

+     "chroot": "fedora-rawhide-i386",

+     "build": "unchanged",

+     "chroot_isolation": "unchanged",

+     "expected": "default",

+ }, {

+     "project": "nspawn",

+     "chroot": "fedora-rawhide-i386",

+     "build": "unchanged",

+     "chroot_isolation": "default",

+     "expected": "default",

+ }]

+ 

  

  class TestConfigOverrides(CoprsTestCase):

  
@@ -157,6 +188,7 @@ 

      @pytest.mark.parametrize("request_type", ["api", "webui"])

      @pytest.mark.parametrize("case", VALID_ISOLATION_CONFIG_CASES)

      def test_isolation_override(self, case, request_type):

+         """Override project configuration by build configuration."""

          client = self.api3 if request_type == "api" else self.web_ui

          client.new_project("test-isolation", [case["chroot"]],

                             isolation=case["project"])
@@ -167,18 +199,7 @@ 

          else:

              assert project.isolation == "default"

  

-         # create package so we can assign the build to that

-         client.create_distgit_package("test-isolation", "tar")

-         client.submit_url_build("test-isolation",

-                                 build_options={

-                                     "chroots": [case["chroot"]],

-                                     "isolation": case["build"]})

- 

-         # Assign Package to Build, so we can query the build configs

-         build = models.Build.query.one()

-         build.package = models.Package.query.one()

-         self.db.session.add(build)

-         self.db.session.commit()

+         self.create_build(case, client)

  

          isolation = case["expected"]

          response = self.test_client.get("/backend/get-build-task/1-{}".format(case["chroot"]))
@@ -188,3 +209,41 @@ 

          if not isolation:

              assert "isolation" not in result_dict

          assert result_dict.get("isolation") == isolation

+ 

+     @TransactionDecorator("u1")

+     @pytest.mark.usefixtures("f_users", "f_users_api", "f_mock_chroots", "f_db")

+     @pytest.mark.parametrize("request_type", ["api", "webui"])

+     @pytest.mark.parametrize("case", VALID_ISOLATION_CONFIG_CASES_CHROOT)

+     def test_isolation_override_by_chroot(self, case, request_type):

+         client = self.api3 if request_type == "api" else self.web_ui

+         client.new_project("test-isolation", [case["chroot"]],

+                            isolation=case["project"])

+         project = models.Copr.query.one()

+ 

+         if case["project"]:

+             assert project.isolation == case["project"]

+         else:

+             assert project.isolation == "default"

+ 

+         client.edit_chroot("test-isolation", case["chroot"], isolation=case["chroot_isolation"])

+         self.create_build(case, client)

+ 

+         isolation = case["expected"]

+         response = self.test_client.get("/backend/get-build-task/1-{}".format(case["chroot"]))

+         result_dict = json.loads(response.data)

+         assert result_dict.get("isolation") == isolation

+ 

+     def create_build(self, case, client):

+         """Creates a new build

+         :param case: Dictionary with cases.

+         :param client: An instance of the API3Requests class or WebUIRequests class.

+         """

+         client.create_distgit_package("test-isolation", "tar")

+         client.submit_url_build("test-isolation",

+                                 build_options={

+                                     "chroots": [case["chroot"]],

+                                     "isolation": case["build"]})

+         build = models.Build.query.one()

+         build.package = models.Package.query.one()

+         self.db.session.add(build)

+         self.db.session.commit()

@@ -50,7 +50,7 @@ 

      # pylint: disable=too-many-arguments

      def edit(self, ownername, projectname, chrootname, additional_packages=None, additional_repos=None,

               comps=None, delete_comps=False, with_opts=None, without_opts=None,

-              bootstrap=None, bootstrap_image=None):

+              bootstrap=None, bootstrap_image=None, isolation=None):

          """

          Edit a chroot configuration in a project

  
@@ -66,6 +66,8 @@ 

          :param str bootstrap: Allowed values 'on', 'off', 'image', 'default',

                                'untouched' (equivalent to None)

          :param str bootstrap_image: Implies 'bootstrap=image'.

+         :param str isolation: Mock isolation feature setup.

+             Possible values are 'default', 'simple', 'nspawn'.

          :return: Munch

          """

          endpoint = "/project-chroot/edit/{ownername}/{projectname}/{chrootname}"
@@ -86,6 +88,7 @@ 

              "without_opts": without_opts,

              "bootstrap": bootstrap,

              "bootstrap_image": bootstrap_image,

+             "isolation": isolation,

          }

          files = {}

          if comps:

no initial comment

Metadata Update from @schlupov:
- Pull-request tagged with: needs-tests

3 years ago

rebased onto c68b29b173514c0a181096729cf975a1c380067a

3 years ago

rebased onto 6218a62ed4242404de3daa2b7b401c75f4dbee1c

3 years ago

rebased onto ef0f655938e311b9cef95f21937131fd2b8b187f

3 years ago

rebased onto b92325f2ac8a570e5f4f2eb23c105a2999498404

3 years ago

rebased onto 68c128b220e84bbeff84f2bc8c9208201b12c992

3 years ago

Metadata Update from @schlupov:
- Pull-request untagged with: needs-tests

3 years ago

Please rebase on top of master, to see the green CI flags.

We should test also the case with "default" in "project" (ditto for VALID_ISOLATION_CONFIG_CASES).

I don't think you want to rewrite the value in case dict at this point. That changes the whole input and we no more test the None value but "unchanged".

Is otherwise a very nice contribution, thank you! Except for the small details in the testsuite it looks good to me.

rebased onto ae3f93e1db1f92ea03b2bb8f10a51fed28270066

3 years ago

The testsuite still fails, and the pylint warning for frontend is valid.

rebased onto 1cd27f4339da62d83ae9689d9de63f3d290c69a2

3 years ago

rebased onto 21eeb698d1cbbc04b37c211e6d66946bbfa59ec9

3 years ago

rebased onto 51c170af7a3f04f1491be00e6ce190b1b15583a7

3 years ago

rebased onto 78491fc

3 years ago

Pull-Request has been merged by schlupov

3 years ago
Metadata
Flags
jenkins
failure
Build #761 failed (commit: 78491fcb)
3 years ago
Copr build
success (100%)
#1830781
3 years ago
Copr build
success (100%)
#1830780
3 years ago
Copr build
success (100%)
#1830779
3 years ago
jenkins
failure
Build #759 failed (commit: 51c170af)
3 years ago
Copr build
success (100%)
#1830763
3 years ago
Copr build
success (100%)
#1830762
3 years ago
Copr build
pending (50%)
#1830761
3 years ago
jenkins
failure
Build #758 failed (commit: 21eeb698)
3 years ago
Copr build
success (100%)
#1830684
3 years ago
Copr build
success (100%)
#1830683
3 years ago
Copr build
success (100%)
#1830682
3 years ago
jenkins
failure
Build #757 failed (commit: 1cd27f43)
3 years ago
Copr build
success (100%)
#1830605
3 years ago
Copr build
success (100%)
#1830604
3 years ago
Copr build
success (100%)
#1830603
3 years ago
jenkins
failure
Build #746 failed (commit: ae3f93e1)
3 years ago
Copr build
failure
#1827203
3 years ago
Copr build
success (100%)
#1827202
3 years ago
Copr build
failure
#1827201
3 years ago
jenkins
failure
Build #723 failed (commit: 68c128b2)
3 years ago
Copr build
failure
#1815699
3 years ago
Copr build
success (100%)
#1815698
3 years ago
Copr build
failure
#1815697
3 years ago
jenkins
failure
Build #719 failed (commit: b92325f2)
3 years ago
Copr build
success (100%)
#1808256
3 years ago
Copr build
success (100%)
#1808255
3 years ago
Copr build
success (100%)
#1808254
3 years ago
jenkins
failure
Build #702 failed (commit: ef0f6559)
3 years ago
Copr build
success (100%)
#1806204
3 years ago
Copr build
success (100%)
#1806203
3 years ago
Copr build
failure
#1806202
3 years ago
jenkins
failure
Build #701 failed (commit: 6218a62e)
3 years ago
Copr build
success (100%)
#1806118
3 years ago
Copr build
success (100%)
#1806117
3 years ago
Copr build
failure
#1806116
3 years ago
jenkins
failure
Build #700 failed (commit: c68b29b1)
3 years ago
Copr build
failure
#1800060
3 years ago
Copr build
success (100%)
#1800059
3 years ago
Copr build
failure
#1800058
3 years ago
jenkins
failure
Build #699 failed (commit: d481ef4c)
3 years ago
Copr build
failure
#1797668
3 years ago
Copr build
success (100%)
#1797667
3 years ago
Copr build
failure
#1797666
3 years ago