def test_interactive_retry_cancel(context: CfnginContext) -> None: """Test interactive retry cancel.""" lines = ["garbage", "cancel"] with mock_input(lines) as _input: result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) assert _input.call_count == 2 assert result == {}
def test_param_validation(provider, context): """Test param validation.""" result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME, ssm_parameter_name='test', public_key_path='test') assert result is False
def test_interactive_non_terminal_input(provider, context): """Test interactive non terminal input.""" with mock_input(isatty=False) as _input: result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) _input.assert_not_called() assert result is False
def test_import_bad_key_data(tmp_path: Path, context: CfnginContext) -> None: """Test import bad key data.""" pub_key = tmp_path / "id_rsa.pub" pub_key.write_text("garbage") result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME, public_key_path=str(pub_key)) assert result == {}
def test_param_validation(context: CfnginContext) -> None: """Test param validation.""" result = ensure_keypair_exists( context, keypair=KEY_PAIR_NAME, ssm_parameter_name="test", public_key_path="test", ) assert result == {}
def test_keypair_exists(provider, context): """Test keypair exists.""" ec2 = boto3.client('ec2') keypair = ec2.create_key_pair(KeyName=KEY_PAIR_NAME) result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) expected = dict(status='exists', key_name=KEY_PAIR_NAME, fingerprint=keypair['KeyFingerprint']) assert result == expected
def test_interactive_retry_cancel(provider, context): """Test interactive retry cancel.""" lines = ['garbage', 'cancel'] with mock_input(lines) as _input: result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) assert _input.call_count == 2 assert result is False
def test_import_bad_key_data(tmpdir, provider, context): """Test import bad key data.""" pub_key = tmpdir.join("id_rsa.pub") pub_key.write('garbage') result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME, public_key_path=str(pub_key)) assert result is False
def test_interactive_create_bad_dir(tmp_path: Path, context: CfnginContext) -> None: """Test interactive create bad dir.""" key_dir = tmp_path / "missing" lines = ["create", str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) assert result == {}
def test_keypair_exists(context: CfnginContext) -> None: """Test keypair exists.""" ec2 = boto3.client("ec2") keypair = ec2.create_key_pair(KeyName=KEY_PAIR_NAME) result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) expected = dict( # type: ignore status="exists", key_name=KEY_PAIR_NAME, fingerprint=keypair["KeyFingerprint"]) assert result == expected
def test_interactive_create_bad_dir(tmpdir, provider, context): """Test interactive create bad dir.""" key_dir = tmpdir.join('missing') lines = ['create', str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) assert result is False
def test_import_file(tmpdir, provider, context, ssh_key): """Test import file.""" pub_key = tmpdir.join("id_rsa.pub") pub_key.write(ssh_key.public_key) result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME, public_key_path=str(pub_key)) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result['status'] == 'imported'
def test_import_file(tmp_path: Path, context: CfnginContext, ssh_key: SSHKey) -> None: """Test import file.""" pub_key = tmp_path / "id_rsa.pub" pub_key.write_bytes(ssh_key.public_key) result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME, public_key_path=str(pub_key)) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result["status"] == "imported"
def test_interactive_import(tmp_path: Path, context: CfnginContext, ssh_key: SSHKey) -> None: """.""" key_file = tmp_path / "id_rsa.pub" key_file.write_bytes(ssh_key.public_key) lines = ["import", str(key_file)] with mock_input(lines): result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result["status"] == "imported"
def test_interactive_create_existing_file(tmp_path: Path, context: CfnginContext) -> None: """Test interactive create existing file.""" key_dir = tmp_path / "keys" key_dir.mkdir(exist_ok=True, parents=True) key_file = key_dir / f"{KEY_PAIR_NAME}.pem" key_file.touch() lines = ["create", str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) assert result == {}
def test_interactive_import(tmpdir, provider, context, ssh_key): """.""" key_file = tmpdir.join("id_rsa.pub") key_file.write(ssh_key.public_key) lines = ['import', str(key_file)] with mock_input(lines): result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result['status'] == 'imported'
def test_interactive_create_existing_file(tmpdir, provider, context): """Test interactive create existing file.""" key_dir = tmpdir.join('keys') key_dir.ensure_dir() key_file = key_dir.join('{}.pem'.format(KEY_PAIR_NAME)) key_file.ensure() lines = ['create', str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) assert result is False
def test_interactive_create(tmp_path: Path, context: CfnginContext, ssh_key: SSHKey) -> None: """Test interactive create.""" key_dir = tmp_path / "keys" key_dir.mkdir(parents=True, exist_ok=True) key_file = key_dir / f"{KEY_PAIR_NAME}.pem" lines = ["create", str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result["status"] == "created" assert key_file.samefile(result["file_path"]) assert key_file.read_bytes() == ssh_key.private_key
def test_interactive_create(tmpdir, provider, context, ssh_key): """Test interactive create.""" key_dir = tmpdir.join('keys') key_dir.ensure_dir() key_file = key_dir.join('{}.pem'.format(KEY_PAIR_NAME)) lines = ['create', str(key_dir)] with mock_input(lines): result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result['status'] == 'created' assert key_file.samefile(result['file_path']) assert key_file.read_binary() == ssh_key.private_key
def test_create_in_ssm(provider, context, ssh_key, ssm_key_id): """Test create in ssm.""" result = ensure_keypair_exists(provider, context, keypair=KEY_PAIR_NAME, ssm_parameter_name='param', ssm_key_id=ssm_key_id) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result['status'] == 'created' ssm = boto3.client('ssm') param = ssm.get_parameter(Name='param', WithDecryption=True)['Parameter'] assert param['Value'] == ssh_key.private_key.decode('ascii') assert param['Type'] == 'SecureString' params = ssm.describe_parameters()['Parameters'] param_details = next(p for p in params if p['Name'] == 'param') assert param_details['Description'] == \ 'SSH private key for KeyPair "{}" (generated by Runway)'.format( KEY_PAIR_NAME) assert param_details.get('KeyId') == ssm_key_id
def test_create_in_ssm(context: CfnginContext, ssh_key: SSHKey, ssm_key_id: str) -> None: """Test create in ssm.""" result = ensure_keypair_exists( context, keypair=KEY_PAIR_NAME, ssm_parameter_name="param", ssm_key_id=ssm_key_id, ) assert_key_present(result, KEY_PAIR_NAME, ssh_key.fingerprint) assert result["status"] == "created" ssm = boto3.client("ssm") param = ssm.get_parameter(Name="param", WithDecryption=True)["Parameter"] assert param["Value"] == ssh_key.private_key.decode("ascii") assert param["Type"] == "SecureString" params = ssm.describe_parameters()["Parameters"] param_details = next(p for p in params if p["Name"] == "param") assert param_details[ "Description"] == 'SSH private key for KeyPair "{}" (generated by Runway)'.format( KEY_PAIR_NAME) assert param_details.get("KeyId") == ssm_key_id
def test_interactive_non_terminal_input(context: CfnginContext) -> None: """Test interactive non terminal input.""" with mock_input(isatty=False) as _input: result = ensure_keypair_exists(context, keypair=KEY_PAIR_NAME) _input.assert_not_called() assert result == {}