diff --git a/doc/source/backwards-incompatible.rst b/doc/source/backwards-incompatible.rst
index 22c300de05..0202e8a5a1 100644
--- a/doc/source/backwards-incompatible.rst
+++ b/doc/source/backwards-incompatible.rst
@@ -27,6 +27,21 @@ Backwards Incompatible Changes
 ..   * Remove in: <5.0>
 ..   * Commit: <tbd>
 
+Release 3.10
+------------
+
+1. The positional argument ``<snapshot-name>`` of the ``volume snapshot create``
+   command is no longer optional.
+
+   Previously when the ``--volume`` option was
+   present ``<snapshot-name>`` defaulted to the ``--volume`` value.  When the
+   ``--volume`` option is not present now it defaults to the value of
+   ``<snapshot-name>``.
+
+  * As of: 3.10
+  * Bug: 1659894
+  * Commit: https://review.openstack.org/440497
+
 Release 3.0
 -----------
 
diff --git a/doc/source/command-objects/volume-snapshot.rst b/doc/source/command-objects/volume-snapshot.rst
index 67db62f2b8..30cc77cc57 100644
--- a/doc/source/command-objects/volume-snapshot.rst
+++ b/doc/source/command-objects/volume-snapshot.rst
@@ -49,7 +49,7 @@ Create new volume snapshot
 .. _volume_snapshot_create-snapshot-name:
 .. describe:: <snapshot-name>
 
-    Name of the new snapshot (default to None)
+    Name of the new snapshot
 
 volume snapshot delete
 ----------------------
diff --git a/openstackclient/tests/unit/volume/v1/test_snapshot.py b/openstackclient/tests/unit/volume/v1/test_snapshot.py
index 87a62b0a9b..70b55ce235 100644
--- a/openstackclient/tests/unit/volume/v1/test_snapshot.py
+++ b/openstackclient/tests/unit/volume/v1/test_snapshot.py
@@ -18,6 +18,7 @@ from mock import call
 from osc_lib import exceptions
 from osc_lib import utils
 
+from openstackclient.tests.unit import utils as tests_utils
 from openstackclient.tests.unit.volume.v1 import fakes as volume_fakes
 from openstackclient.volume.v1 import volume_snapshot
 
@@ -98,26 +99,17 @@ class TestSnapshotCreate(TestSnapshot):
     def test_snapshot_create_without_name(self):
         arglist = [
             "--volume", self.new_snapshot.volume_id,
-            "--description", self.new_snapshot.display_description,
-            "--force"
         ]
         verifylist = [
             ("volume", self.new_snapshot.volume_id),
-            ("description", self.new_snapshot.display_description),
-            ("force", True)
         ]
