/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.model;
import com.emc.storageos.db.client.util.NullColumnValueGetter;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.beans.Transient;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URI;
import java.util.Map;
import java.util.Set;
public abstract class DiscoveredComputeSystemWithAcls extends AbstractDiscoveredTenantResource implements Serializable {
private static final long serialVersionUID = 2131442061913781875L;
protected static final Logger _log = LoggerFactory.getLogger(DiscoveredComputeSystemWithAcls.class);
@Deprecated
private URI _tenant;
// acls
private StringSetMap _acls;
@Name("acls")
@PermissionsIndex("PermissionsIndex")
public StringSetMap getAcls() {
return _acls;
}
public void setAcls(StringSetMap acls) {
_acls = acls;
setChanged("acls");
}
public Set<String> getAclSet(String key) {
if (_acls != null) {
return _acls.get(key);
}
return null;
}
public void addAcl(String key, String role) {
if (_acls == null) {
_acls = new StringSetMap();
}
_acls.put(key, role);
}
public void addAcl(URI tenantId) {
//Doing the PermissionsKey functionality here as making the
//DBClient to be a dependent on security library creates a
//circular dependency, hence just added this formatting alone
//here.
String key = String.format("%s,%s", "TENANT", tenantId.toString());
String role = "USE";
addAcl(key, role);
}
public void removeAcl(String key) {
if (_acls != null) {
_acls.remove(key);
}
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(_acls);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
_acls = (StringSetMap) in.readObject();
}
/* (non-Javadoc)
* @see com.emc.storageos.db.client.model.TenantResource#getTenant()
*/
@Override
@Name("tenant")
@RelationIndex(cf = "RelationIndex", type = TenantOrg.class)
public URI getTenant() {
return _tenant;
}
/* (non-Javadoc)
* @see com.emc.storageos.db.client.model.TenantResource#setTenant(java.net.URI)
*/
@Override
public void setTenant(URI tenant) {
_tenant = tenant;
setChanged("tenant");
}
/* (non-Javadoc)
* @see com.emc.storageos.db.client.model.TenantResource#auditParameters()
*/
@Override
public abstract Object[] auditParameters();
/* (non-Javadoc)
* @see com.emc.storageos.db.client.model.TenantResource#getDataObject()
*/
@Override
public DataObject findDataObject() {
return (DataObject) this;
}
/**
* Finds the vCenter tenant based on the first acls configured.
* This tenant information is used to populate the vCenter
* GET request response in case of upgrade. The same is also
* used for any vCenter tasks.
*
* @return
*/
public URI findVcenterTenant() {
if (CollectionUtils.isEmpty(_acls)) {
_log.debug("Returning null uri");
return NullColumnValueGetter.getNullURI();
}
String permissionKey = null;
for (Map.Entry<String, ? extends AbstractChangeTrackingSet> aclEntry : _acls.entrySet()) {
if (aclEntry != null &&
StringUtils.isNotBlank(aclEntry.getKey()) &&
!CollectionUtils.isEmpty(aclEntry.getValue())) {
permissionKey = aclEntry.getKey();
break;
}
}
URI tenant = NullColumnValueGetter.getNullURI();
if (StringUtils.isNotBlank(permissionKey)) {
tenant = URI.create(permissionKey.split(",")[1]);
}
_log.debug("Vcenter {} tenant {}", this.getLabel(), tenant);
return tenant;
}
}