/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package util; import com.emc.storageos.model.NamedRelatedResourceRep; import com.emc.storageos.model.object.ObjectNamespaceList; import com.emc.storageos.model.object.ObjectNamespaceRestRep; import com.emc.storageos.model.quota.QuotaInfo; import com.emc.storageos.model.quota.QuotaUpdateParam; import com.emc.storageos.model.tenant.TenantCreateParam; import com.emc.storageos.model.tenant.TenantOrgRestRep; import com.emc.storageos.model.tenant.TenantUpdateParam; import com.emc.vipr.client.exceptions.ViPRHttpException; import com.google.common.collect.Lists; import controllers.security.Security; import org.apache.commons.lang.StringUtils; import java.net.URI; import java.util.Collections; import java.util.List; import static com.emc.vipr.client.core.util.ResourceUtils.id; import static com.emc.vipr.client.core.util.ResourceUtils.uri; import static util.BourneUtil.getViprClient; public class TenantUtils { //To represent the two additional options in the //tenant selector. private static final String NO_TENANT_SELECTOR = "[No-Filter]"; private static final String TENANT_SELECTOR_FOR_UNASSIGNED = "[Not-Assigned]"; private static final String API_NO_TENANT_SELECTOR = "No-Filter"; private static final String API_TENANT_SELECTOR_FOR_UNASSIGNED = "Not-Assigned"; public static boolean canReadAllTenants() { return Security.hasAnyRole(Security.ROOT_TENANT_ADMIN, Security.SECURITY_ADMIN, Security.SYSTEM_MONITOR); } public static boolean canReadAllTenantsForVcenters() { return Security.hasAnyRole(Security.ROOT_TENANT_ADMIN, Security.SYSTEM_MONITOR, Security.SYSTEM_ADMIN); } public static List<TenantOrgRestRep> getAllTenants() { List<TenantOrgRestRep> tenants = Lists.newArrayList(); TenantOrgRestRep rootTenant = findRootTenant(); tenants.add(rootTenant); tenants.addAll(getSubTenants(id(rootTenant))); return tenants; } public static List<TenantOrgRestRep> getSubTenants(String parentTenantId) { return getSubTenants(uri(parentTenantId)); } public static List<TenantOrgRestRep> getSubTenants(URI parentTenantId) { return getViprClient().tenants().getAllSubtenants(parentTenantId); } public static TenantOrgRestRep findRootTenant() { URI userTenantId = getViprClient().getUserTenantId(); TenantOrgRestRep currentTenant = getViprClient().tenants().get(userTenantId); while (currentTenant.getParentTenant() != null) { currentTenant = getViprClient().tenants().get(currentTenant.getParentTenant()); } return currentTenant; } public static TenantOrgRestRep getTenant(String tenantId) { try { return getViprClient().tenants().get(uri(tenantId)); } catch (ViPRHttpException e) { if (e.getHttpCode() == 404) { return null; } throw e; } } public static void update(String tenantId, TenantUpdateParam tenantUpdateParam) { getViprClient().tenants().update(uri(tenantId), tenantUpdateParam); } public static TenantOrgRestRep create(TenantCreateParam tenantCreateParam) { return getViprClient().tenants().create(tenantCreateParam); } public static List<StringOption> getUnmappedNamespace() { ObjectNamespaceList objNamespaceList = getViprClient().objectNamespace().getObjectNamespaces(); List<StringOption> namespaceOptions = Lists.newArrayList(); List<NamedRelatedResourceRep> ObjNamedList = objNamespaceList.getNamespaces(); for (NamedRelatedResourceRep namedRes : ObjNamedList) { URI uri = namedRes.getId(); ObjectNamespaceRestRep objNs = getViprClient().objectNamespace().getObjectNamespace(uri); if (objNs != null && objNs.getMapped() == false) { //only unmapped namespaces to be added to list namespaceOptions.add(new StringOption(objNs.getNativeId(), objNs.getNsName())); } } return namespaceOptions; } public static boolean isRootTenant(URI tenantId) { return isRootTenant(getViprClient().tenants().get(tenantId)); } public static boolean isRootTenant(TenantOrgRestRep tenant) { return tenant != null && tenant.getParentTenant() == null; } public static QuotaInfo getQuota(URI id) { return getViprClient().tenants().getQuota(id); } public static QuotaInfo getQuota(String id) { return getQuota(uri(id)); } public static QuotaInfo updateQuota(String id, boolean enable, Long sizeInGB) { if (enable) { return enableQuota(id, sizeInGB); } else { return disableQuota(id); } } public static QuotaInfo enableQuota(String id, Long sizeInGB) { return getViprClient().tenants().updateQuota(uri(id), new QuotaUpdateParam(true, sizeInGB)); } public static QuotaInfo disableQuota(String id) { return getViprClient().tenants().updateQuota(uri(id), new QuotaUpdateParam(false, null)); } public static boolean deactivate(URI tenantId) { if (tenantId != null) { if (!isRootTenant(tenantId)) { getViprClient().tenants().deactivate(tenantId); return true; } } return false; } public static List<StringOption> getSubTenantOptions() { List<StringOption> options = Lists.newArrayList(); TenantOrgRestRep userTenant = getViprClient().tenants().get(uri(Security.getUserInfo().getTenant())); options.add(createTenantOption(userTenant)); for (TenantOrgRestRep tenant : getViprClient().tenants().getAllSubtenants(uri(Security.getUserInfo().getTenant()))) { options.add(createTenantOption(tenant)); } Collections.sort(options); return options; } public static TenantOrgRestRep getUserTenant() { return getViprClient().tenants().get(uri(Security.getUserInfo().getTenant())); } public static List<StringOption> getUserSubTenantOptions() { List<StringOption> options = Lists.newArrayList(); if (Security.hasAnyRole(Security.SECURITY_ADMIN, Security.RESTRICTED_SECURITY_ADMIN, Security.HOME_TENANT_ADMIN)) { TenantOrgRestRep userTenant = getViprClient().tenants().get(uri(Security.getUserInfo().getTenant())); options.add(createTenantOption(userTenant)); } for (TenantOrgRestRep tenant : getViprClient().tenants().getByIds(Security.getUserInfo().getSubTenants())) { options.add(createTenantOption(tenant)); } return options; } private static StringOption createTenantOption(TenantOrgRestRep tenant) { return new StringOption(tenant.getId().toString(), tenant.getName()); } private static StringOption createTenantOption(String tenantId, String name) { return new StringOption(tenantId, name); } /** * Creates a list tenant selector options. But these options are * not the actual tenants. They are just added to filter the * vCenters, Clusters and Hosts in the UI. * * @return list of additional tenant selector options. */ public static List<StringOption> getAdditionalTenantOptions() { List<StringOption> options = Lists.newArrayList(); options.add(createTenantOption(NO_TENANT_SELECTOR, NO_TENANT_SELECTOR)); options.add(createTenantOption(TENANT_SELECTOR_FOR_UNASSIGNED, TENANT_SELECTOR_FOR_UNASSIGNED)); Collections.sort(options); return options; } /** * Creates a list tenant selector options. This includes both * the actual tenants an the additional tenant options. * * @return list of tenant with additional tenant selector options. */ public static List<StringOption> getSubTenantOptionsWithAdditionalTenants() { List<StringOption> options = getAdditionalTenantOptions(); options.addAll(getSubTenantOptions()); return options; } /** * Converts the portal tenant filter to match the API tenant * filter. In portal the tenant filter are * "[No Filter]" - to list all the vCenters in the system. * "[Not Assigned]" - to list all the vCenters with no tenants assigned. * But, in API, they are slightly different. * "ALL" - to list all the vCenters in the system. * "NONE" - to list all the vCenters with no tenants assigned. * * @param tenantId to be converted to the api level filter. * * @return returns the corresponding api level filter to the tenantId. */ public static URI getTenantFilter(String tenantId) { URI tenantFilter; if (StringUtils.isNotBlank(tenantId) && tenantId.equalsIgnoreCase(NO_TENANT_SELECTOR)) { tenantFilter = uri(API_NO_TENANT_SELECTOR); } else if (StringUtils.isNotBlank(tenantId) && tenantId.equalsIgnoreCase(TENANT_SELECTOR_FOR_UNASSIGNED)){ tenantFilter = uri(API_TENANT_SELECTOR_FOR_UNASSIGNED); } else { tenantFilter = uri(tenantId); } return tenantFilter; } public static String getNoTenantSelector() { return NO_TENANT_SELECTOR; } public static String getTenantSelectorForUnassigned() { return TENANT_SELECTOR_FOR_UNASSIGNED; } }