diff --git a/AUTHORS b/AUTHORS
index a8e9d67..ceb5d66 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -190,6 +190,7 @@ OTSUKA, Yuanying <yuanying@fraction.jp>
 Ondřej Nový <ondrej.novy@firma.seznam.cz>
 OpenStack Release Bot <infra-root@openstack.org>
 Pan <pankaj.khandar@gmail.com>
+Pavlo Shchelokovskyy <shchelokovskyy@gmail.com>
 Pengju Jiao <jiaopengju@cmss.chinamobile.com>
 Pete Zaitcev <zaitcev@kotori.zaitcev.us>
 Peter Wang <peter.wang13@emc.com>
diff --git a/ChangeLog b/ChangeLog
index c74e4f6..1a54a4c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,19 @@
 CHANGES
 =======
 
+15.1.0
+------
+
+* Set configured\_ip\_versions fact in cephfs driver
+* Macrosan driver: some improvements about variables and syntax
+* Fix neutron plugin get network\_type
+* Allow setting endpoint\_type for glance
+* Rename 'nfs\_cluster\_id' to 'cluster\_id' in the NFSProtocolHelper
+* [CI][stable/zed] pin test plugin in grenade skip-level
+* [RBAC] Return 404 if share is inaccessible
+* Update TOX\_CONSTRAINTS\_FILE for stable/zed
+* Update .gitreview for stable/zed
+
 15.0.0
 ------
 
diff --git a/PKG-INFO b/PKG-INFO
index 1c9e00a..1fec23c 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: manila
-Version: 15.0.0
+Version: 15.1.0
 Summary: Shared Storage for OpenStack
 Home-page: https://docs.openstack.org/manila/latest/
 Author: OpenStack
diff --git a/debian/changelog b/debian/changelog
index eb0b1fe..4344633 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
-manila (1:15.0.0-0ubuntu1.1) UNRELEASED; urgency=medium
+manila (1:15.1.0-0ubuntu1) UNRELEASED; urgency=medium
 
   * d/gbp.conf: Create stable/zed branch.
