codecov-io: ## [Current coverage](https://codecov.io/gh/OpenKMIP/PyKMIP/pull/215?src=pr) is 86.79% (diff: 100%)
> Merging [#215](https://codecov.io/gh/OpenKMIP/PyKMIP/pull/215?src=pr) into [master](https://codecov.io/gh/OpenKMIP/PyKMIP/branch/master?src=pr) will decrease coverage by **<.01%**

```diff
@@             master       #215   diff @@
==========================================
  Files            64         64          
  Lines          8172       8171     -1   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
- Hits           7093       7092     -1   
  Misses         1079       1079          
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last update [023bb8f...8383f79](https://codecov.io/gh/OpenKMIP/PyKMIP/compare/023bb8fd04b1e61b127313f4a9a6313af07fb14a...8383f79c5f40a3ade027e4f75fce930e99eaf235?src=pr)
coveralls: 
[![Coverage Status](https://coveralls.io/builds/9028353/badge)](https://coveralls.io/builds/9028353)

Coverage decreased (-0.002%) to 86.795% when pulling **8383f79c5f40a3ade027e4f75fce930e99eaf235 on bug/fix-conf-policy-path** into **023bb8fd04b1e61b127313f4a9a6313af07fb14a on master**.

diff --git a/kmip/services/server/config.py b/kmip/services/server/config.py
index 4687999..25bab5e 100644
--- a/kmip/services/server/config.py
+++ b/kmip/services/server/config.py
@@ -41,7 +41,9 @@ class KmipServerConfig(object):
             'certificate_path',
             'key_path',
             'ca_path',
-            'auth_suite',
+            'auth_suite'
+        ]
+        self._optional_settings = [
             'policy_path'
         ]
 
@@ -61,7 +63,7 @@ class KmipServerConfig(object):
             ConfigurationError: Raised if the setting is not supported or if
                 the setting value is invalid.
         """
-        if setting not in self._expected_settings:
+        if setting not in self._expected_settings + self._optional_settings:
             raise exceptions.ConfigurationError(
                 "Setting '{0}' is not supported.".format(setting)
             )
@@ -116,11 +118,11 @@ class KmipServerConfig(object):
             )
 
         settings = [x[0] for x in parser.items('server')]
-        for setting in settings:
-            if setting not in self._expected_settings:
+        for s in settings:
+            if s not in self._expected_settings + self._optional_settings:
                 raise exceptions.ConfigurationError(
                     "Setting '{0}' is not a supported setting. Please "
-                    "remove it from the configuration file.".format(setting)
+                    "remove it from the configuration file.".format(s)
                 )
         for setting in self._expected_settings:
             if setting not in settings:
@@ -231,16 +233,10 @@ class KmipServerConfig(object):
             self.settings['auth_suite'] = value
 
     def _set_policy_path(self, value):
-        if value is None:
+        if not value:
             self.settings['policy_path'] = None
         elif isinstance(value, six.string_types):
-            if os.path.exists(value):
-                self.settings['policy_path'] = value
-            else:
-                raise exceptions.ConfigurationError(
-                    "The policy path value, if specified, must be a valid "
-                    "string path to a filesystem directory."
-                )
+            self.settings['policy_path'] = value
         else:
             raise exceptions.ConfigurationError(
                 "The policy path, if specified, must be a valid string path "
diff --git a/kmip/services/server/engine.py b/kmip/services/server/engine.py
index 587d509..27e7341 100644
--- a/kmip/services/server/engine.py
+++ b/kmip/services/server/engine.py
@@ -134,9 +134,9 @@ class KmipEngine(object):
     def _load_operation_policies(self, policy_path):
         if (policy_path is None) or (not os.path.isdir(policy_path)):
             self._logger.warning(
-                "The specified operation policy directory ({0}) is not "
-                "valid. No user-defined policies will be loaded".format(
-                    policy_path
+                "The specified operation policy directory{0} is not "
+                "valid. No user-defined policies will be loaded.".format(
+                    " (" + policy_path + ")" if policy_path else ''
                 )
             )
             return dict()
@@ -151,7 +151,7 @@ class KmipEngine(object):
             file_path = os.path.join(policy_path, filename)
             if os.path.isfile(file_path):
                 self._logger.info(
-                    "Loading user_defined operation policies "
+                    "Loading user-defined operation policies "
                     "from file: {0}".format(file_path)
                 )
 
diff --git a/kmip/services/server/server.py b/kmip/services/server/server.py
index 32b6ea9..6cf11d3 100644
--- a/kmip/services/server/server.py
+++ b/kmip/services/server/server.py
@@ -51,7 +51,7 @@ class KmipServer(object):
             auth_suite=None,
             config_path='/etc/pykmip/server.conf',
             log_path='/var/log/pykmip/server.log',
-            policy_path='/etc/pykmip/policies'
+            policy_path=None
     ):
         """
         Create a KmipServer.
@@ -95,7 +95,7 @@ class KmipServer(object):
                 '/var/log/pykmip/server.log'.
             policy_path (string): The path to the filesystem directory
                 containing PyKMIP server operation policy JSON files.
-                Optional, defaults to '/etc/pykmip/policies'.
+                Optional, defaults to None.
         """
         self._logger = logging.getLogger('kmip.server')
         self._setup_logging(log_path)

policy_path error when running server
I'm receiving the following error when attempting to run the PyKMIP server 0.5.0:
"kmip.core.exceptions.ConfigurationError: Setting 'policy_path' is missing from the configuration file."

I cannot find policy_path documented anywhere and have not found any guidance online.  I have attempted to insert a path statement in the config file the error then changes to:
"kmip.core.exceptions.ConfigurationError: The policy path value, if specified, must be a valid string path to a filesystem directory."   The path I used is a valid path with appropriate permissions but not knowing the format of the expected policy file I am unable to provide a suitable target. 

Any guidance would be appreciated. 
diff --git a/kmip/tests/unit/services/server/test_config.py b/kmip/tests/unit/services/server/test_config.py
index 19bfb54..f9121dc 100644
--- a/kmip/tests/unit/services/server/test_config.py
+++ b/kmip/tests/unit/services/server/test_config.py
@@ -513,20 +513,10 @@ class TestKmipServerConfig(testtools.TestCase):
         # Test that a ConfigurationError is generated when setting the wrong
         # value.
         c._logger.reset_mock()
-        args = (0, )
+        args = (1, )
         self.assertRaises(
             exceptions.ConfigurationError,
             c._set_policy_path,
             *args
         )
-        self.assertNotEqual(0, c.settings.get('policy_path'))
-
-        args = ('/test/path/policies', )
-        with mock.patch('os.path.exists') as os_mock:
-            os_mock.return_value = False
-            self.assertRaises(
-                exceptions.ConfigurationError,
-                c._set_policy_path,
-                *args
-            )
-            self.assertNotEqual(0, c.settings.get('policy_path'))
+        self.assertNotEqual(1, c.settings.get('policy_path'))
diff --git a/kmip/tests/unit/services/server/test_engine.py b/kmip/tests/unit/services/server/test_engine.py
index 87956e7..23f3624 100644
--- a/kmip/tests/unit/services/server/test_engine.py
+++ b/kmip/tests/unit/services/server/test_engine.py
@@ -163,7 +163,7 @@ class TestKmipEngine(testtools.TestCase):
             )
         )
         e._logger.info.assert_any_call(
-            "Loading user_defined operation policies from file: {0}".format(
+            "Loading user-defined operation policies from file: {0}".format(
                 policy_file.name
             )
         )
@@ -203,7 +203,7 @@ class TestKmipEngine(testtools.TestCase):
             )
         )
         e._logger.info.assert_any_call(
-            "Loading user_defined operation policies from file: {0}".format(
+            "Loading user-defined operation policies from file: {0}".format(
                 policy_file.name
             )
         )
@@ -239,7 +239,7 @@ class TestKmipEngine(testtools.TestCase):
             )
         )
         e._logger.info.assert_any_call(
-            "Loading user_defined operation policies from file: {0}".format(
+            "Loading user-defined operation policies from file: {0}".format(
                 policy_file.name
             )
         )
@@ -283,12 +283,12 @@ class TestKmipEngine(testtools.TestCase):
             )
         )
         e._logger.info.assert_any_call(
-            "Loading user_defined operation policies from file: {0}".format(
+            "Loading user-defined operation policies from file: {0}".format(
                 policy_file_a.name
             )
         )
         e._logger.info.assert_any_call(
-            "Loading user_defined operation policies from file: {0}".format(
+            "Loading user-defined operation policies from file: {0}".format(
                 policy_file_b.name
             )
         )

pip install -e .
parse_log_pytest
requirements.txt
pytest coverage flake8 testtools fixtures testresources mock testscenarios testrepository sphinx bandit
apt-get update apt-get install -y gcc
3.5
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs==22.2.0
Babel==2.11.0
bandit==1.7.1
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
coverage==6.2
cryptography==40.0.2
docutils==0.17.1
enum34==1.1.10
extras==1.0.0
fixtures==4.0.0
flake8==5.0.4
gitdb==4.0.9
GitPython==3.1.18
greenlet==2.0.2
idna==3.10
imagesize==1.4.1
importlib-metadata==4.2.0
iniconfig==1.1.1
iso8601==1.1.0
Jinja2==3.0.3
MarkupSafe==2.0.1
mccabe==0.7.0
mock==5.2.0
packaging==21.3
pbr==6.1.1
pluggy==1.0.0
py==1.11.0
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
Pygments==2.14.0
-e git+https://github.com/OpenKMIP/PyKMIP.git@023bb8fd04b1e61b127313f4a9a6313af07fb14a#egg=PyKMIP
pyparsing==3.1.4
pytest==7.0.1
python-subunit==1.4.2
pytz==2025.2
PyYAML==6.0.1
requests==2.27.1
six==1.17.0
smmap==5.0.0
snowballstemmer==2.2.0
Sphinx==4.3.2
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
SQLAlchemy==1.4.54
stevedore==3.5.2
testrepository==0.0.21
testresources==2.0.1
testscenarios==0.5.0
testtools==2.6.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: PyKMIP
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - attrs==22.2.0
      - babel==2.11.0
      - bandit==1.7.1
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - coverage==6.2
      - cryptography==40.0.2
      - docutils==0.17.1
      - enum34==1.1.10
      - extras==1.0.0
      - fixtures==4.0.0
      - flake8==5.0.4
      - gitdb==4.0.9
      - gitpython==3.1.18
      - greenlet==2.0.2
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.2.0
      - iniconfig==1.1.1
      - iso8601==1.1.0
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - mock==5.2.0
      - packaging==21.3
      - pbr==6.1.1
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyflakes==2.5.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-subunit==1.4.2
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.27.1
      - six==1.17.0
      - smmap==5.0.0
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - sqlalchemy==1.4.54
      - stevedore==3.5.2
      - testrepository==0.0.21
      - testresources==2.0.1
      - testscenarios==0.5.0
      - testtools==2.6.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/PyKMIP

kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_load_operation_policies kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_load_operation_policies_with_duplicate kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_load_operation_policies_with_file_read_error kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_load_operation_policies_with_reserved
kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_activate kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_activate_not_allowed_by_policy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_activate_on_active_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_activate_on_static_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_destroy_not_allowed_by_policy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_not_allowed_by_policy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_unsupported_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_with_key_format_type
kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_init kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_load_settings kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_parse_settings kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_auth_suite kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_ca_path kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_certificate_path kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_hostname kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_key_path kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_policy_path kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_port kmip/tests/unit/services/server/test_config.py::TestKmipServerConfig::test_set_setting kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_core_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_core_object_unsupported_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_build_error_response kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_mismatched_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_key_pair_omitting_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_omitting_attributes kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_create_unsupported_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_discover_versions kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_missing_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_object_type_multiple_objects kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_get_with_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_init kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_block_all kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_policy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_policy_blocked kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_policy_nonexistent_policy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_policy_not_applicable kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_policy_not_object_applicable kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_public kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_is_allowed_by_operation_safety_check kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_expected_error kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_missing_batch_id kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_batch_unexpected_error kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_multibatch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_future_timestamp kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_missing_credential kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_stale_timestamp kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_async_indicator kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_batch_option kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_request_unsupported_version kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_template_attribute kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_process_template_attribute_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_query kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register_get_destroy kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_register_unsupported_object_type kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_request_omitting_secret kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attribute_on_managed_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attribute_on_managed_object_unsupported_features kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attributes_on_managed_object kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_set_attributes_on_managed_object_attribute_mismatch kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_supported_operation kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_unsupported_operation kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_version_operation_match kmip/tests/unit/services/server/test_engine.py::TestKmipEngine::test_version_operation_mismatch
kmip/services/server/server.py kmip/services/server/engine.py kmip/services/server/config.py
kmip/services/server/server.py kmip/services/server/engine.py kmip/services/server/config.py