volume: Allow setting volume statuses individually

Some of these are admin-only. We don't want to force setting them all at
once.

Change-Id: I3b1694ee5e4dfd96315cc48b44b3d28c01aa3bfa
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2024-04-08 12:30:06 +01:00
parent 601b21acad
commit 52c5d74518
6 changed files with 57 additions and 18 deletions

View File

@ -385,7 +385,7 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
volume.set_bootable_status(self, bootable)
def reset_volume_status(
self, volume, status, attach_status, migration_status
self, volume, status=None, attach_status=None, migration_status=None
):
"""Reset volume statuses.

View File

@ -9,6 +9,9 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import typing as ty
from openstack.common import metadata
from openstack import format
from openstack import resource
@ -114,15 +117,17 @@ class Volume(resource.Resource, metadata.MetadataMixin):
body = {'os-set_bootable': {'bootable': bootable}}
self._action(session, body)
def reset_status(self, session, status, attach_status, migration_status):
def reset_status(
self, session, status=None, attach_status=None, migration_status=None
):
"""Reset volume statuses (admin operation)"""
body = {
'os-reset_status': {
'status': status,
'attach_status': attach_status,
'migration_status': migration_status,
}
}
body: ty.Dict[str, ty.Dict[str, str]] = {'os-reset_status': {}}
if status:
body['os-reset_status']['status'] = status
if attach_status:
body['os-reset_status']['attach_status'] = attach_status
if migration_status:
body['os-reset_status']['migration_status'] = migration_status
self._action(session, body)
def attach(self, session, mountpoint, instance):

View File

@ -771,7 +771,7 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
volume.set_bootable_status(self, bootable)
def reset_volume_status(
self, volume, status, attach_status, migration_status
self, volume, status=None, attach_status=None, migration_status=None
):
"""Reset volume statuses.

View File

@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import typing as ty
from openstack.common import metadata
from openstack import exceptions
from openstack import format
@ -138,15 +140,17 @@ class Volume(resource.Resource, metadata.MetadataMixin):
body = {'os-update_readonly_flag': {'readonly': readonly}}
self._action(session, body)
def reset_status(self, session, status, attach_status, migration_status):
def reset_status(
self, session, status=None, attach_status=None, migration_status=None
):
"""Reset volume statuses (admin operation)"""
body = {
'os-reset_status': {
'status': status,
'attach_status': attach_status,
'migration_status': migration_status,
}
}
body: ty.Dict[str, ty.Dict[str, str]] = {'os-reset_status': {}}
if status:
body['os-reset_status']['status'] = status
if attach_status:
body['os-reset_status']['attach_status'] = attach_status
if migration_status:
body['os-reset_status']['migration_status'] = migration_status
self._action(session, body)
def revert_to_snapshot(self, session, snapshot_id):

View File

@ -198,6 +198,21 @@ class TestVolumeActions(TestVolume):
url, json=body, microversion=sot._max_microversion
)
def test_reset_status__single_option(self):
sot = volume.Volume(**VOLUME)
self.assertIsNone(sot.reset_status(self.sess, status='1'))
url = 'volumes/%s/action' % FAKE_ID
body = {
'os-reset_status': {
'status': '1',
}
}
self.sess.post.assert_called_with(
url, json=body, microversion=sot._max_microversion
)
def test_attach_instance(self):
sot = volume.Volume(**VOLUME)

View File

@ -227,6 +227,21 @@ class TestVolumeActions(TestVolume):
url, json=body, microversion=sot._max_microversion
)
def test_reset_status__single_option(self):
sot = volume.Volume(**VOLUME)
self.assertIsNone(sot.reset_status(self.sess, status='1'))
url = 'volumes/%s/action' % FAKE_ID
body = {
'os-reset_status': {
'status': '1',
}
}
self.sess.post.assert_called_with(
url, json=body, microversion=sot._max_microversion
)
@mock.patch(
'openstack.utils.require_microversion',
autospec=True,