+  * New upstream release for OpenStack Zed (LP: #123456).
 
- -- Corey Bryant <corey.bryant@canonical.com>  Fri, 28 Oct 2022 05:46:30 -0400
+ -- Corey Bryant <corey.bryant@canonical.com>  Tue, 29 Nov 2022 13:57:47 -0500
 
 manila (1:15.0.0-0ubuntu1) kinetic; urgency=medium
 
diff --git a/manila.egg-info/PKG-INFO b/manila.egg-info/PKG-INFO
index 1c9e00a..1fec23c 100644
--- a/manila.egg-info/PKG-INFO
+++ b/manila.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: manila
-Version: 15.0.0
+Version: 15.1.0
 Summary: Shared Storage for OpenStack
 Home-page: https://docs.openstack.org/manila/latest/
 Author: OpenStack
diff --git a/manila.egg-info/SOURCES.txt b/manila.egg-info/SOURCES.txt
index 8f7d283..1cccfb0 100644
--- a/manila.egg-info/SOURCES.txt
+++ b/manila.egg-info/SOURCES.txt
@@ -1319,6 +1319,7 @@ manila/wsgi/wsgi.py
 playbooks/manila-tox-genconfig/post.yaml
 rally-jobs/rally-manila-no-ss.yaml
 rally-jobs/rally-manila.yaml
+releasenote/notes/macrosan-add-configuration-option-282fa1026748c4f9.yaml
 releasenotes/notes/1741425-fix-service-image-retrieval-issue-bf7ae3e5aa9446e9.yaml
 releasenotes/notes/1841035-dellemc-unity-fix-ace-enable-error-b00281bb306d176b.yaml
 releasenotes/notes/1896949-netapp-fix-cifs-access-rules-promoted-replica-70b32991cc90e1ca.yaml
@@ -1561,6 +1562,7 @@ releasenotes/notes/bug-1894362-fix-Glusterfs-del-share-3c8467e1d9f0c6e4.yaml
 releasenotes/notes/bug-1896322-container-fix-search-veth-regex-7f2156a6fd411bdb.yaml
 releasenotes/notes/bug-1898924-fix-share-replica-update-missing-share-server-model-c1c060a7c06e4512.yaml
 releasenotes/notes/bug-1900752-early-validate-mandatory-security-service-association-f48aecbbc47418cd.yaml
+releasenotes/notes/bug-1901210-return-404-if-share-access-forbidden-02ca9a9552ad3e15.yaml
 releasenotes/notes/bug-1901937-netapp-nfs-for-windows-465e704524277ea2.yaml
 releasenotes/notes/bug-1903773-fix-lvmdriver-share-unmounting-after-migration-75640e3c9dc62dba.yaml
 releasenotes/notes/bug-1903773-fix-zfsonlinux-share-unmounting-after-migration-329b1eb2f33f78a3.yaml
@@ -1612,6 +1614,9 @@ releasenotes/notes/bug-1978962-fix-find-available-servers-2dec3a4f3f0ef7e4.yaml
 releasenotes/notes/bug-1983125-cb9118c3fa26a6f2.yaml
 releasenotes/notes/bug-1986653-infinidat-add-ssl-options-ee91f152bbd28080.yaml
 releasenotes/notes/bug-1989283-infinidat-version-bump-6f791d9d97ccf75b.yaml
+releasenotes/notes/bug-1991378-fix-cluster_id-param-cephfs-nfs-2ddc4ff98141b9b9.yaml
+releasenotes/notes/bug-1991396-add-glance-endpoint-type-151777f255e423a3.yaml
+releasenotes/notes/bug-1991776-cephfs-configured-ip-versions-fd87976fdb848e8c.yaml
 releasenotes/notes/bug-667744-fix-c64071e6e5a098f7.yaml
 releasenotes/notes/bug_1564623_change-e286060a27b02f64.yaml
 releasenotes/notes/bug_1582931-1437eae20fa544d1.yaml
@@ -1666,6 +1671,7 @@ releasenotes/notes/fix-huawei-driver-cifs-mount-issue-2d7bff5a7e6e3ad6.yaml
 releasenotes/notes/fix-huawei-driver-qos-deletion-9ad62db3d7415980.yaml
 releasenotes/notes/fix-huawei-exception-a09b73234ksd94kd.yaml
 releasenotes/notes/fix-managing-twice-hnas-4956a7653d27e320.yaml
+releasenotes/notes/fix-neutron-plugin-invalid-key-dict-68c3d6bcbf2f19f0.yaml
 releasenotes/notes/fix-py3-netapp-a9815186ddc865d4.yaml
 releasenotes/notes/fix-race-condition-netapp-5a36f6ba95a49c5e.yaml
 releasenotes/notes/fix-share-instance-list-with-limit-db7b5b99138e22ee.yaml
diff --git a/manila.egg-info/pbr.json b/manila.egg-info/pbr.json
index c434a58..617ab4a 100644
--- a/manila.egg-info/pbr.json
+++ b/manila.egg-info/pbr.json
@@ -1 +1 @@
-{"git_version": "f8f89548", "is_release": true}
\ No newline at end of file
+{"git_version": "2e16e27d", "is_release": true}
\ No newline at end of file
diff --git a/manila/image/glance.py b/manila/image/glance.py
index 4cbefed..4f4203e 100644
--- a/manila/image/glance.py
+++ b/manila/image/glance.py
@@ -35,6 +35,9 @@ glance_opts = [
     cfg.StrOpt('region_name',
                default='RegionOne',
                help='Region name for connecting to glance.'),
+    cfg.StrOpt('endpoint_type',
+               default='publicURL',
+               help='Endpoint type to be used with glance client calls.'),
     ]
 
 CONF = cfg.CONF
@@ -55,6 +58,7 @@ def glanceclient(context):
             client_class=glance_client.Client, cfg_group=GLANCE_GROUP)
     return AUTH_OBJ.get_client(context,
                                version=CONF[GLANCE_GROUP].api_microversion,
+                               interface=CONF[GLANCE_GROUP].endpoint_type,
                                region_name=CONF[GLANCE_GROUP].region_name)
 
 
diff --git a/manila/network/neutron/neutron_network_plugin.py b/manila/network/neutron/neutron_network_plugin.py
index 54c28f5..7ebdbec 100644
--- a/manila/network/neutron/neutron_network_plugin.py
+++ b/manila/network/neutron/neutron_network_plugin.py
@@ -398,13 +398,13 @@ class NeutronNetworkPlugin(network.NetworkBaseAPI):
                        "(found: %s)." % (phy, phy_nets))
                 raise exception.NetworkBadConfigurationException(reason=msg)
         else:
-            network_type = net_info['provider:network_type']
-            segmentation_id = net_info['provider:segmentation_id']
+            network_type = net_info.get('provider:network_type')
+            segmentation_id = net_info.get('provider:segmentation_id')
 
         provider_nw_dict = {
             'network_type': network_type,
             'segmentation_id': segmentation_id,
-            'mtu': net_info['mtu'],
+            'mtu': net_info.get('mtu'),
         }
         share_network_subnet.update(provider_nw_dict)
 
diff --git a/manila/share/api.py b/manila/share/api.py
index 883a3a0..280c506 100644
--- a/manila/share/api.py
+++ b/manila/share/api.py
@@ -1952,7 +1952,10 @@ class API(base.Base):
     def get(self, context, share_id):
         rv = self.db.share_get(context, share_id)
         if not rv['is_public']:
