diff options
8 files changed, 279 insertions, 32 deletions
diff --git a/moon_manager/tests/unit_python/api/test_data.py b/moon_manager/tests/unit_python/api/test_data.py new file mode 100644 index 00000000..87a80c69 --- /dev/null +++ b/moon_manager/tests/unit_python/api/test_data.py @@ -0,0 +1,168 @@ +import api.utilities as utilities +import json + + +# subject_categories_test + + +def get_subject_data(client, policy_id): + req = client.get("/policies/{}/subject_data".format(policy_id)) + subject_data = utilities.get_json(req.data) + return req, subject_data + + +def add_subject_data(client, name, policy_id, category_id): + data = { + "name": name, + "description": "description of {}".format(name) + } + req = client.post("/policies/{}/subject_data/{}".format(policy_id, category_id), data=json.dumps(data), + headers={'Content-Type': 'application/json'}) + subject_data = utilities.get_json(req.data) + return req, subject_data + + +def delete_subject_data(client, policy_id): + req = client.delete("/policies/{}/subject_data".format(policy_id)) + return req + + +def test_get_subject_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, subject_data = get_subject_data(client, policy_id) + assert req.status_code == 200 + assert isinstance(subject_data, dict) + assert "subject_data" in subject_data + + +def test_add_subject_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, subject_data = add_subject_data(client, "testuser", policy_id, "111") + assert req.status_code == 200 + assert isinstance(subject_data, dict) + value = subject_data["subject_data"]['data'] + assert "subject_data" in subject_data + id = list(value.keys())[0] + assert value[id]['name'] == "testuser" + assert value[id]['description'] == "description of {}".format("testuser") + + +def test_delete_subject_data(): + client = utilities.register_client() + policy_id = utilities.get_policy_id() + success_req = delete_subject_data(client, policy_id) + assert success_req.status_code == 200 + +# --------------------------------------------------------------------------- + +# object_categories_test + + +def get_object_data(client, policy_id): + req = client.get("/policies/{}/object_data".format(policy_id)) + object_data = utilities.get_json(req.data) + return req, object_data + + +def add_object_data(client, name, policy_id, category_id): + data = { + "name": name, + "description": "description of {}".format(name) + } + req = client.post("/policies/{}/object_data/{}".format(policy_id, category_id), data=json.dumps(data), + headers={'Content-Type': 'application/json'}) + object_data = utilities.get_json(req.data) + return req, object_data + + +def delete_object_data(client, policy_id): + req = client.delete("/policies/{}/object_data".format(policy_id)) + return req + + +def test_get_object_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, object_data = get_object_data(client, policy_id) + assert req.status_code == 200 + assert isinstance(object_data, dict) + assert "object_data" in object_data + + +def test_add_object_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, object_data = add_object_data(client, "testuser", policy_id, "111") + assert req.status_code == 200 + assert isinstance(object_data, dict) + value = object_data["object_data"]['data'] + assert "object_data" in object_data + id = list(value.keys())[0] + assert value[id]['value']['name'] == "testuser" + assert value[id]['value']['description'] == "description of {}".format("testuser") + + +def test_delete_object_data(): + client = utilities.register_client() + policy_id = utilities.get_policy_id() + success_req = delete_object_data(client, policy_id) + assert success_req.status_code == 200 + +# --------------------------------------------------------------------------- + +# action_categories_test + + +def get_action_data(client, policy_id): + req = client.get("/policies/{}/action_data".format(policy_id)) + action_data = utilities.get_json(req.data) + return req, action_data + + +def add_action_data(client, name, policy_id, category_id): + data = { + "name": name, + "description": "description of {}".format(name) + } + req = client.post("/policies/{}/action_data/{}".format(policy_id, category_id), data=json.dumps(data), + headers={'Content-Type': 'application/json'}) + action_data = utilities.get_json(req.data) + return req, action_data + + +def delete_action_data(client, policy_id): + req = client.delete("/policies/{}/action_data".format(policy_id)) + return req + + +def test_get_action_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, action_data = get_action_data(client, policy_id) + assert req.status_code == 200 + assert isinstance(action_data, dict) + assert "action_data" in action_data + + +def test_add_action_data(): + policy_id = utilities.get_policy_id() + client = utilities.register_client() + req, action_data = add_action_data(client, "testuser", policy_id, "111") + assert req.status_code == 200 + assert isinstance(action_data, dict) + value = action_data["action_data"]['data'] + assert "action_data" in action_data + id = list(value.keys())[0] + assert value[id]['value']['name'] == "testuser" + assert value[id]['value']['description'] == "description of {}".format("testuser") + + +def test_delete_action_data(): + client = utilities.register_client() + policy_id = utilities.get_policy_id() + success_req = delete_action_data(client, policy_id) + assert success_req.status_code == 200 + +# ---------------------------------------------------------------------------
\ No newline at end of file diff --git a/moon_manager/tests/unit_python/api/utilities.py b/moon_manager/tests/unit_python/api/utilities.py index a2b0689b..66ca30c5 100644 --- a/moon_manager/tests/unit_python/api/utilities.py +++ b/moon_manager/tests/unit_python/api/utilities.py @@ -9,4 +9,18 @@ def register_client(): import moon_manager.server server = moon_manager.server.create_server() client = server.app.test_client() - return client
\ No newline at end of file + return client + + +def get_policy_id(): + import api.test_policies as policies + client = register_client() + policy_id = '' + req, policy = policies.get_policies(client) + for id in policy['policies']: + if id: + policy_id = id + break + if not policy_id: + policies.add_policies(client, "testuser") + return policy_id diff --git a/moon_orchestrator/moon_orchestrator/api/pods.py b/moon_orchestrator/moon_orchestrator/api/pods.py index a83ca9ae..31ae31de 100644 --- a/moon_orchestrator/moon_orchestrator/api/pods.py +++ b/moon_orchestrator/moon_orchestrator/api/pods.py @@ -44,15 +44,18 @@ class Pods(Resource): :internal_api: get_pdp """ pods = {} - if uuid: - return {"pods": self.driver.get_pods(uuid)} - for _pod_key, _pod_values in self.driver.get_pods().items(): - pods[_pod_key] = [] - for _pod_value in _pod_values: - if _pod_value['namespace'] != "moon": - continue - pods[_pod_key].append(_pod_value) - return {"pods": pods} + try: + if uuid: + return {"pods": self.driver.get_pods(uuid)} + for _pod_key, _pod_values in self.driver.get_pods().items(): + pods[_pod_key] = [] + for _pod_value in _pod_values: + if _pod_value['namespace'] != "moon": + continue + pods[_pod_key].append(_pod_value) + return {"pods": pods} + except Exception as e: + return {"result": False, "message": str(e)}, 500 @check_auth def post(self, uuid=None, user_id=None): @@ -74,21 +77,24 @@ class Pods(Resource): } """ logger.debug("POST param={}".format(request.json)) - self.driver.create_pipeline( - request.json.get("keystone_project_id"), - request.json.get("pdp_id"), - request.json.get("security_pipeline"), - manager_data=request.json, - active_context=None, - active_context_name=None) - pods = {} - for _pod_key, _pod_values in self.driver.get_pods().items(): - pods[_pod_key] = [] - for _pod_value in _pod_values: - if _pod_value['namespace'] != "moon": - continue - pods[_pod_key].append(_pod_value) - return {"pods": pods} + try: + self.driver.create_pipeline( + request.json.get("keystone_project_id"), + request.json.get("pdp_id"), + request.json.get("security_pipeline"), + manager_data=request.json, + active_context=None, + active_context_name=None) + pods = {} + for _pod_key, _pod_values in self.driver.get_pods().items(): + pods[_pod_key] = [] + for _pod_value in _pod_values: + if _pod_value['namespace'] != "moon": + continue + pods[_pod_key].append(_pod_value) + return {"pods": pods} + except Exception as e: + return {"result": False, "message": str(e)}, 500 @check_auth def delete(self, uuid=None, user_id=None): @@ -128,4 +134,3 @@ class Pods(Resource): :internal_api: update_pdp """ return {"pods": None} - diff --git a/moon_orchestrator/moon_orchestrator/drivers.py b/moon_orchestrator/moon_orchestrator/drivers.py index b21f2639..9c230cce 100644 --- a/moon_orchestrator/moon_orchestrator/drivers.py +++ b/moon_orchestrator/moon_orchestrator/drivers.py @@ -259,6 +259,8 @@ class K8S(Driver): }, ] logger.debug("data={}".format(data)) + # When policies and models are empty, is it right that it returns 200 ? + # Should it return no found policies or models ? policies = manager_data.get('policies') if not policies: logger.info("No policy data from Manager, trying to get them") @@ -274,6 +276,8 @@ class K8S(Driver): "models", dict()) logger.debug("models={}".format(models)) + if not policy_ids: + raise exceptions.PolicyUnknown for policy_id in policy_ids: if policy_id in policies: genre = policies[policy_id].get("genre", "authz") diff --git a/moon_orchestrator/tests/unit_python/test_pods.py b/moon_orchestrator/tests/unit_python/test_pods.py index 0a5a5ba5..f760aa62 100644 --- a/moon_orchestrator/tests/unit_python/test_pods.py +++ b/moon_orchestrator/tests/unit_python/test_pods.py @@ -17,6 +17,20 @@ def test_get_pods(context, monkeypatch): assert "pods" in data +def test_get_pods_failure(context, monkeypatch): + patch_k8s(monkeypatch) + + import moon_orchestrator.server + server = moon_orchestrator.server.create_server() + _client = server.app.test_client() + req = _client.get("/pods/invalid") + assert req.status_code == 200 + assert req.data + data = get_json(req.data) + assert isinstance(data, dict) + assert not data["pods"] + + def test_add_pods(context, monkeypatch): patch_k8s(monkeypatch) @@ -38,6 +52,40 @@ def test_add_pods(context, monkeypatch): assert data["pods"] +def test_add_pods_with_no_data(context, monkeypatch): + patch_k8s(monkeypatch) + import moon_orchestrator.server + server = moon_orchestrator.server.create_server() + _client = server.app.test_client() + req = _client.post("/pods", data=json.dumps({}), + headers={'Content-Type': 'application/json'}) + assert req.status_code == 500 + assert req.data + data = get_json(req.data) + assert '400: Policy Unknown' in data['message'] + + +def test_add_pods_with_no_policies_no_models(context, monkeypatch, no_requests): + patch_k8s(monkeypatch) + + import moon_orchestrator.server + server = moon_orchestrator.server.create_server() + _client = server.app.test_client() + no_requests.get("http://manager:8082/policies", + json={'policies': {}}) + + no_requests.get("http://manager:8082/models", + json={'models': {}}) + data = { + "keystone_project_id": context.get('project_id'), + "pdp_id": context.get('pdp_id'), + "security_pipeline": context.get('security_pipeline'), + } + req = _client.post("/pods", data=json.dumps(data), + headers={'Content-Type': 'application/json'}) + assert req.status_code == 200 + + def test_delete_pods(context, monkeypatch): # TODO pass diff --git a/python_moonutilities/python_moonutilities/configuration.py b/python_moonutilities/python_moonutilities/configuration.py index 4a072de4..0516274c 100644 --- a/python_moonutilities/python_moonutilities/configuration.py +++ b/python_moonutilities/python_moonutilities/configuration.py @@ -91,7 +91,10 @@ def get_plugins(): pipeline = get_configuration("components/pipeline") logger.debug("pipeline={}".format(pipeline)) components = pipeline.get("components/pipeline") - components.pop('interface') + if 'interface' in components: + components.pop('interface') + else: + raise exceptions.ConsulComponentContentError("error= Components pipeline has no interface") return components diff --git a/python_moonutilities/tests/unit_python/mock_repo/urls.py b/python_moonutilities/tests/unit_python/mock_repo/urls.py index 634f07b1..41fd1eec 100644 --- a/python_moonutilities/tests/unit_python/mock_repo/urls.py +++ b/python_moonutilities/tests/unit_python/mock_repo/urls.py @@ -8,10 +8,7 @@ def register_components(m): 'GET', 'http://consul:8500/v1/kv/{}'.format(component), json=[{'Key': component, 'Value': comp_util.get_b64_conf(component)}] ) - m.register_uri( - 'GET', 'http://consul:8500/v1/kv/components/port_start', - json=[{'Key': 'components/port_start', 'Value': comp_util.get_b64_conf("components/port_start")}] - ) + m.register_uri( 'PUT', 'http://consul:8500/v1/kv/components/port_start', json=[] diff --git a/python_moonutilities/tests/unit_python/test_configuration.py b/python_moonutilities/tests/unit_python/test_configuration.py index 5267179e..d5d83f7a 100644 --- a/python_moonutilities/tests/unit_python/test_configuration.py +++ b/python_moonutilities/tests/unit_python/test_configuration.py @@ -98,7 +98,15 @@ def test_get_plugins_success(): plugin = configuration.get_plugins() assert plugin is not None - +def test_get_plugins_failure(no_requests): + from python_moonutilities import configuration + no_requests.register_uri( + 'GET', 'http://consul:8500/v1/kv/components/pipeline', + json=[{'Key': 'components/pipeline', 'Value': 'eyJjb250YWluZXIiOiAid3Vrb25nc3VuL21vb25fYXV0aHo6djQuMyIsICJwb3J0IjogODA4MX0='}] + ) + with pytest.raises(Exception) as exception_info: + configuration.get_plugins() + assert str(exception_info.value) == '500: Consul Content error' ################################ component #################################### def test_get_components(): from python_moonutilities import configuration |