blob: 15639bd81177cf6074999c5acd7bef3e36945430 [file]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
from cli_test_utils import CLITestBase
from apache_polaris.cli.command.principals import PrincipalsCommand
from apache_polaris.cli.constants import Subcommands
from apache_polaris.sdk.management import (
Principal,
PrincipalWithCredentials,
PrincipalWithCredentialsCredentials,
)
from pydantic import SecretStr
class TestPrincipalsCommand(CLITestBase):
def test_principal_input_normalization(self) -> None:
cmd = PrincipalsCommand(
principals_subcommand=Subcommands.CREATE,
properties=None,
set_properties=None,
principal_role=None,
)
# __post_init__ should not normalized these
self.assertIsNone(cmd.principal_role)
# __post_init__ should normalized these
self.assertEqual(cmd.properties, {})
self.assertEqual(cmd.set_properties, {})
def test_principal_create(self) -> None:
mock_client = self.build_mock_client()
mock_client.create_principal.return_value = PrincipalWithCredentials(
principal=Principal(
name="foo", type="SERVICE", properties={"key": "value"}
),
credentials=PrincipalWithCredentialsCredentials(
client_id="test-client-id",
client_secret=SecretStr("test-client-secret"),
),
)
self.mock_execute(
mock_client, ["principals", "create", "foo", "--property", "key=value"]
)
call_args = mock_client.create_principal.call_args[0][0]
self.assertEqual(call_args.principal.name, "foo")
self.assertEqual(call_args.principal.client_id, None)
self.assertEqual(call_args.principal.properties, {"key": "value"})
def test_principal_list(self) -> None:
mock_client = self.build_mock_client()
self.mock_execute(mock_client, ["principals", "list"])
mock_client.list_principals.assert_called_once()
def test_principal_get(self) -> None:
mock_client = self.build_mock_client()
self.mock_execute(mock_client, ["principals", "get", "foo"])
call_args = mock_client.get_principal.call_args[0][0]
self.assertEqual(call_args, "foo")
def test_principal_delete(self) -> None:
mock_client = self.build_mock_client()
self.mock_execute(mock_client, ["principals", "delete", "foo"])
call_args = mock_client.delete_principal.call_args[0][0]
self.assertEqual(call_args, "foo")
def test_principal_update(self) -> None:
mock_client = self.build_mock_client()
mock_client.get_principal.return_value = Principal(
name="foo", type="SERVICE", properties={"key": "value"}, entity_version=1
)
self.mock_execute(
mock_client, ["principals", "update", "foo", "--set-property", "key=value"]
)
call_args = mock_client.update_principal.call_args[0][0]
self.assertEqual(call_args, "foo")
self.mock_execute(
mock_client, ["principals", "update", "foo", "--remove-property", "key"]
)
call_args = mock_client.update_principal.call_args[0][0]
self.assertEqual(call_args, "foo")
def test_principal_rotate_credentials(self) -> None:
mock_client = self.build_mock_client()
mock_client.rotate_credentials.return_value = PrincipalWithCredentials(
principal=Principal(
name="foo", type="SERVICE", properties={"key": "value"}
),
credentials=PrincipalWithCredentialsCredentials(
client_id="test-client-id",
client_secret=SecretStr("test-client-secret"),
),
)
self.mock_execute(mock_client, ["principals", "rotate-credentials", "foo"])
call_args = mock_client.rotate_credentials.call_args[0][0]
self.assertEqual(call_args, "foo")
def test_principal_reset(self) -> None:
mock_client = self.build_mock_client()
mock_client.reset_credentials.return_value = PrincipalWithCredentials(
principal=Principal(
name="foo", type="SERVICE", properties={"key": "value"}
),
credentials=PrincipalWithCredentialsCredentials(
client_id="test-client-id",
client_secret=SecretStr("test-client-secret"),
),
)
self.mock_execute(
mock_client,
[
"principals",
"reset",
"test",
"--new-client-id",
"e469c048cf866df1",
"--new-client-secret",
"e469c048cf866dfae469c048cf866df1",
],
)
call_args = mock_client.reset_credentials.call_args[0]
self.assertEqual(call_args[0], "test")
self.assertEqual(call_args[1].client_id, "e469c048cf866df1")
self.assertEqual(call_args[1].client_secret, "e469c048cf866dfae469c048cf866df1")
self.mock_execute(mock_client, ["principals", "reset", "test"])
call_args = mock_client.reset_credentials.call_args[0]
self.assertEqual(call_args[0], "test")
self.assertEqual(call_args[1], None)
self.mock_execute(
mock_client,
["principals", "reset", "test", "--new-client-id", "e469c048cf866df1"],
)
call_args = mock_client.reset_credentials.call_args[0]
self.assertEqual(call_args[0], "test")
self.assertEqual(call_args[1].client_id, "e469c048cf866df1")
self.assertEqual(call_args[1].client_secret, None)
self.mock_execute(
mock_client,
[
"principals",
"reset",
"test",
"--new-client-secret",
"e469c048cf866dfae469c048cf866df1",
],
)
call_args = mock_client.reset_credentials.call_args[0]
self.assertEqual(call_args[0], "test")
self.assertEqual(call_args[1].client_id, None)
self.assertEqual(call_args[1].client_secret, "e469c048cf866dfae469c048cf866df1")
def test_principal_access(self) -> None:
mock_client = self.build_mock_client()
mock_client.get_principal.return_value = Principal(
name="foo", type="SERVICE", properties={"key": "value"}, entity_version=1
)
mock_client.list_principal_roles_assigned.return_values.roles = []
mock_client.list_catalogs.return_values.catalogs = []
self.mock_execute(mock_client, ["principals", "access", "foo"])
mock_client.get_principal.assert_called_with("foo")
mock_client.list_principal_roles_assigned.assert_called_with("foo")
def test_principal_summarize(self) -> None:
mock_client = self.build_mock_client()
mock_client.get_principal.return_value = Principal(
name="foo", type="SERVICE", properties={"key": "value"}, entity_version=1
)
mock_client.list_principal_roles_assigned.return_values.roles = []
mock_client.list_catalogs.return_values.catalogs = []
self.mock_execute(mock_client, ["principals", "summarize", "foo"])
mock_client.get_principal.assert_called_with("foo")
mock_client.list_principal_roles_assigned.assert_called_with("foo")