-        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
-        columns, data = self.cmd.take_action(parsed_args)
-
-        self.snapshots_mock.create.assert_called_with(
-            self.new_snapshot.volume_id,
-            True,
-            None,
-            self.new_snapshot.display_description,
+        self.assertRaises(
+            tests_utils.ParserException,
+            self.check_parser,
+            self.cmd,
+            arglist,
+            verifylist,
         )
-        self.assertEqual(self.columns, columns)
-        self.assertEqual(self.data, data)
 
     def test_snapshot_create_without_volume(self):
         arglist = [
diff --git a/openstackclient/tests/unit/volume/v2/test_snapshot.py b/openstackclient/tests/unit/volume/v2/test_snapshot.py
index 1ad97e858a..16d0602b7c 100644
--- a/openstackclient/tests/unit/volume/v2/test_snapshot.py
+++ b/openstackclient/tests/unit/volume/v2/test_snapshot.py
@@ -20,6 +20,7 @@ from osc_lib import exceptions
 from osc_lib import utils
 
 from openstackclient.tests.unit.identity.v3 import fakes as project_fakes
+from openstackclient.tests.unit import utils as tests_utils
 from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
 from openstackclient.volume.v2 import volume_snapshot
 
@@ -107,27 +108,17 @@ class TestSnapshotCreate(TestSnapshot):
     def test_snapshot_create_without_name(self):
         arglist = [
             "--volume", self.new_snapshot.volume_id,
-            "--description", self.new_snapshot.description,
-            "--force"
         ]
         verifylist = [
             ("volume", self.new_snapshot.volume_id),
-            ("description", self.new_snapshot.description),
-            ("force", True)
         ]
-        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-
-        columns, data = self.cmd.take_action(parsed_args)
-
-        self.snapshots_mock.create.assert_called_with(
-            self.new_snapshot.volume_id,
-            force=True,
-            name=None,
-            description=self.new_snapshot.description,
-            metadata=None,
+        self.assertRaises(
+            tests_utils.ParserException,
+            self.check_parser,
+            self.cmd,
+            arglist,
+            verifylist,
         )
-        self.assertEqual(self.columns, columns)
-        self.assertEqual(self.data, data)
 
     def test_snapshot_create_without_volume(self):
         arglist = [
@@ -156,17 +147,19 @@ class TestSnapshotCreate(TestSnapshot):
         self.assertEqual(self.columns, columns)
         self.assertEqual(self.data, data)
 
-    def test_snapshot_create_without_remote_source(self):
+    def test_snapshot_create_with_remote_source(self):
         arglist = [
             '--remote-source', 'source-name=test_source_name',
             '--remote-source', 'source-id=test_source_id',
             '--volume', self.new_snapshot.volume_id,
+            self.new_snapshot.name,
         ]
         ref_dict = {'source-name': 'test_source_name',
                     'source-id': 'test_source_id'}
         verifylist = [
             ('remote_source', ref_dict),
             ('volume', self.new_snapshot.volume_id),
+            ("snapshot_name", self.new_snapshot.name),
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 
@@ -175,7 +168,7 @@ class TestSnapshotCreate(TestSnapshot):
         self.snapshots_mock.manage.assert_called_with(
             volume_id=self.new_snapshot.volume_id,
             ref=ref_dict,
-            name=None,
+            name=self.new_snapshot.name,
             description=None,
             metadata=None,
         )
diff --git a/openstackclient/volume/v1/volume_snapshot.py b/openstackclient/volume/v1/volume_snapshot.py
index f22c338b80..3e83da5a7b 100644
--- a/openstackclient/volume/v1/volume_snapshot.py
+++ b/openstackclient/volume/v1/volume_snapshot.py
@@ -38,8 +38,7 @@ class CreateVolumeSnapshot(command.ShowOne):
         parser.add_argument(
             'snapshot_name',
             metavar='<snapshot-name>',
-            nargs="?",
-            help=_('Name of the snapshot (default to None)'),
+            help=_('Name of the new snapshot'),
         )
         parser.add_argument(
             '--volume',
diff --git a/openstackclient/volume/v2/volume_snapshot.py b/openstackclient/volume/v2/volume_snapshot.py
index 804c829111..fe9694104a 100644
--- a/openstackclient/volume/v2/volume_snapshot.py
+++ b/openstackclient/volume/v2/volume_snapshot.py
@@ -38,8 +38,7 @@ class CreateVolumeSnapshot(command.ShowOne):
         parser.add_argument(
             "snapshot_name",
             metavar="<snapshot-name>",
-            nargs="?",
-            help=_("Name of the new snapshot (default to None)")
+            help=_("Name of the new snapshot"),
         )
         parser.add_argument(
             "--volume",
diff --git a/releasenotes/notes/bug-1659894-4518b10615498ba9.yaml b/releasenotes/notes/bug-1659894-4518b10615498ba9.yaml
new file mode 100644
index 0000000000..e1afbb45a2
--- /dev/null
+++ b/releasenotes/notes/bug-1659894-4518b10615498ba9.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    Now the positional parameter ``<snapshot-name>`` of ``volume snapshot create``
+    command is no longer optional, it should be always present.
+    [Bug `1659894 <https://bugs.launchpad.net/bugs/1659894>`_]