-            policy.check_policy(context, 'share', 'get', rv)
+            authorized = policy.check_policy(
+                context, 'share', 'get', rv, do_raise=False)
+            if not authorized:
+                raise exception.NotFound()
         return rv
 
     def get_all(self, context, search_opts=None, sort_key='created_at',
diff --git a/manila/share/drivers/cephfs/driver.py b/manila/share/drivers/cephfs/driver.py
index 620b370..9259aa5 100644
--- a/manila/share/drivers/cephfs/driver.py
+++ b/manila/share/drivers/cephfs/driver.py
@@ -1033,7 +1033,7 @@ class NFSProtocolHelperMixin():
                             "a hostname (rather than IP address) was supplied "
                             "in 'cephfs_ganesha_server_ip' or "
                             "in 'cephfs_ganesha_export_ips'.")
-                return [4, 6]
+                self.configured_ip_versions = {4, 6}
         return list(self.configured_ip_versions)
 
 
@@ -1177,7 +1177,7 @@ class NFSClusterProtocolHelper(NFSProtocolHelperMixin, ganesha.NASHelperBase):
         export_ips = []
 
         argdict = {
-            "nfs_cluster_id": nfs_clusterid,
+            "cluster_id": nfs_clusterid,
         }
 
         output = rados_command(self.rados_client, "nfs cluster info", argdict)
@@ -1206,7 +1206,7 @@ class NFSClusterProtocolHelper(NFSProtocolHelperMixin, ganesha.NASHelperBase):
         """Allow access to the share."""
         export = {
             "path": self._get_export_path(share),
-            "nfs_cluster_id": self.nfs_clusterid,
+            "cluster_id": self.nfs_clusterid,
             "pseudo": self._get_export_pseudo_path(share),
             "squash": "none",
             "security_label": True,
@@ -1220,7 +1220,7 @@ class NFSClusterProtocolHelper(NFSProtocolHelperMixin, ganesha.NASHelperBase):
         }
 
         argdict = {
-            "nfs_cluster_id": self.nfs_clusterid,
+            "cluster_id": self.nfs_clusterid,
         }
 
         inbuf = json.dumps(export).encode('utf-8')
@@ -1231,7 +1231,7 @@ class NFSClusterProtocolHelper(NFSProtocolHelperMixin, ganesha.NASHelperBase):
         """Deny access to the share."""
 
         argdict = {
-            "nfs_cluster_id": self.nfs_clusterid,
+            "cluster_id": self.nfs_clusterid,
             "pseudo_path": self._get_export_pseudo_path(share)
         }
 
diff --git a/manila/share/drivers/macrosan/macrosan_helper.py b/manila/share/drivers/macrosan/macrosan_helper.py
index c5e7049..1008a21 100644
--- a/manila/share/drivers/macrosan/macrosan_helper.py
+++ b/manila/share/drivers/macrosan/macrosan_helper.py
@@ -61,7 +61,7 @@ class MacrosanHelper(object):
         cifs_status = self.rest._get_cifs_service_status()
         if cifs_status == constants.CIFS_EXCEPTION:
             raise exception.MacrosanBackendExeption(
-                reason=_("cifs service exception.Please check backend"))
+                reason=_("cifs service exception. Please check backend"))
         elif cifs_status == constants.CIFS_NON_CONFIG:
             """need config first, then start service"""
             self.rest._config_cifs_service()
@@ -81,17 +81,8 @@ class MacrosanHelper(object):
     def create_share(self, share, share_server=None):
         """Create a share"""
         pool_name, share_name, proto = self._get_share_instance_pnp(share)
-
         share_size = ''.join((str(share['size']), 'GB'))
 
