use of com.emc.storageos.model.RestLinkRep in project coprhd-controller by CoprHD.
the class ApprovalService method getOtherSearchResults.
/**
* parameter: 'orderId' The id of the order to search for approvals
* parameter: 'approvalStatus' The status for the approval.
* parameter: 'tenantId' The id of the tenant (if not the current tenant)
*
* @return Return a list of matching approvals or an empty list if no match was found.
*/
@Override
protected SearchResults getOtherSearchResults(Map<String, List<String>> parameters, boolean authorized) {
StorageOSUser user = getUserFromContext();
String tenantId = user.getTenantId();
if (parameters.containsKey(SearchConstants.TENANT_ID_PARAM)) {
tenantId = parameters.get(SearchConstants.TENANT_ID_PARAM).get(0);
}
verifyAuthorizedInTenantOrg(uri(tenantId), user);
if (!parameters.containsKey(SearchConstants.ORDER_ID_PARAM) && !parameters.containsKey(SearchConstants.APPROVAL_STATUS_PARAM)) {
throw APIException.badRequests.invalidParameterSearchMissingParameter(getResourceClass().getName(), SearchConstants.ORDER_ID_PARAM + " or " + SearchConstants.APPROVAL_STATUS_PARAM);
}
if (parameters.containsKey(SearchConstants.ORDER_ID_PARAM) && parameters.containsKey(SearchConstants.APPROVAL_STATUS_PARAM)) {
throw APIException.badRequests.parameterForSearchCouldNotBeCombinedWithAnyOtherParameter(getResourceClass().getName(), SearchConstants.ORDER_ID_PARAM, SearchConstants.APPROVAL_STATUS_PARAM);
}
List<ApprovalRequest> approvals = Lists.newArrayList();
if (parameters.containsKey(SearchConstants.ORDER_ID_PARAM)) {
String orderId = parameters.get(SearchConstants.ORDER_ID_PARAM).get(0);
ArgValidator.checkFieldNotEmpty(orderId, SearchConstants.ORDER_ID_PARAM);
approvals = approvalManager.findApprovalsByOrderId(uri(orderId));
} else if (parameters.containsKey(SearchConstants.APPROVAL_STATUS_PARAM)) {
String approvalStatus = parameters.get(SearchConstants.APPROVAL_STATUS_PARAM).get(0);
ArgValidator.checkFieldNotEmpty(approvalStatus, SearchConstants.APPROVAL_STATUS_PARAM);
approvals = approvalManager.findApprovalsByStatus(uri(tenantId), ApprovalStatus.valueOf(approvalStatus));
}
ResRepFilter<SearchResultResourceRep> resRepFilter = (ResRepFilter<SearchResultResourceRep>) getPermissionFilter(getUserFromContext(), _permissionsHelper);
List<SearchResultResourceRep> searchResultResourceReps = Lists.newArrayList();
for (ApprovalRequest approval : approvals) {
RestLinkRep selfLink = new RestLinkRep("self", RestLinkFactory.newLink(getResourceType(), approval.getId()));
SearchResultResourceRep searchResultResourceRep = new SearchResultResourceRep();
searchResultResourceRep.setId(approval.getId());
searchResultResourceRep.setLink(selfLink);
if (authorized || resRepFilter.isAccessible(searchResultResourceRep)) {
searchResultResourceReps.add(searchResultResourceRep);
}
}
SearchResults result = new SearchResults();
result.setResource(searchResultResourceReps);
return result;
}
use of com.emc.storageos.model.RestLinkRep in project coprhd-controller by CoprHD.
the class TrustStoreTest method addResourcesShouldSucceed.
/**
*/
private void addResourcesShouldSucceed() {
resourcesToRemove = new ArrayList<RestLinkRep>();
ClientResponse response = addLDAPSAuthProvider();
Assert.assertEquals(200, response.getStatus());
AuthnProviderRestRep authnResp = response.getEntity(AuthnProviderRestRep.class);
Assert.assertNotNull(authnResp);
resourcesToRemove.add(authnResp.getLink());
}
use of com.emc.storageos.model.RestLinkRep in project coprhd-controller by CoprHD.
the class TaskService method getAllTasks.
// Original method to return task list. Will be used when max_count is either NOT specified or set but > max limit like 10K.
// This could cause out of memory issue
private TasksList getAllTasks(Set<URI> tenantIds, String startTime, String endTime, Integer maxCount) {
// Entries from the index, sorted with most recent first
Set<TimestampedURIQueryResult.TimestampedURI> sortedIndexEntries = Sets.newTreeSet(new TaskComparator());
Date startWindowDate = TimeUtils.getDateTimestamp(startTime);
Date endWindowDate = TimeUtils.getDateTimestamp(endTime);
// Fetch index entries and load into sorted set
List<NamedRelatedResourceRep> resourceReps = Lists.newArrayList();
for (URI normalizedTenantId : tenantIds) {
TimestampedURIQueryResult taskIds = new TimestampedURIQueryResult();
_dbClient.queryByConstraint(ContainmentConstraint.Factory.getTimedTenantOrgTaskConstraint(normalizedTenantId, startWindowDate, endWindowDate), taskIds);
Iterator<TimestampedURIQueryResult.TimestampedURI> it = taskIds.iterator();
while (it.hasNext()) {
TimestampedURIQueryResult.TimestampedURI timestampedURI = it.next();
sortedIndexEntries.add(timestampedURI);
}
}
if (maxCount == null || maxCount < 0) {
maxCount = FETCH_ALL;
} else {
maxCount = Math.min(maxCount, sortedIndexEntries.size());
}
// Produce the requested number of results
Iterator<TimestampedURIQueryResult.TimestampedURI> it = sortedIndexEntries.iterator();
int pos = 0;
while (it.hasNext() && (maxCount == FETCH_ALL || pos < maxCount)) {
TimestampedURIQueryResult.TimestampedURI uri = it.next();
RestLinkRep link = new RestLinkRep("self", RestLinkFactory.newLink(ResourceTypeEnum.TASK, uri.getUri()));
resourceReps.add(new NamedRelatedResourceRep(uri.getUri(), link, uri.getName()));
pos++;
}
return new TasksList(resourceReps);
}
use of com.emc.storageos.model.RestLinkRep in project coprhd-controller by CoprHD.
the class SearchedResRepList method createQueryHit.
@Override
public SearchResultResourceRep createQueryHit(URI uri) {
RestLinkRep selfLink = new RestLinkRep("self", RestLinkFactory.newLink(_type, uri));
SearchResultResourceRep r = new SearchResultResourceRep(uri, selfLink, null);
return r;
}
use of com.emc.storageos.model.RestLinkRep in project coprhd-controller by CoprHD.
the class BlockService method getOtherSearchResults.
/**
* Additional search criteria for a volume.
*
* If a matching volume is not found, an empty list is returned.
*
* Parameters - wwn String - WWN of the volume
* - virtual_array String - URI of the source virtual array
* - personality String - source, target, metadata
*/
@Override
protected SearchResults getOtherSearchResults(Map<String, List<String>> parameters, boolean authorized) {
SearchResults result = new SearchResults();
String[] searchCriteria = { SEARCH_WWN, SEARCH_VARRAY, SEARCH_PERSONALITY, SEARCH_PROTECTION };
// Make sure the parameters passed in contain at least one of our search criteria
// Here we search by wwn or virtual_array
boolean found = false;
for (String search : searchCriteria) {
if (parameters.containsKey(search)) {
found = true;
}
}
if (!found) {
throw APIException.badRequests.invalidParameterSearchMissingParameter(getResourceClass().getName(), searchCriteria.toString());
}
// Make sure all parameters are our parameters, otherwise post an exception because we don't support other
// search criteria than our
// own.
String nonVolumeKey = null;
for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
found = false;
for (String search : searchCriteria) {
if (entry.getKey().equals(search)) {
found = true;
}
}
if (!found) {
nonVolumeKey = entry.getKey();
}
}
if (nonVolumeKey != null) {
throw APIException.badRequests.parameterForSearchCouldNotBeCombinedWithAnyOtherParameter(getResourceClass().getName(), searchCriteria.toString(), nonVolumeKey);
}
boolean simpleSearch = false;
// Now perform individual searches based on the input criteria. These results are stored and joined later if
// there were
// multiple search criteria.
List<List<SearchResultResourceRep>> resRepLists = new ArrayList<List<SearchResultResourceRep>>();
for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
for (String searchValue : entry.getValue()) {
SearchedResRepList resRepList = new SearchedResRepList(getResourceType());
if (entry.getKey().equals(SEARCH_WWN)) {
simpleSearch = true;
String wwn = searchValue;
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getVolumeWwnConstraint(wwn.toUpperCase()), resRepList);
} else if (entry.getKey().equals(SEARCH_VARRAY)) {
simpleSearch = true;
String varrayId = searchValue;
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getConstraint(Volume.class, "varray", varrayId), resRepList);
} else if (entry.getKey().equals(SEARCH_PERSONALITY)) {
simpleSearch = true;
String personality = searchValue;
// Validate the personality type
boolean valid = false;
for (PersonalityTypes personalityType : Volume.PersonalityTypes.values()) {
if (personalityType.toString().equals(personality)) {
valid = true;
}
}
if (!valid) {
throw APIException.badRequests.parameterForSearchHasInvalidSearchValueWithSuggestions(getResourceClass().getName(), entry.getKey(), personality, PersonalityTypes.values());
}
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getConstraint(Volume.class, "personality", personality), resRepList);
}
// Convert to a list; SearchedResRepList is immutable and not really made for what we're doing here.
List<SearchResultResourceRep> repList = new ArrayList<SearchResultResourceRep>();
if (resRepList.iterator() != null) {
for (SearchResultResourceRep res : resRepList) {
repList.add(res);
}
resRepLists.add(repList);
}
}
}
// Now perform a "join" on the resRepList entries to create a single set of resources
Set<SearchResultResourceRep> resRepSet = new HashSet<SearchResultResourceRep>();
for (List<SearchResultResourceRep> resList : resRepLists) {
for (SearchResultResourceRep res : resList) {
resRepSet.add(res);
}
}
// Remove entries that aren't in every collection
for (List<SearchResultResourceRep> resList : resRepLists) {
resRepSet.retainAll(resList);
}
//
// Non-Indexed (manual) query result business logic goes here, after we've already reduced the list
//
boolean advancedQuery = false;
if (parameters.containsKey(SEARCH_PROTECTION)) {
// Prevent the expensive advanced query unless you see certain parameters
advancedQuery = true;
}
// resRepSet
if (advancedQuery) {
// simple parameters, like personality=SOURCE to pre-fill a much smaller list of objects and avoid this.
if (!simpleSearch) {
List<URI> volumes = _dbClient.queryByType(Volume.class, true);
for (URI volumeId : volumes) {
RestLinkRep selfLink = new RestLinkRep("self", RestLinkFactory.newLink(ResourceTypeEnum.VOLUME, volumeId));
resRepSet.add(new SearchResultResourceRep(volumeId, selfLink, null));
}
_log.warn(String.format("Performance of Volume search is poor when specifying only %s with no additional search parameters." + "Search performs faster when combined with other parameters such as %s, %s", SEARCH_PROTECTION, SEARCH_PERSONALITY, SEARCH_VARRAY));
}
List<SearchResultResourceRep> resToInclude = new ArrayList<SearchResultResourceRep>();
for (SearchResultResourceRep res : resRepSet) {
Volume volume = _dbClient.queryObject(Volume.class, res.getId());
boolean personalityIsSource = volume.getPersonality() == null || volume.getPersonality().equalsIgnoreCase(Volume.PersonalityTypes.SOURCE.toString());
boolean ha = volume.getAssociatedVolumes() != null && !volume.getAssociatedVolumes().isEmpty();
boolean srdf = volume.getSrdfTargets() != null && !volume.getSrdfTargets().isEmpty();
boolean rp = volume.getRpTargets() != null && !volume.getRpTargets().isEmpty();
boolean isProtected = personalityIsSource && (ha || srdf || rp);
boolean includeResource = true;
for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
for (String searchValue : entry.getValue()) {
if (entry.getKey().equals(SEARCH_PROTECTION)) {
// Validate the protection parameter
boolean valid = false;
String[] validProtection = { TRUE_STR, FALSE_STR, RP, SRDF, VPLEX, HA };
for (String validValue : validProtection) {
if (validValue.toString().equalsIgnoreCase(searchValue)) {
valid = true;
}
}
if (!valid) {
throw APIException.badRequests.parameterForSearchHasInvalidSearchValueWithSuggestions(getResourceClass().getName(), entry.getKey(), searchValue, validProtection);
}
if ((searchValue.equals(TRUE_STR) && !isProtected) || (searchValue.equals(FALSE_STR) && isProtected)) {
includeResource = false;
} else if (searchValue.equalsIgnoreCase(RP) && !rp) {
includeResource = false;
} else if ((searchValue.equalsIgnoreCase(VPLEX) || searchValue.equalsIgnoreCase(HA)) && !ha) {
includeResource = false;
} else if (searchValue.equalsIgnoreCase(SRDF) && !srdf) {
includeResource = false;
}
}
}
}
if (includeResource) {
resToInclude.add(res);
}
}
// Reduce the set
resRepSet.retainAll(resToInclude);
}
// Convert to a format consumable by our utilities
List<SearchResultResourceRep> resRepList = new ArrayList<SearchResultResourceRep>();
for (SearchResultResourceRep res : resRepSet) {
resRepList.add(res);
}
if (!authorized) {
Iterator<SearchResultResourceRep> _queryResultIterator = resRepList.iterator();
ResRepFilter<SearchResultResourceRep> resrepFilter = (ResRepFilter<SearchResultResourceRep>) getPermissionFilter(getUserFromContext(), _permissionsHelper);
SearchedResRepList filteredResRepList = new SearchedResRepList();
filteredResRepList.setResult(new FilterIterator<SearchResultResourceRep>(_queryResultIterator, resrepFilter));
result.setResource(filteredResRepList);
} else {
result.setResource(resRepList);
}
return result;
}
Aggregations