Files
cinder/cinder/api/v3/snapshots.py
T
Vivek Agrawal f5cdbe8f74 Adds metadata in search option for snapshot
With this change one should be able to search snapshots
based on snapshot metadata keys too.
Adding test cases for querying snapshot based on
metadata. Adding support to API V3.
Adding a new microversion for this.

DocImpact
APIImpact
Closes-Bug: #1569554

Change-Id: I7f3a8b9eea69e4320ac7c394910278807a0ce100
2017-01-04 16:21:20 +00:00

107 lines
4.0 KiB
Python

# Copyright 2016 EMC Corporation
# All Rights Reserved.
#
# 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.
"""The volumes snapshots V3 api."""
import ast
from oslo_log import log as logging
from cinder.api import common
from cinder.api.openstack import wsgi
from cinder.api.v2 import snapshots as snapshots_v2
from cinder.api.v3.views import snapshots as snapshot_views
from cinder import utils
LOG = logging.getLogger(__name__)
class SnapshotsController(snapshots_v2.SnapshotsController):
"""The Snapshots API controller for the OpenStack API."""
_view_builder_class = snapshot_views.ViewBuilder
def _get_snapshot_filter_options(self):
"""returns tuple of valid filter options"""
return 'status', 'volume_id', 'name', 'metadata'
def _format_snapshot_filter_options(self, search_opts):
"""Convert valid filter options to correct expected format"""
# Get the dict object out of queried metadata
# convert metadata query value from string to dict
if 'metadata' in search_opts.keys():
try:
search_opts['metadata'] = ast.literal_eval(
search_opts['metadata'])
except (ValueError, SyntaxError):
LOG.debug('Could not evaluate value %s, assuming string',
search_opts['metadata'])
def _process_filters(self, req, context, search_opts):
"""Formats allowed filters"""
req_version = req.api_version_request
# if the max version is less than or same as 3.21
# metadata based filtering is not supported
if req_version.matches(None, "3.21"):
search_opts.pop('metadata', None)
# Filter out invalid options
allowed_search_options = self._get_snapshot_filter_options()
utils.remove_invalid_filter_options(context, search_opts,
allowed_search_options)
# process snapshot filters to appropriate formats if required
self._format_snapshot_filter_options(search_opts)
def _items(self, req, is_detail=True):
"""Returns a list of snapshots, transformed through view builder."""
context = req.environ['cinder.context']
# Pop out non search_opts and create local variables
search_opts = req.GET.copy()
sort_keys, sort_dirs = common.get_sort_params(search_opts)
marker, limit, offset = common.get_pagination_params(search_opts)
# process filters
self._process_filters(req, context, search_opts)
# NOTE(thingee): v3 API allows name instead of display_name
if 'name' in search_opts:
search_opts['display_name'] = search_opts.pop('name')
snapshots = self.volume_api.get_all_snapshots(context,
search_opts=search_opts,
marker=marker,
limit=limit,
sort_keys=sort_keys,
sort_dirs=sort_dirs,
offset=offset)
req.cache_db_snapshots(snapshots.objects)
if is_detail:
snapshots = self._view_builder.detail_list(req, snapshots.objects)
else:
snapshots = self._view_builder.summary_list(req, snapshots.objects)
return snapshots
def create_resource(ext_mgr):
return wsgi.Resource(SnapshotsController(ext_mgr))