-        # check pool available
-        storage_pools = self.rest._get_all_pool()
-        pool_info = self._find_pool_info(pool_name, storage_pools)
-        if not pool_info:
-            msg = f'Failed to find information regarding pool {pool_name}'
-            msg = _(msg)
-            raise exception.InvalidHost(reason=msg)
-
         # first create filesystem
         self.rest._create_filesystem(fs_name=share_name,
                                      pool_name=pool_name,
@@ -112,7 +103,7 @@ class MacrosanHelper(object):
                 self.rest._delete_filesystem(share_name)
                 raise exception.MacrosanBackendExeption(
                     reason=(_(
-                        'Failed to create share %(share)s.Reason:'
+                        'Failed to create share %(share)s. Reason: '
                         'username %(user_name)s error.')
                         % {'share': share_name, 'user_name': user_name}))
 
@@ -328,7 +319,8 @@ class MacrosanHelper(object):
 
         if proto == 'NFS':
             for share_access in access_list:
-                if share_access['access_to'] == '172.0.0.2':
+                # IPv4 Address Blocks Reserved for Documentation
+                if share_access['access_to'] == '192.0.2.0':
                     continue
                 self.rest._delete_nfs_access_rest(share_path,
                                                   share_access['access_to'])
@@ -400,13 +392,10 @@ class MacrosanHelper(object):
 
     def update_share_stats(self, dict_data):
         """Update pools info"""
-
         result = self.rest._get_all_pool()
         dict_data["pools"] = []
         for pool_name in self.pools:
-
             pool_capacity = self._get_pool_capacity(pool_name, result)
-
             if pool_capacity:
                 pool = {
                     'pool_name': pool_name,
@@ -414,9 +403,15 @@ class MacrosanHelper(object):
                     'free_capacity_gb': pool_capacity['freecapacity'],
                     'allocated_capacity_gb':
                         pool_capacity['allocatedcapacity'],
-                    'reserved_percentage': 0,
-                    'reserved_snapshot_percentage': 0,
-                    'reserved_share_extend_percentage': 0,
+                    'reserved_percentage':
+                        self.configuration.reserved_share_percentage,
+                    'reserved_snapshot_percentage':
+                        self.configuration
+                            .reserved_share_from_snapshot_percentage
+                        or self.configuration.reserved_share_percentage,
+                    'reserved_share_extend_percentage':
+                        self.configuration.reserved_share_extend_percentage
+                        or self.configuration.reserved_share_percentage,
                     'dedupe': False,
                     'compression': False,
                     'qos': False,
diff --git a/manila/share/drivers/macrosan/macrosan_nas.py b/manila/share/drivers/macrosan/macrosan_nas.py
index 3f87009..7b36849 100644
--- a/manila/share/drivers/macrosan/macrosan_nas.py
+++ b/manila/share/drivers/macrosan/macrosan_nas.py
@@ -37,10 +37,14 @@ macrosan_opts = [
     cfg.StrOpt('macrosan_nas_password',
                default=None,
                secret=True,
-               help='Password for the Macrosan NAS server. '),
+               help='Password for the Macrosan NAS server.'),
     cfg.StrOpt('macrosan_nas_http_protocol',
                default='https',
+               choices=['http', 'https'],
                help='Http protocol for the Macrosan NAS server.'),
+    cfg.BoolOpt('macrosan_ssl_cert_verify',
+                default=False,
+                help='Defines whether the driver should check ssl cert.'),
     cfg.StrOpt('macrosan_nas_prefix',
                default='nas',
                help='Url prefix for the Macrosan NAS server.'),
diff --git a/manila/share/drivers/macrosan/rest_helper.py b/manila/share/drivers/macrosan/rest_helper.py
index 4b77182..ca8980a 100644
--- a/manila/share/drivers/macrosan/rest_helper.py
+++ b/manila/share/drivers/macrosan/rest_helper.py
@@ -36,9 +36,11 @@ class RestHelper(object):
         self._username = self.configuration.macrosan_nas_username
         self._password = self.configuration.macrosan_nas_password
         self.request_timeout = self.configuration.macrosan_timeout
-        # Suppress the Insecure request warnings
-        requests.packages.urllib3.disable_warnings(
-            requests.packages.urllib3.exceptions.InsecureRequestWarning)
+        self.ssl_verify = self.configuration.macrosan_ssl_cert_verify
+        if not self.ssl_verify:
+            # Suppress the Insecure request warnings
+            requests.packages.urllib3.disable_warnings(
+                requests.packages.urllib3.exceptions.InsecureRequestWarning)
 
     @utils.synchronized('macrosan_manila')
     def call(self, url, data, method):
@@ -72,16 +74,20 @@ class RestHelper(object):
 
         if method == 'POST':
             res = requests.post(final_url, data=data, headers=header,
-                                timeout=self.request_timeout, verify=False)
+                                timeout=self.request_timeout,
+                                verify=self.ssl_verify)
         elif method == 'GET':
             res = requests.get(final_url, data=data, headers=header,
-                               timeout=self.request_timeout, verify=False)
+                               timeout=self.request_timeout,
+                               verify=self.ssl_verify)
         elif method == 'PUT':
             res = requests.put(final_url, data=data, headers=header,
-                               timeout=self.request_timeout, verify=False)
+                               timeout=self.request_timeout,
+                               verify=self.ssl_verify)
         elif method == 'DELETE':
             res = requests.delete(final_url, data=data, headers=header,
-                                  timeout=self.request_timeout, verify=False)
+                                  timeout=self.request_timeout,
+                                  verify=self.ssl_verify)
         else:
             msg = (_("Request method %s invalid.") % method)
             raise exception.ShareBackendException(msg=msg)
@@ -130,10 +136,11 @@ class RestHelper(object):
 
     def _create_nfs_share(self, share_path):
         url = 'rest/nfsShare'
+        # IPv4 Address Blocks Reserved for Documentation
         params = {
             'path': share_path,
             'authority': 'ro',
-            'accessClient': '172.0.0.2',
+            'accessClient': '192.0.2.0',
         }
         result = self.call(url, params, 'POST')
 
