From 90829862e825e93d7e2d5a5fffcdf1a503b64ed2 Mon Sep 17 00:00:00 2001 From: Matteo Alessandroni Date: Mon, 16 Apr 2018 12:10:07 +0200 Subject: [PATCH] [AZURE-3] Added support to read Azure Subscription SKUs --- .../connid/bundles/azure/AzureConnector.java | 46 ++++++++++ .../connid/bundles/azure/dto/AzureObject.java | 4 - .../connid/bundles/azure/dto/Group.java | 3 - .../bundles/azure/dto/SubscribedSku.java | 89 +++++++++++++++++-- .../tirasa/connid/bundles/azure/dto/User.java | 10 +-- .../bundles/azure/utils/AzureAttributes.java | 4 +- 6 files changed, 131 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/tirasa/connid/bundles/azure/AzureConnector.java b/src/main/java/net/tirasa/connid/bundles/azure/AzureConnector.java index 724a1d7..d1183bf 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/AzureConnector.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/AzureConnector.java @@ -26,6 +26,7 @@ import net.tirasa.connid.bundles.azure.dto.License; import net.tirasa.connid.bundles.azure.dto.PagedGroups; import net.tirasa.connid.bundles.azure.dto.PagedUsers; +import net.tirasa.connid.bundles.azure.dto.SubscribedSku; import net.tirasa.connid.bundles.azure.dto.User; import net.tirasa.connid.bundles.azure.service.AzureService; import net.tirasa.connid.bundles.azure.utils.AzureAttributes; @@ -265,6 +266,23 @@ public void executeQuery(ObjectClass objectClass, Filter query, ResultsHandler h handler.handle(fromGroup(result, attributesToGet)); } } + } else if (new ObjectClass(AzureAttributes.AZURE_LICENSE_NAME).equals(objectClass)) { + if (key == null) { + List subscribedSkus = null; + try { + subscribedSkus = client.getAuthenticated().getCurrentTenantSubscriptions(); + } catch (Exception e) { + AzureUtils.wrapGeneralError("While getting subscriptions!", e); + } + + for (SubscribedSku subscribedSku : subscribedSkus) { + handler.handle(fromLicense(subscribedSku, attributesToGet)); + } + + if (handler instanceof SearchResultsHandler) { + ((SearchResultsHandler) handler).handleResult(new SearchResult(null, -1)); + } + } } else { LOG.warn("Search of type {0} is not supported", objectClass.getObjectClassValue()); throw new UnsupportedOperationException("Search of type" @@ -662,4 +680,32 @@ private ConnectorObject fromGroup(final Group group, final Set attribute return builder.build(); } + + private ConnectorObject fromLicense(final SubscribedSku subscribedSku, final Set attributesToGet) { + ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); + builder.setObjectClass(new ObjectClass(AzureAttributes.AZURE_LICENSE_NAME)); + builder.setUid(subscribedSku.getObjectId()); + builder.setName(subscribedSku.getSkuId()); + + try { + for (Attribute toAttribute : subscribedSku.toAttributes()) { + String attributeName = toAttribute.getName(); + for (String attributeToGetName : attributesToGet) { + if (attributeName.equals(attributeToGetName)) { + builder.addAttribute(toAttribute); + break; + } + } + } + } catch (IllegalArgumentException | IllegalAccessException ex) { + LOG.error(ex, "While converting to attributes"); + } + + if (attributesToGet.contains(AzureAttributes.AZURE_LICENSE_NAME)) { + builder.addAttribute(AttributeBuilder.build(AzureAttributes.AZURE_LICENSE_NAME, + subscribedSku.getObjectId())); + } + + return builder.build(); + } } diff --git a/src/main/java/net/tirasa/connid/bundles/azure/dto/AzureObject.java b/src/main/java/net/tirasa/connid/bundles/azure/dto/AzureObject.java index 8cf74e3..5162dad 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/dto/AzureObject.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/dto/AzureObject.java @@ -20,12 +20,8 @@ public interface AzureObject { - String getDisplayName(); - String getObjectId(); - void setDisplayName(String displayName); - void setObjectId(String objectId); Set toAttributes() throws IllegalArgumentException, IllegalAccessException; diff --git a/src/main/java/net/tirasa/connid/bundles/azure/dto/Group.java b/src/main/java/net/tirasa/connid/bundles/azure/dto/Group.java index d1aa5aa..99b8488 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/dto/Group.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/dto/Group.java @@ -194,12 +194,10 @@ public void setObjectType(final String objectType) { this.objectType = objectType; } - @Override public String getDisplayName() { return displayName; } - @Override public void setDisplayName(final String displayName) { this.displayName = displayName; } @@ -296,7 +294,6 @@ private void doSetAttribute(final String name, final List values) { securityEnabled = Boolean.class.cast(value); break; - } } diff --git a/src/main/java/net/tirasa/connid/bundles/azure/dto/SubscribedSku.java b/src/main/java/net/tirasa/connid/bundles/azure/dto/SubscribedSku.java index d00114d..0b283f5 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/dto/SubscribedSku.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/dto/SubscribedSku.java @@ -18,27 +18,27 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import net.tirasa.connid.bundles.azure.utils.AzureAttributes; +import org.identityconnectors.common.CollectionUtil; +import org.identityconnectors.framework.common.objects.Attribute; @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) -public class SubscribedSku { - - @JsonProperty - private String capabilityStatus; - - @JsonProperty - private int consumedUnits; +public class SubscribedSku implements AzureObject { @JsonProperty private String objectId; @JsonProperty - private PrepaidUnit prepaidUnits; + private String capabilityStatus; @JsonProperty - private List servicePlans = new ArrayList<>(); + private int consumedUnits; @JsonProperty private String skuId; @@ -49,6 +49,12 @@ public class SubscribedSku { @JsonProperty private String appliesTo; + @JsonProperty + private PrepaidUnit prepaidUnits; + + @JsonProperty + private List servicePlans = new ArrayList<>(); + public String getCapabilityStatus() { return capabilityStatus; } @@ -113,6 +119,71 @@ public void setAppliesTo(final String appliesTo) { this.appliesTo = appliesTo; } + @Override + public Set toAttributes() throws IllegalArgumentException, IllegalAccessException { + Set attrs = new HashSet<>(); + + Field[] fields = SubscribedSku.class.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + attrs.add(AzureAttributes.buildAttributeFromClassField(field, this).build()); + } + + return attrs; + } + + @Override + public void fromAttributes(Set attributes) { + for (Attribute attribute : attributes) { + if (!CollectionUtil.isEmpty(attribute.getValue())) { + List values = attribute.getValue(); + String name = attribute.getName(); + + doSetAttribute(name, values); + } + + } + } + + @SuppressWarnings("unchecked") + private void doSetAttribute(final String name, final List values) { + Object value = values.get(0); + switch (name) { + case "objectId": + objectId = + String.class.cast(value); + break; + case "capabilityStatus": + capabilityStatus = + String.class.cast(value); + break; + case "consumedUnits": + consumedUnits = + Integer.class.cast(value); + break; + case "skuId": + skuId = + String.class.cast(value); + break; + case "skuPartNumber": + skuPartNumber = + String.class.cast(value); + break; + case "appliesTo": + appliesTo = + String.class.cast(value); + break; + case "prepaidUnits": + prepaidUnits = + PrepaidUnit.class.cast(value); + break; + case "servicePlans": + servicePlans = + new ArrayList<>((List) (Object) values); + break; + } + } + @Override public String toString() { return "SubscribedSku{" + "capabilityStatus=" + capabilityStatus + ", consumedUnits=" + consumedUnits diff --git a/src/main/java/net/tirasa/connid/bundles/azure/dto/User.java b/src/main/java/net/tirasa/connid/bundles/azure/dto/User.java index 4f57afa..ce13985 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/dto/User.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/dto/User.java @@ -681,19 +681,17 @@ public void setUserIdentities(final List userIdentities) { this.userIdentities = userIdentities; } - @Override public String getDisplayName() { return displayName; } - @Override - public String getObjectId() { - return objectId; + public void setDisplayName(final String displayName) { + this.displayName = displayName; } @Override - public void setDisplayName(final String displayName) { - this.displayName = displayName; + public String getObjectId() { + return objectId; } @Override diff --git a/src/main/java/net/tirasa/connid/bundles/azure/utils/AzureAttributes.java b/src/main/java/net/tirasa/connid/bundles/azure/utils/AzureAttributes.java index 985cf8f..327d390 100644 --- a/src/main/java/net/tirasa/connid/bundles/azure/utils/AzureAttributes.java +++ b/src/main/java/net/tirasa/connid/bundles/azure/utils/AzureAttributes.java @@ -62,9 +62,7 @@ public final class AzureAttributes { public static final String USER_USAGE_LOCATION = "usageLocation"; - public static boolean isAzureLicenses(String attrName) { - return AZURE_LICENSE_NAME.equalsIgnoreCase(attrName); - } + public static final String SUBSCRIBED_SKU_ID = "objectId"; public static final List GROUP_REQUIRED_ATTRS = new ArrayList() {