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)
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
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
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")
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)
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"
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")
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))
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()
def test_parse_version_string(self, provided: str, expected: Optional[VersionTuple]) -> None: """Test parse_version_string.""" assert KBEnvManager.parse_version_string(provided) == expected