diff --git a/manila/tests/api/v2/test_share_accesses.py b/manila/tests/api/v2/test_share_accesses.py
index 2f3aa33..ab0586a 100644
--- a/manila/tests/api/v2/test_share_accesses.py
+++ b/manila/tests/api/v2/test_share_accesses.py
@@ -137,7 +137,7 @@ class ShareAccessesAPITest(test.TestCase):
             mock.call(req.environ['manila.context'],
                       'share', 'access_get'),
             mock.call(req.environ['manila.context'],
-                      'share', 'get', mock.ANY)])
+                      'share', 'get', mock.ANY, do_raise=False)])
         policy_check_call_args_list = policy.check_policy.call_args_list[2][0]
         share_being_checked = policy_check_call_args_list[3]
         self.assertEqual('c3c5ec1ccc4640d0af1914cbf11f05ad',
diff --git a/manila/tests/api/v2/test_share_instances.py b/manila/tests/api/v2/test_share_instances.py
index 5017ce7..1a0ab45 100644
--- a/manila/tests/api/v2/test_share_instances.py
+++ b/manila/tests/api/v2/test_share_instances.py
@@ -201,7 +201,7 @@ class ShareInstancesAPITest(test.TestCase):
         req = self._get_request('fake', version=version)
         req_context = req.environ['manila.context']
         share_policy_check_call = mock.call(
-            req_context, 'share', 'get', mock.ANY)
+            req_context, 'share', 'get', mock.ANY, do_raise=False)
         get_instances_policy_check_call = mock.call(
             req_context, 'share_instance', 'index')
 
diff --git a/manila/tests/image/test_image.py b/manila/tests/image/test_image.py
index 2f68cf1..a30284e 100644
--- a/manila/tests/image/test_image.py
+++ b/manila/tests/image/test_image.py
@@ -49,6 +49,7 @@ class GlanceClientTestCase(test.TestCase):
         data = {
             'glance': {
                 'api_microversion': 'foo_api_microversion',
+                'endpoint_type': 'internal',
                 'region_name': 'foo_region_name'
             }
         }
@@ -63,6 +64,7 @@ class GlanceClientTestCase(test.TestCase):
         mock_client_loader.return_value.get_client.assert_called_once_with(
             fake_context,
             version=data['glance']['api_microversion'],
+            interface=data['glance']['endpoint_type'],
             region_name=data['glance']['region_name']
         )
 
@@ -72,6 +74,7 @@ class GlanceClientTestCase(test.TestCase):
         data = {
             'glance': {
                 'api_microversion': 'foo_api_microversion',
+                'endpoint_type': 'internal',
                 'region_name': 'foo_region_name'
             }
         }
@@ -82,6 +85,7 @@ class GlanceClientTestCase(test.TestCase):
         glance.AUTH_OBJ.get_client.assert_called_once_with(
             fake_context,
             version=data['glance']['api_microversion'],
+            interface=data['glance']['endpoint_type'],
             region_name=data['glance']['region_name']
         )
 
diff --git a/manila/tests/share/drivers/cephfs/test_driver.py b/manila/tests/share/drivers/cephfs/test_driver.py
index c53b113..9faa231 100644
--- a/manila/tests/share/drivers/cephfs/test_driver.py
+++ b/manila/tests/share/drivers/cephfs/test_driver.py
@@ -1115,6 +1115,8 @@ class NFSProtocolHelperTestCase(test.TestCase):
 
         self.assertEqual(set(configured_ip_version),
                          set(helper.get_configured_ip_versions()))
+        self.assertEqual(set(configured_ip_version),
+                         helper.configured_ip_versions)
 
     def test_get_configured_ip_versions_already_set(self):
         fake_conf = configuration.Configuration(None)
