From 070f8fd891ed1fc92442dc09262f641e461457c5 Mon Sep 17 00:00:00 2001
From: Pavlo Shchelokovskyy <shchelokovskyy@gmail.com>
Date: Thu, 1 Jun 2017 16:31:27 +0300
Subject: [PATCH] Add 'none' identity plugin

It does not accept any arguments and sets the token to 'notused'.
It does not have any endpoint/url associated,
and thus must be used together with adapter.Adapter.endpoint_override to
instantiate a session for client to a service that is deployed in
noauth/standalone mode.

Unfortunately the 'noauth' name is already taken by
cinderclient.contrib.noauth.

Change-Id: I2f7175ea095aac774e7c5889880fcff15586559c
---
 keystoneauth1/loading/_plugins/noauth.py | 33 +++++++++++++++++++++
 keystoneauth1/noauth.py                  | 24 +++++++++++++++
 keystoneauth1/tests/unit/test_noauth.py  | 37 ++++++++++++++++++++++++
 setup.cfg                                |  1 +
 4 files changed, 95 insertions(+)
 create mode 100644 keystoneauth1/loading/_plugins/noauth.py
 create mode 100644 keystoneauth1/noauth.py
 create mode 100644 keystoneauth1/tests/unit/test_noauth.py

diff --git a/keystoneauth1/loading/_plugins/noauth.py b/keystoneauth1/loading/_plugins/noauth.py
new file mode 100644
index 00000000..ea75f5b0
--- /dev/null
+++ b/keystoneauth1/loading/_plugins/noauth.py
@@ -0,0 +1,33 @@
+# Licensed 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 keystoneauth1 import loading
+from keystoneauth1 import noauth
+
+
+class NoAuth(loading.BaseLoader):
+    """Use no tokens to perform requests.
+
+    This must be used together with adapter.Adapter.endpoint_override
+    to instantiate clients for services deployed in noauth/standalone mode.
+
+    There is no fetching a service catalog or determining scope information
+    and so it cannot be used by clients that expect use this scope information.
+
+    """
+
+    @property
+    def plugin_class(self):
+        return noauth.NoAuth
+
+    def get_options(self):
+        return []
diff --git a/keystoneauth1/noauth.py b/keystoneauth1/noauth.py
new file mode 100644
index 00000000..95037714
--- /dev/null
+++ b/keystoneauth1/noauth.py
@@ -0,0 +1,24 @@
+# Licensed 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 keystoneauth1 import plugin
+
+
+class NoAuth(plugin.BaseAuthPlugin):
+    """A provider that will always use no auth.
+
+    This is useful to unify session/adapter loading for services
+    that might be deployed in standalone/noauth mode.
+    """
+
+    def get_token(self, session):
+        return 'notused'
diff --git a/keystoneauth1/tests/unit/test_noauth.py b/keystoneauth1/tests/unit/test_noauth.py
new file mode 100644
index 00000000..8050b69f
--- /dev/null
+++ b/keystoneauth1/tests/unit/test_noauth.py
@@ -0,0 +1,37 @@
+# Licensed 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 keystoneauth1.loading._plugins import noauth as loader
+from keystoneauth1 import noauth
+from keystoneauth1 import session
+from keystoneauth1.tests.unit import utils
+
+
+class NoAuthTest(utils.TestCase):
+
+    NOAUTH_TOKEN = 'notused'
+    TEST_URL = 'http://server/prefix'
+
+    def test_basic_case(self):
+        self.requests_mock.get(self.TEST_URL, text='body')
+
+        a = noauth.NoAuth()
+        s = session.Session(auth=a)
+
+        data = s.get(self.TEST_URL, authenticated=True)
+
+        self.assertEqual(data.text, 'body')
+        self.assertRequestHeaderEqual('X-Auth-Token', self.NOAUTH_TOKEN)
+        self.assertIsNone(a.get_endpoint(s))
+
+    def test_noauth_options(self):
+        self.assertEqual([], loader.NoAuth().get_options())
diff --git a/setup.cfg b/setup.cfg
index ba170d5a..a276cada 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -37,6 +37,7 @@ betamax =
 [entry_points]
 
 keystoneauth1.plugin =
+    none = keystoneauth1.loading._plugins.noauth:NoAuth
     password = keystoneauth1.loading._plugins.identity.generic:Password
     token = keystoneauth1.loading._plugins.identity.generic:Token
     admin_token = keystoneauth1.loading._plugins.admin_token:AdminToken