Beispiel #1
0
    def test_version_file(self, tmp_path: Path) -> None:
        """Test version_file."""
        mod_path = tmp_path / "mod"
        overlay_path = mod_path / "overlay"
        overlay_path.mkdir(parents=True)
        obj = KBEnvManager(mod_path)

        # no version file
        assert not obj.version_file
        del obj.version_file

        # version file in parent dir
        expected = tmp_path / KB_VERSION_FILENAME
        expected.touch()
        assert obj.version_file == expected
        del obj.version_file

        # version file in module dir
        expected = mod_path / KB_VERSION_FILENAME
        expected.touch()
        assert obj.version_file == expected
        del obj.version_file

        # version file in overlay dir
        expected = overlay_path / KB_VERSION_FILENAME
        expected.touch()
        assert obj.version_file == mod_path / KB_VERSION_FILENAME
        assert (KBEnvManager(
            mod_path, overlay_path=overlay_path).version_file == expected)
Beispiel #2
0
    def run_kubectl(self, command='plan'):
        """Run kubectl."""
        kustomize_config_path = os.path.join(
            self.path, 'overlays',
            get_overlay_dir(os.path.join(self.path, 'overlays'),
                            self.context.env_name, self.context.env_region))
        response = generate_response(kustomize_config_path, self.path,
                                     self.context.env_name,
                                     self.context.env_region)
        if response['skipped_configs']:
            return response

        module_defined_k8s_ver = get_module_defined_k8s_ver(
            self.options.get('options', {}).get('kubectl_version', {}),
            self.context.env_name)
        if module_defined_k8s_ver:
            k8s_bin = KBEnvManager(self.path).install(module_defined_k8s_ver)
        elif os.path.isfile(
                os.path.join(kustomize_config_path, '.kubectl-version')):
            k8s_bin = KBEnvManager(kustomize_config_path).install()
        elif os.path.isfile(os.path.join(self.path, '.kubectl-version')):
            k8s_bin = KBEnvManager(self.path).install()
        elif os.path.isfile(
                os.path.join(self.context.env_root, '.kubectl-version')):
            k8s_bin = KBEnvManager(self.context.env_root).install()
        else:
            if not which('kubectl'):
                LOGGER.error('kubectl not available (a '
                             '".kubectl-version" file is not present '
                             'and "kubectl" not found in path). Fix '
                             'this by writing a desired kubectl version '
                             'to your module\'s .kubectl-version file '
                             'or installing kubectl.')
                sys.exit(1)
            k8s_bin = 'kubectl'

        kustomize_cmd = [k8s_bin, 'kustomize', kustomize_config_path]
        kustomize_yml = subprocess.check_output(kustomize_cmd,
                                                env=self.context.env_vars)
        if isinstance(kustomize_yml, bytes):  # python3 returns encoded bytes
            kustomize_yml = kustomize_yml.decode()
        if command == 'plan':
            LOGGER.info(
                'The following yaml was generated by '
                'kubectl:\n\n%s', kustomize_yml)
        else:
            LOGGER.debug(
                'The following yaml was generated by '
                'kubectl:\n\n%s', kustomize_yml)
        if command in ['apply', 'delete']:
            kubectl_command = [k8s_bin, command]
            if command == 'delete':
                kubectl_command.append('--ignore-not-found=true')
            kubectl_command.extend(['-k', kustomize_config_path])

            LOGGER.info('Running kubectl %s ("%s")...', command,
                        ' '.join(kubectl_command))
            run_module_command(kubectl_command, self.context.env_vars)
        return response
Beispiel #3
0
 def test_set_version_same(self, mocker: MockerFixture,
                           tmp_path: Path) -> None:
     """Test set_version same."""
     version = mocker.patch.object(KBEnvManager, "version")
     obj = KBEnvManager(tmp_path)
     obj.current_version = "v1.22.0"
     assert not obj.set_version("v1.22.0")
     assert obj.current_version == "v1.22.0"
     assert obj.version == version
Beispiel #4
0
 def test_parse_version_string_raise_value_error(self) -> None:
     """Test parse_version_string."""
     with pytest.raises(
             ValueError,
             match=re.escape(
                 f"provided version doesn't conform to regex: {KBEnvManager.VERSION_REGEX}"
             ),
     ):
         KBEnvManager.parse_version_string("0.15")
Beispiel #5
0
 def test_set_version(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test set_version."""
     version = VersionTuple(1, 22, 0)
     mocker.patch.object(KBEnvManager,
                         "get_version_from_file",
                         return_value=None)
     obj = KBEnvManager(tmp_path)
     assert not obj.current_version
     assert not obj.set_version(str(version))
     assert obj.version == version
     assert obj.current_version == str(version)
Beispiel #6
0
    def test_get_version_from_file(self, tmp_path: Path) -> None:
        """Test get_version_from_file."""
        obj = KBEnvManager(tmp_path)

        # no version file or path
        assert not obj.get_version_from_file()

        # path not provided; use version file
        version_file = tmp_path / KB_VERSION_FILENAME
        version_file.write_text("v1.22.0")
        assert obj.get_version_from_file(version_file) == "v1.22.0"
Beispiel #7
0
 def test_version(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version."""
     get_version_from_file = mocker.patch.object(KBEnvManager,
                                                 "get_version_from_file")
     parse_version_string = mocker.patch.object(KBEnvManager,
                                                "parse_version_string",
                                                return_value="success")
     obj = KBEnvManager(tmp_path)
     obj.current_version = "version"
     assert obj.version == "success"
     get_version_from_file.assert_not_called()
     parse_version_string.assert_called_once_with("version")
Beispiel #8
0
 def execute(self):
     """Execute kbenv."""
     if self._cli_arguments.get('install'):
         if self._cli_arguments.get('<kbenv-args>'):
             KBEnvManager().install(self._cli_arguments.get('<kbenv-args>')[0])
         else:
             KBEnvManager().install()
     elif self._cli_arguments.get('run'):
         cmd_line_args = strip_leading_option_delim(
             self._cli_arguments.get('<kbenv-args>', [])
         )
         kb_bin = KBEnvManager().install()
         sys.exit(subprocess.call([kb_bin] + cmd_line_args))
Beispiel #9
0
 def test_version_none(self, mocker: MockerFixture, tmp_path: Path) -> None:
     """Test version."""
     get_version_from_file = mocker.patch.object(KBEnvManager,
                                                 "get_version_from_file",
                                                 return_value=None)
     parse_version_string = mocker.patch.object(KBEnvManager,
                                                "parse_version_string")
     obj = KBEnvManager(tmp_path)
     assert not obj.version
     get_version_from_file.assert_called_once_with()
     parse_version_string.assert_not_called()
Beispiel #10
0
 def test_parse_version_string(self, provided: str,
                               expected: Optional[VersionTuple]) -> None:
     """Test parse_version_string."""
     assert KBEnvManager.parse_version_string(provided) == expected