@@ -1278,12 +1280,12 @@ class NFSClusterProtocolHelperTestCase(test.TestCase):
         }
 
         access_allow_dict = {
-            "nfs_cluster_id": nfs_clusterid,
+            "cluster_id": nfs_clusterid,
         }
 
         export = {
             "path": "ganesha:/foo/bar",
-            "nfs_cluster_id": nfs_clusterid,
+            "cluster_id": nfs_clusterid,
             "pseudo": "ganesha:/foo/bar",
             "squash": "none",
             "security_label": True,
@@ -1310,7 +1312,7 @@ class NFSClusterProtocolHelperTestCase(test.TestCase):
         nfs_clusterid = self._nfscluster_protocol_helper.nfs_clusterid
 
         access_deny_dict = {
-            "nfs_cluster_id": nfs_clusterid,
+            "cluster_id": nfs_clusterid,
             "pseudo_path": "ganesha:/foo/bar"
         }
 
@@ -1325,7 +1327,7 @@ class NFSClusterProtocolHelperTestCase(test.TestCase):
         nfs_clusterid = self._nfscluster_protocol_helper.nfs_clusterid
 
         cluster_info_dict = {
-            "nfs_cluster_id": nfs_clusterid,
+            "cluster_id": nfs_clusterid,
         }
 
         cluster_info = {"fs-manila": {
diff --git a/manila/tests/share/drivers/macrosan/test_macrosan_nas.py b/manila/tests/share/drivers/macrosan/test_macrosan_nas.py
index 49b3fda..2fcc9a9 100644
--- a/manila/tests/share/drivers/macrosan/test_macrosan_nas.py
+++ b/manila/tests/share/drivers/macrosan/test_macrosan_nas.py
@@ -16,7 +16,6 @@
 """
 Share driver test for Macrosan Storage Array.
 """
-
 import ddt
 import requests
 
@@ -25,14 +24,13 @@ from unittest import mock
 
 from manila import context
 from manila import exception
-from manila import test
-
 from manila.share import configuration
 from manila.share import driver
 from manila.share.drivers.macrosan import macrosan_constants as constants
 from manila.share.drivers.macrosan import macrosan_helper
 from manila.share.drivers.macrosan import macrosan_nas
 from manila.share.drivers.macrosan import rest_helper
+from manila import test
 from manila.tests import fake_share
 
 CONF = cfg.CONF
@@ -74,17 +72,20 @@ class MacrosanShareDriverTestCase(test.TestCase):
         self.configuration.macrosan_nas_prefix = 'nas'
         self.configuration.macrosan_share_pools = ['fake_pool']
         self.configuration.macrosan_timeout = 60
+        self.configuration.macrosan_ssl_cert_verify = False
 
         self.configuration.network_config_group = 'fake_network_config_group'
         self.configuration.admin_network_config_group = (
             'fake_admin_network_config_group')
         self.configuration.config_group = 'fake_config_group'
         self.configuration.reserved_share_percentage = 0
+        self.configuration.reserved_share_from_snapshot_percentage = 0
+        self.configuration.reserved_share_extend_percentage = 0
         self.configuration.filter_function = None
         self.configuration.goodness_function = None
         self.driver = macrosan_nas.MacrosanNasDriver(
             configuration=self.configuration)
-        self.resutl_success_storage_pools = {
+        self.result_success_storage_pools = {
             'code': 0,
             'message': 'success',
             'data': [{
@@ -202,17 +203,6 @@ class MacrosanShareDriverTestCase(test.TestCase):
     def test_create_share(self, share_proto):
         share = fake_share.fake_share(
             share_proto=share_proto, host="fake_host@fake_backend#fake_pool")
-        self.mock_object(rest_helper.RestHelper, '_get_all_pool')
-        self.mock_object(
-            macrosan_helper.MacrosanHelper, '_find_pool_info',
-            mock.Mock(return_value={
-                "name": "fake_pool",
-                "totalcapacity": "10G",
-                "allocatedcapacity": "0G",
-                "freecapacity": "10G",
-                "health": "ONLINE",
-                "rw": "off"
-            }))
         mock_cf = self.mock_object(rest_helper.RestHelper,
                                    '_create_filesystem')
         mock_cfd = self.mock_object(rest_helper.RestHelper,
@@ -245,36 +235,9 @@ class MacrosanShareDriverTestCase(test.TestCase):
         else:
             mock_ccs.assert_called_once()
 
-    def test_create_share_pool_fail(self):
-        share = fake_share.fake_share(
-            share_proto='nfs', host="fake_host@fake_backend#fake_pool")
-        self.mock_object(rest_helper.RestHelper, '_get_all_pool')
-        self.mock_object(macrosan_helper.MacrosanHelper, '_find_pool_info',
-                         mock.Mock(return_value=None))
-        self.mock_object(
-            rest_helper.RestHelper, '_create_filesystem')
-        self.mock_object(
-            rest_helper.RestHelper, '_create_nfs_share')
-
-        self.assertRaises(exception.InvalidHost,
-                          self.driver.create_share,
-                          self._context,
-                          share)
-
     def test_create_share_user_error(self):
         share = fake_share.fake_share(
             share_proto='cifs', host="fake_host@fake_backend#fake_pool")
-        self.mock_object(rest_helper.RestHelper, '_get_all_pool')
-        self.mock_object(
-            macrosan_helper.MacrosanHelper, '_find_pool_info',
-            mock.Mock(return_value={
-                "name": "fake_pool",
-                "totalcapacity": "10G",
-                "allocatedcapacity": "0G",
-                "freecapacity": "10G",
-                "health": "ONLINE",
-                "rw": "off"
-            }))
         mock_cf = self.mock_object(rest_helper.RestHelper,
                                    '_create_filesystem')
         mock_cfd = self.mock_object(rest_helper.RestHelper,
@@ -758,7 +721,6 @@ class MacrosanShareDriverTestCase(test.TestCase):
                 'access_type': 'ip',
                 'access_to': '172.0.0.1',
                 'access_level': 'rw',
-
             }
         else:
             access = {
@@ -1310,13 +1272,13 @@ class MacrosanShareDriverTestCase(test.TestCase):
     def test__find_pool_info(self):
         pool_info = self.driver.helper._find_pool_info(
             'fake_pool',
-            self.resutl_success_storage_pools)
+            self.result_success_storage_pools)
         self.assertIsNotNone(pool_info)
 
     def test__find_pool_info_fail(self):
         pool_info = self.driver.helper._find_pool_info(
             'error_pool',
-            self.resutl_success_storage_pools)
+            self.result_success_storage_pools)
         expect = {}
         self.assertEqual(expect, pool_info)
 
@@ -1340,6 +1302,7 @@ class RestHelperTestCase(test.TestCase):
         self.configuration.macrosan_nas_username = 'fake_username'
         self.configuration.macrosan_nas_password = 'fake_password'
         self.configuration.macrosan_timeout = 60
+        self.configuration.macrosan_ssl_cert_verify = False
         self.resthelper = rest_helper.RestHelper(
             configuration=self.configuration)
         self.post = 'POST'
@@ -1372,7 +1335,7 @@ class RestHelperTestCase(test.TestCase):
             'message': 'failed',
             'data': '',
         }
-        self.resutl_success_storage_pools = {
+        self.result_success_storage_pools = {
             'code': 0,
             'message': 'success',
             'data': [{
@@ -1532,7 +1495,7 @@ class RestHelperTestCase(test.TestCase):
         data = {
             'path': 'fake_path',
             'authority': 'ro',
-            'accessClient': '172.0.0.2',
+            'accessClient': '192.0.2.0',
         }
         mock_call.assert_called_once_with(url, data, self.post)
 
@@ -2229,11 +2192,11 @@ class RestHelperTestCase(test.TestCase):
         mock_call = self.mock_object(
             self.resthelper,
             'call',
-            mock.Mock(return_value=self.resutl_success_storage_pools))
+            mock.Mock(return_value=self.result_success_storage_pools))
         self.mock_object(self.resthelper,
                          '_assert_result_code')
         result = self.resthelper._get_all_pool()
-        self.assertEqual(self.resutl_success_storage_pools, result)
+        self.assertEqual(self.result_success_storage_pools, result)
         url = 'rest/storagepool'
         mock_call.assert_called_once_with(url, None, self.get)
 
diff --git a/manila/tests/share/test_api.py b/manila/tests/share/test_api.py
index e1a7ed2..44b9c53 100644
--- a/manila/tests/share/test_api.py
+++ b/manila/tests/share/test_api.py
@@ -2640,10 +2640,29 @@ class ShareAPITestCase(test.TestCase):
             result = self.api.get(self.context, 'fakeid')
             self.assertEqual(share, result)
             share_api.policy.check_policy.assert_called_once_with(
-                self.context, 'share', 'get', share)
+                self.context, 'share', 'get', share, do_raise=False)
             db_api.share_get.assert_called_once_with(
                 self.context, 'fakeid')
 
+    def test_get_not_authorized(self):
+        share = db_utils.create_share(
+            is_public=False,
+            project_id='5db325fc4de14fe1a860ff69f190c78c')
+        share_api.policy.check_policy.return_value = False
+        ctx = context.RequestContext('df6d65cc1f8946ba86be06b8140ec4b3',
+                                     'e8133457b853436591a7e4610e7ce679',
+                                     is_admin=False)
+        with mock.patch.object(db_api, 'share_get',
+                               mock.Mock(return_value=share)):
+
+            self.assertRaises(exception.NotFound,
+                              self.api.get,
+                              ctx,
+                              share['id'])
+            share_api.policy.check_policy.assert_called_once_with(
+                ctx, 'share', 'get', share, do_raise=False)
+            db_api.share_get.assert_called_once_with(ctx, share['id'])
+
     @mock.patch.object(db_api, 'share_snapshot_get_all_by_project',
                        mock.Mock())
     def test_get_all_snapshots_admin_not_all_tenants(self):
diff --git a/releasenote/notes/macrosan-add-configuration-option-282fa1026748c4f9.yaml b/releasenote/notes/macrosan-add-configuration-option-282fa1026748c4f9.yaml
new file mode 100644
index 0000000..a711af9
--- /dev/null
+++ b/releasenote/notes/macrosan-add-configuration-option-282fa1026748c4f9.yaml
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - Added a new configuration option ``macrosan_ssl_cert_verfiy`` to configure
+    whether the driver should only allow verified ssl certificates. This option
+    defaults to ``False`` to allow backwards compatibility.
\ No newline at end of file
diff --git a/releasenotes/notes/bug-1901210-return-404-if-share-access-forbidden-02ca9a9552ad3e15.yaml b/releasenotes/notes/bug-1901210-return-404-if-share-access-forbidden-02ca9a9552ad3e15.yaml
new file mode 100644
index 0000000..80f72c7
--- /dev/null
+++ b/releasenotes/notes/bug-1901210-return-404-if-share-access-forbidden-02ca9a9552ad3e15.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    The GET /shares/{share_id} API now responds with HTTP 404 (Not Found)
+    for inaccessible resources. See `bug 1901210
+    <https://launchpad.net/bugs/1901210>`_ for further information.
diff --git a/releasenotes/notes/bug-1991378-fix-cluster_id-param-cephfs-nfs-2ddc4ff98141b9b9.yaml b/releasenotes/notes/bug-1991378-fix-cluster_id-param-cephfs-nfs-2ddc4ff98141b9b9.yaml
new file mode 100644
index 0000000..e8a7b3c
--- /dev/null
+++ b/releasenotes/notes/bug-1991378-fix-cluster_id-param-cephfs-nfs-2ddc4ff98141b9b9.yaml
@@ -0,0 +1,9 @@
+---
+fixes:
+  - |
+    The CephFS NFS driver, specifically the NFSProtocolHelper
+    implementation, was passing a wrong param to the Ceph backend
+    and this was preventing users to add and deny access to the
+    created shares. With this fix, users of the CephFS NFS
+    NFSProtocolHelper can normally create and remove access
+    to their shares.
diff --git a/releasenotes/notes/bug-1991396-add-glance-endpoint-type-151777f255e423a3.yaml b/releasenotes/notes/bug-1991396-add-glance-endpoint-type-151777f255e423a3.yaml
new file mode 100644
index 0000000..094978c
--- /dev/null
+++ b/releasenotes/notes/bug-1991396-add-glance-endpoint-type-151777f255e423a3.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+  - |
+    Deployers now can specify ``[glance]endpoint_type`` configuration option
+    (defaults to ``publicURL`` for backward compatibility)
+    so that Manila uses Glance endpoint other than the public one
+    (see `bug 1991396 <https://bugs.launchpad.net/manila/+bug/1991396>`_).
diff --git a/releasenotes/notes/bug-1991776-cephfs-configured-ip-versions-fd87976fdb848e8c.yaml b/releasenotes/notes/bug-1991776-cephfs-configured-ip-versions-fd87976fdb848e8c.yaml
new file mode 100644
index 0000000..cd3972b
--- /dev/null
+++ b/releasenotes/notes/bug-1991776-cephfs-configured-ip-versions-fd87976fdb848e8c.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    `Bug 1991776 <https://launchpad.net/bugs/1991776>`_ was fixed within the
+    CephFS driver. The driver no longer emits repeated warnings concerning
+    supported IP versions when using the NFS protocol.
diff --git a/releasenotes/notes/fix-neutron-plugin-invalid-key-dict-68c3d6bcbf2f19f0.yaml b/releasenotes/notes/fix-neutron-plugin-invalid-key-dict-68c3d6bcbf2f19f0.yaml
new file mode 100644
index 0000000..bf6972c
--- /dev/null
+++ b/releasenotes/notes/fix-neutron-plugin-invalid-key-dict-68c3d6bcbf2f19f0.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+  - |
+    Some neutron integrations might not have the network type, so the neutron network
+    plugin is fixed by taking that scenario in consideration.
+    `Launchpad bug  #1987315 <https://bugs.launchpad.ne/manila/+bug/1987315>`_
+    for more details.
diff --git a/tox.ini b/tox.ini
index 9a06169..e2b382b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -14,7 +14,7 @@ setenv =
   VIRTUAL_ENV={envdir}
   PYTHONDONTWRITEBYTECODE=1
 deps =
-  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/zed}
   -r{toxinidir}/requirements.txt
   -r{toxinidir}/test-requirements.txt
 commands =
@@ -23,7 +23,7 @@ commands =
 
 [testenv:releasenotes]
 deps =
-  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/zed}
   -r{toxinidir}/doc/requirements.txt
 commands =
   rm -rf releasenotes/build
@@ -33,7 +33,7 @@ allowlist_externals = rm
 
 [testenv:newnote]
 deps =
--c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/zed}
   -r{toxinidir}/doc/requirements.txt
 commands = reno new {posargs}
 
@@ -77,7 +77,7 @@ commands = {posargs}
 # dependencies are installed during 'develop-inst' tox phase without
 # constraints which could cause failures in stable branches.
 deps =
-  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+  -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/zed}
   -r{toxinidir}/requirements.txt
   -r{toxinidir}/doc/requirements.txt
 commands =
diff --git a/zuul.d/grenade-jobs.yaml b/zuul.d/grenade-jobs.yaml
index 00049da..5ea42c7 100644
--- a/zuul.d/grenade-jobs.yaml
+++ b/zuul.d/grenade-jobs.yaml
@@ -97,6 +97,11 @@
       Grenade job that skips a release, validating that deployers can skip
       specific releases as prescribed by our process.
     parent: manila-grenade
+    # wallaby's constrained to use tempest===27.0.0; when that updates to
+    # tempest>=31.1.0, we can remove this manila-tempest-plugin version pinning
+    required-projects:
+      - name: openstack/manila-tempest-plugin
+        override-checkout: 1.8.0
     vars:
       # Move this forward when master changes to a new skip-level-allowed
       # target release. Right now, this is wallaby because master is yoga.
