diff options
author | 2018-05-24 16:12:32 +0300 | |
---|---|---|
committer | 2018-05-24 16:12:32 +0300 | |
commit | 1a0189f890e4ff65ee245be9b7ef67788ac53a61 (patch) | |
tree | 15c269d48d03ef35770763169bd85f4cf31398c0 /dcaedt_catalog/asdc | |
parent | cd0441658018dfbab0950f959c9b718ad9601f6d (diff) |
Update code
Update to latest version after improving testing and sonar coverage
Change-Id: I527f4bc38d3b4e1005d38e3a2584fa730857425d
Issue-ID: SDC-1313
Signed-off-by: Stone, Avi (as206k) <as206k@att.com>
Diffstat (limited to 'dcaedt_catalog/asdc')
4 files changed, 40 insertions, 1056 deletions
diff --git a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDC.java b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDC.java index 08383ea..c704689 100644 --- a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDC.java +++ b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDC.java @@ -1,114 +1,52 @@ package org.onap.sdc.dcae.catalog.asdc; -import java.net.URI; -import java.net.URISyntaxException; - -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; - -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.Collections; - -import java.util.function.UnaryOperator; - -import javax.annotation.PostConstruct; - +import org.apache.commons.codec.digest.DigestUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.common.onaplog.OnapLoggerDebug; import org.onap.sdc.common.onaplog.OnapLoggerError; -import org.onap.sdc.common.onaplog.Enums.LogLevel; -import org.onap.sdc.dcae.enums.ArtifactGroupType; -import org.onap.sdc.dcae.enums.ArtifactType; -import org.onap.sdc.dcae.composition.restmodels.sdc.ResourceDetailed; -import org.springframework.http.MediaType; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpRequest; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpEntity; -import org.springframework.http.RequestEntity; -import org.springframework.http.ResponseEntity; +import org.onap.sdc.dcae.catalog.commons.Action; +import org.onap.sdc.dcae.catalog.commons.Future; +import org.onap.sdc.dcae.catalog.commons.Futures; +import org.onap.sdc.dcae.catalog.commons.JSONHttpMessageConverter; +import org.springframework.context.annotation.Scope; +import org.springframework.http.*; import org.springframework.http.client.AsyncClientHttpRequestExecution; import org.springframework.http.client.AsyncClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.web.client.AsyncRestTemplate; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.http.converter.HttpMessageConverter; - -import org.springframework.util.Base64Utils; -import org.apache.commons.codec.digest.DigestUtils; - -import org.springframework.stereotype.Component; -import org.springframework.context.annotation.Scope; import org.springframework.scheduling.annotation.Scheduled; - +import org.springframework.stereotype.Component; +import org.springframework.util.Base64Utils; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureCallback; +import org.springframework.web.client.AsyncRestTemplate; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; - -import org.json.JSONObject; -import org.onap.sdc.dcae.catalog.commons.Action; -import org.onap.sdc.dcae.catalog.commons.Future; -import org.onap.sdc.dcae.catalog.commons.Futures; -import org.onap.sdc.dcae.catalog.commons.JSONHttpMessageConverter; -import org.json.JSONArray; - -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.UUID; @Component("asdc") @Scope("singleton") public class ASDC { - private static final String TARGET = "target"; - private static final String ACTION = "action"; - private static final String ASSET_TYPE = "assetType"; - private static final String USER_ID = "USER_ID"; - public static final String ASSET_ID = "assetId"; - public static final String ARTIFACT_ID = "artifactId"; - public static final String LIST_FILTER = "listFilter"; - public enum AssetType { resource, service, product } - public enum LifecycleState { - Checkin, - Checkout, - Certify, - undocheckout - } - - protected static OnapLoggerError errLogger = OnapLoggerError.getInstance(); protected static OnapLoggerDebug debugLogger = OnapLoggerDebug.getInstance(); - private static final String ARTIFACT_TYPE = "artifactType"; - private static final String ARTIFACT_GROUP_TYPE = "artifactGroupType"; - private static final String ARTIFACT_LABEL = "artifactLabel"; - private static final String ARTIFACT_NAME = "artifactName"; - private static final String DESCRIPTION = "description"; - private static final String PAYLOAD_DATA = "payloadData"; - - private static final String[] artifactMandatoryEntries = new String[] {}; - - private static final String[] updateMandatoryEntries = new String[] {ARTIFACT_NAME, - ARTIFACT_TYPE, ARTIFACT_GROUP_TYPE, ARTIFACT_LABEL, DESCRIPTION, PAYLOAD_DATA}; - - private static final String[] uploadMandatoryEntries = new String[] {ARTIFACT_NAME, - ARTIFACT_TYPE, ARTIFACT_GROUP_TYPE, ARTIFACT_LABEL, DESCRIPTION, PAYLOAD_DATA}; - private URI rootUri; private String rootPath = "/sdc/v1/catalog/"; private String user, passwd; @@ -187,30 +125,10 @@ public class ASDC { return getAssets(AssetType.resource, JSONArray.class, category, subCategory, resourceType); } - public <T> Future<T> getServices(Class<T> theType) { - return getAssets(AssetType.service, theType); - } - - public Future<JSONArray> getServices() { - return getAssets(AssetType.service, JSONArray.class); - } - - public <T> Future<T> getServices(Class<T> theType, String theCategory, String theSubCategory) { - return getAssets(AssetType.service, theType, theCategory, theSubCategory); - } - - public Future<JSONArray> getServices(String theCategory, String theSubCategory) { - return getAssets(AssetType.service, JSONArray.class, theCategory, theSubCategory); - } - public <T> Future<T> getAssets(AssetType theAssetType, Class<T> theType) { return fetch(refAssets(theAssetType), theType); } - public <T> Action<T> getAssetsAction(AssetType theAssetType, Class<T> theType) { - return () -> fetch(refAssets(theAssetType), theType); - } - public <T> Future<T> getAssets(AssetType theAssetType, Class<T> theType, String theCategory, String theSubCategory) { return getAssets(theAssetType, theType, theCategory, theSubCategory, null); @@ -220,12 +138,7 @@ public class ASDC { String theCategory, String theSubCategory, String theResourceType) { return fetch(refAssets(theAssetType) + filter(theCategory, theSubCategory, theResourceType), theType); } - - public <T> Action<T> getAssetsAction(AssetType theAssetType, Class<T> theType, - String theCategory, String theSubCategory, String theResourceType) { - return () -> fetch(refAssets(theAssetType) + filter(theCategory, theSubCategory, theResourceType), theType); - } - + protected String refAssets(AssetType theAssetType) { return this.rootPath + theAssetType + "s/"; } @@ -260,19 +173,6 @@ public class ASDC { return getAsset(AssetType.resource, theId, JSONObject.class); } - public Future<ResourceDetailed> getSDCResource(UUID theId) { - return getAsset(AssetType.resource, theId, ResourceDetailed.class); - } - - - public <T> Future<T> getService(UUID theId, Class<T> theType) { - return getAsset(AssetType.service, theId, theType); - } - - public Future<JSONObject> getService(UUID theId) { - return getAsset(AssetType.service, theId, JSONObject.class); - } - public <T> Future<T> getAsset(AssetType theAssetType, UUID theId, Class<T> theType) { return fetch(refAsset(theAssetType, theId) + "/metadata", theType); } @@ -281,14 +181,6 @@ public class ASDC { return () -> fetch(refAsset(theAssetType, theId) + "/metadata", theType); } - public Future<byte[]> getResourceArchive(UUID theId) { - return getAssetArchive(AssetType.resource, theId); - } - - public Future<byte[]> getServiceArchive(UUID theId) { - return getAssetArchive(AssetType.service, theId); - } - public Future<byte[]> getAssetArchive(AssetType theAssetType, UUID theId) { return fetch(refAsset(theAssetType, theId) + "/toscaModel", byte[].class); } @@ -297,42 +189,6 @@ public class ASDC { return () -> fetch(refAsset(theAssetType, theId) + "/toscaModel", byte[].class); } - public Future<JSONObject> checkinResource(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.resource, theId, LifecycleState.Checkin, theUser, theMessage); - } - - public Future<JSONObject> checkinService(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.service, theId, LifecycleState.Checkin, theUser, theMessage); - } - - public Future<JSONObject> checkoutResource(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.resource, theId, LifecycleState.Checkout, theUser, theMessage); - } - - public Future<JSONObject> checkoutService(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.service, theId, LifecycleState.Checkout, theUser, theMessage); - } - - public Future<JSONObject> certifyResource(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.resource, theId, LifecycleState.Certify, theUser, theMessage); - } - - public Future<JSONObject> certifyService(UUID theId, String theUser, String theMessage) { - return cycleAsset(AssetType.service, theId, LifecycleState.Certify, theUser, theMessage); - } - - /* Normally theMessage is mandatory (and we'd use put instead of putOpt) but .. not so for undocheckout .. - */ - public Future<JSONObject> cycleAsset(AssetType theAssetType, UUID theId, LifecycleState theState, - String theUser, String theMessage) { - return post(refAsset(theAssetType, theId) + "/lifecycleState/" + theState, - headers -> prepareHeaders(headers).header(USER_ID, theUser), new JSONObject().putOpt("userRemarks", theMessage)); - } - - protected String refAssetInstanceArtifact(AssetType theAssetType, UUID theAssetId, String theAssetInstance, UUID theArtifactId) { - return refAsset(theAssetType, theAssetId) + "/resourceInstances/" + theAssetInstance + "/artifacts" + (theArtifactId == null ? "" : ("/" + theArtifactId)); - } - protected String refAssetArtifact(AssetType theAssetType, UUID theAssetId, UUID theArtifactId) { return refAsset(theAssetType, theAssetId) + "/artifacts" + (theArtifactId == null ? "" : ("/" + theArtifactId)); } @@ -340,414 +196,11 @@ public class ASDC { public <T> Future<T> getResourceArtifact(UUID theAssetId, UUID theArtifactId, Class<T> theType) { return getAssetArtifact(AssetType.resource, theAssetId, theArtifactId, theType); } - - public <T> Future<T> getServiceArtifact(UUID theAssetId, UUID theArtifactId, Class<T> theType) { - return getAssetArtifact(AssetType.service, theAssetId, theArtifactId, theType); - } - - public <T> Future<T> getResourceInstanceArtifact(UUID theAssetId, UUID theArtifactId, String theInstance, Class<T> theType) { - return getAssetInstanceArtifact(AssetType.resource, theAssetId, theInstance, theArtifactId, theType); - } - - public <T> Future<T> getServiceInstanceArtifact(UUID theAssetId, UUID theArtifactId, String theInstance, Class<T> theType) { - return getAssetInstanceArtifact(AssetType.service, theAssetId, theInstance, theArtifactId, theType); - } public <T> Future<T> getAssetArtifact(AssetType theAssetType, UUID theAssetId, UUID theArtifactId, Class<T> theType) { return fetch(refAssetArtifact(theAssetType, theAssetId, theArtifactId), theType); } - - public <T> Action<T> getAssetArtifactAction(AssetType theAssetType, UUID theAssetId, UUID theArtifactId, Class<T> theType) { - return () -> fetch(refAssetArtifact(theAssetType, theAssetId, theArtifactId), theType); - } - - public <T> Future<T> getAssetInstanceArtifact(AssetType theAssetType, UUID theAssetId, String theInstance, UUID theArtifactId, Class<T> theType) { - return fetch(refAssetInstanceArtifact(theAssetType, theAssetId, theInstance, theArtifactId), theType); - } - - public <T> Action<T> getAssetInstanceArtifactAction(AssetType theAssetType, UUID theAssetId, String theInstance, UUID theArtifactId, Class<T> theType) { - return () -> fetch(refAssetInstanceArtifact(theAssetType, theAssetId, theInstance, theArtifactId), theType); - } - - public ArtifactUploadAction createResourceArtifact(UUID theAssetId) { - return createAssetArtifact(AssetType.resource, theAssetId); - } - - public ArtifactUploadAction createServiceArtifact(UUID theAssetId) { - return createAssetArtifact(AssetType.service, theAssetId); - } - - public ArtifactUploadAction createResourceInstanceArtifact(UUID theAssetId, String theInstance) { - return createAssetInstanceArtifact(AssetType.resource, theAssetId, theInstance); - } - - public ArtifactUploadAction createServiceInstanceArtifact(UUID theAssetId, String theInstance) { - return createAssetInstanceArtifact(AssetType.service, theAssetId, theInstance); - } - - public ArtifactUploadAction createAssetArtifact(AssetType theAssetType, UUID theAssetId) { - return new ArtifactUploadAction() - .ofAsset(theAssetType, theAssetId); - } - - public ArtifactUploadAction createAssetInstanceArtifact(AssetType theAssetType, UUID theAssetId, String theInstance) { - return new ArtifactUploadAction() - .ofAssetInstance(theAssetType, theAssetId, theInstance); - } - - public ArtifactUpdateAction updateResourceArtifact(UUID theAssetId, JSONObject theArtifactInfo) { - return updateAssetArtifact(AssetType.resource, theAssetId, theArtifactInfo); - } - - public ArtifactUpdateAction updateResourceInstanceArtifact(UUID theAssetId, String theInstance, JSONObject theArtifactInfo) { - return updateAssetInstanceArtifact(AssetType.resource, theAssetId, theInstance, theArtifactInfo); - } - - public ArtifactUpdateAction updateServiceArtifact(UUID theAssetId, JSONObject theArtifactInfo) { - return updateAssetArtifact(AssetType.service, theAssetId, theArtifactInfo); - } - - public ArtifactUpdateAction updateServiceInstanceArtifact(UUID theAssetId, String theInstance, JSONObject theArtifactInfo) { - return updateAssetInstanceArtifact(AssetType.service, theAssetId, theInstance, theArtifactInfo); - } - - public ArtifactUpdateAction updateAssetArtifact(AssetType theAssetType, UUID theAssetId, JSONObject theArtifactInfo) { - return new ArtifactUpdateAction(theArtifactInfo) - .ofAsset(theAssetType, theAssetId); - } - - public ArtifactUpdateAction updateAssetInstanceArtifact(AssetType theAssetType, UUID theAssetId, String theInstance, JSONObject theArtifactInfo) { - return new ArtifactUpdateAction(theArtifactInfo) - .ofAssetInstance(theAssetType, theAssetId, theInstance); - } - - public ArtifactDeleteAction deleteResourceArtifact(UUID theAssetId, UUID theArtifactId) { - return deleteAssetArtifact(AssetType.resource, theAssetId, theArtifactId); - } - - public ArtifactDeleteAction deleteResourceInstanceArtifact(UUID theAssetId, String theInstance, UUID theArtifactId) { - return deleteAssetInstanceArtifact(AssetType.resource, theAssetId, theInstance, theArtifactId); - } - - public ArtifactDeleteAction deleteServiceArtifact(UUID theAssetId, UUID theArtifactId) { - return deleteAssetArtifact(AssetType.service, theAssetId, theArtifactId); - } - - public ArtifactDeleteAction deleteServiceInstanceArtifact(UUID theAssetId, String theInstance, UUID theArtifactId) { - return deleteAssetInstanceArtifact(AssetType.service, theAssetId, theInstance, theArtifactId); - } - - public ArtifactDeleteAction deleteAssetArtifact(AssetType theAssetType, UUID theAssetId, UUID theArtifactId) { - return new ArtifactDeleteAction(theArtifactId) - .ofAsset(theAssetType, theAssetId); - } - - public ArtifactDeleteAction deleteAssetInstanceArtifact(AssetType theAssetType, UUID theAssetId, String theInstance, UUID theArtifactId) { - return new ArtifactDeleteAction(theArtifactId) - .ofAssetInstance(theAssetType, theAssetId, theInstance); - } - - - public abstract class ASDCAction<A extends ASDCAction<A, T>, T> implements Action<T> { - - protected JSONObject info; //info passed to asdc as request body - protected String operatorId; //id of the SDC user performing the action - - protected ASDCAction(JSONObject theInfo) { - this.info = theInfo; - } - - protected abstract A self(); - - protected ASDC asdc() { - return ASDC.this; - } - - protected A withInfo(JSONObject theInfo) { - merge(this.info, theInfo); - return self(); - } - - public A with(String theProperty, Object theValue) { - info.put(theProperty, theValue); - return self(); - } - - public A withOperator(String theOperator) { - this.operatorId = theOperator; - return self(); - } - - protected abstract String[] mandatoryInfoEntries(); - - protected void checkOperatorId() { - if (this.operatorId == null) { - throw new IllegalStateException("No operator id was provided"); - } - } - - protected void checkMandatoryInfo() { - for (String field: mandatoryInfoEntries()) { - if (!info.has(field)) { - throw new IllegalStateException("No '" + field + "' was provided"); - } - } - } - - protected void checkMandatory() { - checkOperatorId(); - checkMandatoryInfo(); - } - } - - - /** - * We use teh same API to operate on artifacts attached to assets or to their instances - */ - public abstract class ASDCArtifactAction<A extends ASDCArtifactAction<A>> extends ASDCAction<A, JSONObject> { - - protected AssetType assetType; - protected UUID assetId; - protected String assetInstance; - - protected ASDCArtifactAction(JSONObject theInfo) { - super(theInfo); - } - - protected A ofAsset(AssetType theAssetType, UUID theAssetId) { - this.assetType = theAssetType; - this.assetId = theAssetId; - return self(); - } - - protected A ofAssetInstance(AssetType theAssetType, UUID theAssetId, String theInstance) { - this.assetType = theAssetType; - this.assetId = theAssetId; - this.assetInstance = theInstance; - return self(); - } - - protected String normalizeInstanceName(String theName) { - return StringUtils.removePattern(theName, "[ \\.\\-]+").toLowerCase(); - } - - protected String[] mandatoryInfoEntries() { - return ASDC.this.artifactMandatoryEntries; - } - - protected String ref(UUID theArtifactId) { - return (this.assetInstance == null) ? - refAssetArtifact(this.assetType, this.assetId, theArtifactId) : - refAssetInstanceArtifact(this.assetType, this.assetId, normalizeInstanceName(this.assetInstance), theArtifactId); - } - } - - public class ArtifactUploadAction extends ASDCArtifactAction<ArtifactUploadAction> { - - public static final String PAYLOAD_DATA = ASDC.PAYLOAD_DATA; - - protected ArtifactUploadAction() { - super(new JSONObject()); - } - - protected ArtifactUploadAction self() { - return this; - } - - public ArtifactUploadAction withContent(byte[] theContent) { - return with(PAYLOAD_DATA, Base64Utils.encodeToString(theContent)); - } - - public ArtifactUploadAction withContent(File theFile) throws IOException { - return withContent(FileUtils.readFileToByteArray(theFile)); - } - - public ArtifactUploadAction withLabel(String theLabel) { - return with(ARTIFACT_LABEL, theLabel); - } - - public ArtifactUploadAction withName(String theName) { - return with(ARTIFACT_NAME, theName); - } - - public ArtifactUploadAction withDisplayName(String theName) { - return with("artifactDisplayName", theName); - } - - public ArtifactUploadAction withType(ArtifactType theType) { - return with(ARTIFACT_TYPE, theType.toString()); - } - - public ArtifactUploadAction withGroupType(ArtifactGroupType theGroupType) { - return with(ARTIFACT_GROUP_TYPE, theGroupType.toString()); - } - - public ArtifactUploadAction withDescription(String theDescription) { - return with(DESCRIPTION, theDescription); - } - - @Override - protected String[] mandatoryInfoEntries() { - return ASDC.this.uploadMandatoryEntries; - } - - public Future<JSONObject> execute() { - checkMandatory(); - return ASDC.this.post(ref(null), - headers -> prepareHeaders(headers).header(USER_ID, this.operatorId), this.info); - } - } - - - - /** - * In its current form the update relies on a previous artifact retrieval. One cannot build an update from scratch. - * The label, tye and group type must be submitted but cannot be updated - */ - public class ArtifactUpdateAction extends ASDCArtifactAction<ArtifactUpdateAction> { - - - protected ArtifactUpdateAction(JSONObject theInfo) { - super(theInfo); - } - - protected ArtifactUpdateAction self() { - return this; - } - - public ArtifactUpdateAction withContent(byte[] theContent) { - return with(PAYLOAD_DATA, Base64Utils.encodeToString(theContent)); - } - - public ArtifactUpdateAction withContent(File theFile) throws IOException { - return withContent(FileUtils.readFileToByteArray(theFile)); - } - - public ArtifactUpdateAction withDescription(String theDescription) { - return with(DESCRIPTION, theDescription); - } - - public ArtifactUpdateAction withName(String theName) { - return with(ARTIFACT_NAME, theName); - } - - @Override - protected String[] mandatoryInfoEntries() { - return ASDC.this.updateMandatoryEntries; - } - - /* The json object originates (normally) from a get so it will have entries we need to cleanup */ - protected void cleanupInfoEntries() { - this.info.remove("artifactChecksum"); - this.info.remove("artifactUUID"); - this.info.remove("artifactVersion"); - this.info.remove("artifactURL"); - this.info.remove("artifactDescription"); - } - - public Future<JSONObject> execute() { - UUID artifactUUID = UUID.fromString(this.info.getString("artifactUUID")); - checkMandatory(); - cleanupInfoEntries(); - return ASDC.this.post(ref(artifactUUID), - headers -> prepareHeaders(headers).header(USER_ID, this.operatorId),this.info); - } - } - - public class ArtifactDeleteAction extends ASDCArtifactAction<ArtifactDeleteAction> { - - private UUID artifactId; - - protected ArtifactDeleteAction(UUID theArtifactId) { - super(null); - this.artifactId = theArtifactId; - } - - protected ArtifactDeleteAction self() { - return this; - } - - public Future<JSONObject> execute() { - checkMandatory(); - return ASDC.this.delete(ref(this.artifactId), - headers -> prepareHeaders(headers).header(USER_ID, this.operatorId)); - } - } - - - - - private VFCMTCreateAction createVFCMT() { - return new VFCMTCreateAction(); - } - - - - - public class VFCMTCreateAction extends ASDCAction<VFCMTCreateAction, JSONObject> { - - private static final String CONTACT_ID = "contactId"; - private final String[] vfcmtMandatoryEntries = new String[] { "name", "vendorName", "vendorRelease", CONTACT_ID}; - - protected VFCMTCreateAction() { - - super(new JSONObject()); - this - .with("resourceType", "VFCMT") - .with("category", "Template") - .with("subcategory", "Monitoring Template") - .with("icon", "defaulticon"); - } - - protected VFCMTCreateAction self() { - return this; - } - public VFCMTCreateAction withName(String theName) { - return with("name", theName); - } - - public VFCMTCreateAction withDescription(String theDescription) { - return with(DESCRIPTION, theDescription); - } - - public VFCMTCreateAction withVendorName(String theVendorName) { - return with("vendorName", theVendorName); - } - - public VFCMTCreateAction withVendorRelease(String theVendorRelease) { - return with("vendorRelease", theVendorRelease); - } - - public VFCMTCreateAction withTags(String... theTags) { - for (String tag: theTags) { - this.info.append("tags", tag); - } - return this; - } - - public VFCMTCreateAction withIcon(String theIcon) { - return with("icon", theIcon); - } - - protected String[] mandatoryInfoEntries() { - return vfcmtMandatoryEntries; - } - - public VFCMTCreateAction withContact(String theContact) { - return with(CONTACT_ID, theContact); - } - - public Future<JSONObject> execute() { - - this.info.putOnce(CONTACT_ID, this.operatorId); - this.info.append("tags", info.optString("name")); - checkMandatory(); - return ASDC.this.post(refAssets(AssetType.resource), - headers -> prepareHeaders(headers).header(USER_ID, this.operatorId), this.info); - } - - } public static JSONObject merge(JSONObject theOriginal, JSONObject thePatch) { for (String key: (Set<String>)thePatch.keySet()) { @@ -758,15 +211,6 @@ public class ASDC { return theOriginal; } - protected URI refUri(String theRef) { - try { - return new URI(this.rootUri + theRef); - } - catch(URISyntaxException urisx) { - throw new UncheckedIOException(new IOException(urisx)); - } - } - private HttpHeaders prepareHeaders() { HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((this.user + ":" + this.passwd).getBytes())); @@ -778,38 +222,10 @@ public class ASDC { return headers; } - private RequestEntity.HeadersBuilder prepareHeaders(RequestEntity.HeadersBuilder theBuilder) { - return theBuilder - .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((this.user + ":" + this.passwd).getBytes())) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_OCTET_STREAM_VALUE) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE) - .header("X-ECOMP-InstanceID", this.instanceId); - } - public <T> Future<T> fetch(String theRef, Class<T> theContentType) { return exchange(theRef, HttpMethod.GET, new HttpEntity(prepareHeaders()), theContentType); } - public Future<JSONObject> post(String theRef, JSONObject thePost) { - return exchange(theRef, HttpMethod.POST, new HttpEntity<JSONObject>(thePost, prepareHeaders()), JSONObject.class); - } - - public Future<JSONObject> post(String theRef, UnaryOperator<RequestEntity.HeadersBuilder> theHeadersBuilder, JSONObject thePost) { - RequestEntity.BodyBuilder builder = RequestEntity.post(refUri(theRef)); - theHeadersBuilder.apply(builder); - - return exchange(theRef, HttpMethod.POST, builder.body(thePost), JSONObject.class); - } - - public Future<JSONObject> delete(String theRef, UnaryOperator<RequestEntity.HeadersBuilder> theHeadersBuilder) { - - RequestEntity.HeadersBuilder builder = RequestEntity.delete(refUri(theRef)); - theHeadersBuilder.apply(builder); - - return exchange(theRef, HttpMethod.DELETE, builder.build(), JSONObject.class); - } - public <T> Future<T> exchange(String theRef, HttpMethod theMethod, HttpEntity theRequest, Class<T> theResponseType) { AsyncRestTemplate restTemplate = new AsyncRestTemplate(); @@ -838,8 +254,6 @@ public class ASDC { return result; } - - public class ASDCFuture<T> extends Futures.BasicFuture<T> { ListenableFutureCallback<ResponseEntity<T>> callback = new ListenableFutureCallback<ResponseEntity<T>>() { @@ -857,7 +271,6 @@ public class ASDC { } } }; - } public class ContentMD5Interceptor implements AsyncClientHttpRequestInterceptor { @@ -872,171 +285,4 @@ public class ASDC { return theExecution.executeAsync(theRequest, theBody); } } - - public static void main(String[] theArgs) throws Exception { - - CommandLineParser parser = new BasicParser(); - - String userId = "jh0003"; - - Options options = new Options(); - options.addOption(OptionBuilder - .withArgName(TARGET) - .withLongOpt(TARGET) - .withDescription("target asdc system") - .hasArg() - .isRequired() - .create('t') ); - - options.addOption(OptionBuilder - .withArgName(ACTION) - .withLongOpt(ACTION) - .withDescription("one of: list, get, getartifact, checkin, checkout") - .hasArg() - .isRequired() - .create('a') ); - - options.addOption(OptionBuilder - .withArgName(ASSET_TYPE) - .withLongOpt(ASSET_TYPE) - .withDescription("one of resource, service, product") - .hasArg() - .isRequired() - .create('k') ); //k for 'kind' .. - - options.addOption(OptionBuilder - .withArgName(ASSET_ID) - .withLongOpt(ASSET_ID) - .withDescription("asset uuid") - .hasArg() - .create('u') ); //u for 'uuid' - - options.addOption(OptionBuilder - .withArgName(ARTIFACT_ID) - .withLongOpt(ARTIFACT_ID) - .withDescription("artifact uuid") - .hasArg() - .create('s') ); //s for 'stuff' - - options.addOption(OptionBuilder - .withArgName(LIST_FILTER) - .withLongOpt(LIST_FILTER) - .withDescription("filter for list operations") - .hasArg() - .create('f') ); //u for 'uuid' - - CommandLine line = null; - try { - line = parser.parse(options, theArgs); - } - catch(ParseException exp) { - errLogger.log(LogLevel.ERROR, ASDC.class.getName(), exp.getMessage()); - new HelpFormatter().printHelp("asdc", options); - return; - } - - ASDC asdc = new ASDC(); - asdc.setUri(new URI(line.getOptionValue(TARGET))); - - String action = line.getOptionValue(ACTION); - if ("list".equals(action)) { - JSONObject filterInfo = new JSONObject( - line.hasOption(LIST_FILTER) ? - line.getOptionValue(LIST_FILTER) : "{}"); - JSONArray assets = - asdc.getAssets(ASDC.AssetType.valueOf(line.getOptionValue(ASSET_TYPE)), JSONArray.class, - filterInfo.optString("category", null), filterInfo.optString("subCategory", null)) - .waitForResult(); - for (int i = 0; i < assets.length(); i++) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(),"> {}", assets.getJSONObject(i).toString(2)); - } - } - else if ("get".equals(action)) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(), - asdc.getAsset(ASDC.AssetType.valueOf(line.getOptionValue(ASSET_TYPE)), - UUID.fromString(line.getOptionValue(ASSET_ID)), - JSONObject.class) - .waitForResult() - .toString(2) - ); - } - else if ("getartifact".equals(action)) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(), - asdc.getAssetArtifact(ASDC.AssetType.valueOf(line.getOptionValue(ASSET_TYPE)), - UUID.fromString(line.getOptionValue(ASSET_ID)), - UUID.fromString(line.getOptionValue(ARTIFACT_ID)), - String.class) - .waitForResult() - ); - } - else if ("checkin".equals(action)) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(), - asdc.cycleAsset(ASDC.AssetType.valueOf(line.getOptionValue(ASSET_TYPE)), - UUID.fromString(line.getOptionValue(ASSET_ID)), - ASDC.LifecycleState.Checkin, - userId, - "cli op") - .waitForResult() - .toString() - ); - } - else if ("checkout".equals(action)) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(), - asdc.cycleAsset(ASDC.AssetType.valueOf(line.getOptionValue(ASSET_TYPE)), - UUID.fromString(line.getOptionValue(ASSET_ID)), - ASDC.LifecycleState.Checkout, - userId, - "cli op") - .waitForResult() - .toString() - ); - } - else if ("cleanup".equals(action)) { - JSONArray resources = asdc.getResources() - .waitForResult(); - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(),"Got {} resources", resources.length()); - - vfcmtCleanup(userId, asdc, resources); - } - else { - try { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(), - asdc.createVFCMT() - .withName("Clonator") - .withDescription("Clone operation target 06192017") - .withVendorName("CloneInc") - .withVendorRelease("1.0") - .withTags("clone") - .withOperator(userId) - .execute() - .waitForResult() - .toString() - ); - } - catch(Exception x) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(),"Failed to create VFCMT: {}", x); - } - } - } - - private static void vfcmtCleanup(String userId, ASDC asdc, JSONArray resources) { - for (int i = 0; i < resources.length(); i++) { - - JSONObject resource = resources.getJSONObject(i); - - if ("VFCMT".equals(resource.getString("resourceType")) && - resource.getString("name").contains("test")) { - - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(),"undocheckout for {}", resource.getString("uuid")); - - try { - asdc.cycleAsset(AssetType.resource, UUID.fromString(resource.getString("uuid")), LifecycleState.undocheckout, userId, null) - .waitForResult(); - } - catch (Exception x) { - debugLogger.log(LogLevel.DEBUG, ASDC.class.getName(),"** {}", x); - } - } - } - } } diff --git a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCController.java b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCController.java deleted file mode 100644 index e69de29..0000000 --- a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCController.java +++ /dev/null diff --git a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCUtils.java b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCUtils.java index d6a175f..a3ea63d 100644 --- a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCUtils.java +++ b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/catalog/asdc/ASDCUtils.java @@ -4,14 +4,13 @@ import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; import org.json.JSONObject; +import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.common.onaplog.OnapLoggerDebug; import org.onap.sdc.common.onaplog.OnapLoggerError; -import org.onap.sdc.common.onaplog.Enums.LogLevel; import org.onap.sdc.dcae.catalog.commons.Actions; import org.onap.sdc.dcae.catalog.commons.Future; import org.onap.sdc.dcae.catalog.commons.Futures; import org.onap.sdc.dcae.catalog.commons.Recycler; -import org.onap.sdc.dcae.checker.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Scope; @@ -20,7 +19,9 @@ import org.springframework.util.Base64Utils; import java.io.*; import java.net.URI; -import java.util.*; +import java.util.List; +import java.util.Spliterators; +import java.util.UUID; import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; @@ -72,58 +73,7 @@ public class ASDCUtils { this.blueprint = theBlueprinter; } - public CloneAssetArtifactsAction cloneAssetArtifacts(ASDC.AssetType theAssetType, UUID theSourceId, UUID theTargetId) { - return new CloneAssetArtifactsAction(this.asdc, theAssetType, theSourceId, theTargetId); - } - - public static class CloneAssetArtifactsAction extends ASDC.ASDCAction<CloneAssetArtifactsAction, List<JSONObject>> { - - private ASDC.AssetType assetType; - private UUID sourceId, targetId; - - CloneAssetArtifactsAction(ASDC theASDC, ASDC.AssetType theAssetType, UUID theSourceId, UUID theTargetId) { - theASDC.super(new JSONObject()); - this.assetType = theAssetType; - this.sourceId = theSourceId; - this.targetId = theTargetId; - } - - protected CloneAssetArtifactsAction self() { - return this; - } - - public CloneAssetArtifactsAction withLabel(String theLabel) { - return with("artifactLabel", theLabel); - } - - protected String[] mandatoryInfoEntries() { - return new String[] {}; - } - - public Future<List<JSONObject>> execute() { - checkMandatory(); - - final Actions.Sequence<JSONObject> sequencer = new Actions.Sequence<JSONObject>(); - - new Actions.Sequence().add(super.asdc().getAssetArchiveAction(this.assetType, this.sourceId)).add(super.asdc().getAssetAction(this.assetType, this.sourceId, JSONObject.class)).execute().setHandler(assetFuture -> { - debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "*** {}", assetFuture.result()); - processArtifacts((List) assetFuture.result(), (JSONObject theInfo, byte[] theData) -> { - theInfo.remove("artifactChecksum"); - theInfo.remove("artifactUUID"); - theInfo.remove("artifactVersion"); - theInfo.remove(ARTIFACT_URL); - theInfo.put("description", theInfo.remove("artifactDescription")); - theInfo.put("payloadData", Base64Utils.encodeToString(theData)); - return theInfo; - }, null).forEach(artifactInfo -> sequencer.add(super.asdc().createAssetArtifact(this.assetType, this.targetId).withInfo(ASDC.merge(artifactInfo, this.info)).withOperator(this.operatorId))); - sequencer.execute(); - }); - - return sequencer.future(); - } - } //the Action class - /* */ private static JSONObject lookupArtifactInfo(JSONArray theArtifacts, String theName) { for (int i = 0; theArtifacts != null && i < theArtifacts.length(); i++) { @@ -151,48 +101,6 @@ public class ASDCUtils { return baos.toByteArray(); } - /** - * Recycle a cdump, fetch all relevant ASDC artifacts, interact with Shu's toscalib service in order to generate - * a blueprint. No 'Action' object here as there is nothig to set up. - */ - public Future<Future<String>> buildBlueprint(Reader theCdump) { - - final Recycler recycler = new Recycler(); - Object template = null; - - try { - template = recycler.recycle(theCdump); - - } catch (Exception x) { - return Futures.failedFuture(x); - } - - JXPathContext jxroot = JXPathContext.newContext(template); - jxroot.setLenient(true); - - //based on the output of ASDCCatalog the node description will contain the UUID of the resource declaring it - List uuids = (List) StreamSupport.stream(Spliterators.spliteratorUnknownSize(jxroot.iterate("topology_template/node_templates/*/description"), 16), false).distinct().filter(desc -> desc != null) - //the desc contains the full URI and the resource uuid is the 5th path element - .map(desc -> desc.toString().split("/")[5]).collect(Collectors.toList()); - - //prepare fetching all archives/resource details - final Futures.Accumulator accumulator = new Futures.Accumulator(); - uuids.forEach(uuid -> { - UUID rid = UUID.fromString((String) uuid); - accumulator.add(this.asdc.getAssetArchive(ASDC.AssetType.resource, rid)); - accumulator.add(this.asdc.getAsset(ASDC.AssetType.resource, rid, JSONObject.class)); - }); - - final byte[] templateData = recycler.toString(template).getBytes(/*"UTF-8"*/); - //retrieve all resource archive+details, prepare blueprint service request and send its request - return Futures.advance(accumulator.accumulate(), (List theArchives) -> { - Blueprinter.BlueprintAction action = blueprint.generateBlueprint(); - processArtifacts(theArchives, (JSONObject theInfo, byte[] theData) -> new JSONObject().put(theInfo.getString(ARTIFACT_NAME).split("\\.")[0], Base64Utils.encodeToString(theData)), - (Stream<JSONObject> theAssetArtifacts) -> theAssetArtifacts.reduce(new JSONObject(), ASDC::merge)).forEach(artifactInfo -> action.withModelInfo(artifactInfo)); - - return action.withTemplateData(templateData).execute(); - }); - } public Future<Future<String>> buildBlueprintViaToscaLab(Reader theCdump) { return processCdump(theCdump, (theTemplate, theArchives) -> { @@ -205,182 +113,6 @@ public class ASDCUtils { }); } - private static class Tracker implements TargetLocator { - - private enum Position { - SCHEMA, TEMPLATE, TRANSLATE; - } - - private static final int POSITIONS = Position.values().length; - - private List<Target> tgts = new ArrayList<Target>(3); - - Tracker() { - clear(); - } - - public boolean addSearchPath(URI theURI) { - return false; - } - - public boolean addSearchPath(String thePath) { - return false; - } - - public Iterable<URI> searchPaths() { - return Collections.emptyList(); - } - - int position(String... theKeys) { - for (String key : theKeys) { - if ("schema".equals(key)) { - return Position.SCHEMA.ordinal(); - } - if ("template".equals(key)) { - return Position.TEMPLATE.ordinal(); - } - if ("translate".equals(key)) { - return Position.TRANSLATE.ordinal(); - } - } - return -1; - } - - public Target resolve(String theName) { - for (Target tgt : tgts) { - if (tgt != null && tgt.getName().equals(theName)) { - return tgt; - } - } - return null; - } - - void track(JSONObject theInfo, final byte[] theData) { - String uri = theInfo.getString(ARTIFACT_URL).split("/")[5]; - String name = theInfo.getString(ARTIFACT_NAME), desc = theInfo.getString("artifactDescription"), label = theInfo.getString("artifactLabel"); - int pos = position(desc, label); - - debugLogger.log(LogLevel.DEBUG, ASDCUtils.class.getName(), "Tracking {} at {}, {}", name, pos, theInfo.optString(ARTIFACT_URL)); - - if (pos > -1) { - tgts.set(pos, new Target(name, URI.create("asdc:" + uri + "/" + name)) { - @Override - public Reader open(){ - return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(theData))); - } - }); - } - } - - boolean hasSchema() { - return tgts.get(Position.SCHEMA.ordinal()) != null; - } - - public Target schema() { - return tgts.get(Position.SCHEMA.ordinal()); - } - - boolean hasTemplate() { - return tgts.get(Position.TEMPLATE.ordinal()) != null; - } - - public Target template() { - return tgts.get(Position.TEMPLATE.ordinal()); - } - - boolean hasTranslation() { - return tgts.get(Position.TRANSLATE.ordinal()) != null; - } - - public Target translation() { - return tgts.get(Position.TRANSLATE.ordinal()); - } - - public void clear() { - if (tgts.isEmpty()) { - for (int i = 0; i < POSITIONS; i++) { - tgts.add(null); - } - } else { - Collections.fill(tgts, null); - } - } - } - - private Checker buildChecker() { - try { - return new Checker(); - } catch (CheckerException cx) { - errLogger.log(LogLevel.ERROR, this.getClass().getName(), "CheckerException while creating Checker {}", cx); - return null; - } - } - - public Future<Catalog> buildCatalog(Reader theCdump) { - - // - //the purpose of the tracking is to be able to resolve import references within the 'space' of an - //asset's artifacts - //processing order is important too so we 'order the targets: schema, template, translation - // - final Tracker tracker = new Tracker(); - final Catalog catalog = Checker.buildCatalog(); - - return processCdump(theCdump, (theTemplate, theArchives) -> { - - final Checker checker = buildChecker(); - if (checker == null) { - return null; - } - checker.setTargetLocator(tracker); - - processArtifacts(theArchives, (JSONObject theInfo, byte[] theData) -> { - tracker.track(theInfo, theData); - return (Catalog) null; - }, - // aggregation: this is where the actual processing takes place now that - // we have all the targets - (Stream<Catalog> theAssetArtifacts) -> checkAndGetCatalog(tracker, catalog, checker)); - - Target cdump = new Target("cdump", URI.create("asdc:cdump")); - cdump.setTarget(theTemplate); - - validateCatalog(catalog, checker, cdump); - - return catalog; - }); - } - - private Catalog checkAndGetCatalog(Tracker tracker, Catalog catalog, Checker checker) { - //the stream is full of nulls, ignore it, work with the tracker - - try { - if (tracker.hasSchema()) { - checker.check(tracker.schema(), catalog); - } - if (tracker.hasTemplate()) { - checker.check(tracker.template(), catalog); - } - if (tracker.hasTranslation()) { - checker.check(tracker.translation(), catalog); - } - } catch (CheckerException cx) { - //got to do better than this - errLogger.log(LogLevel.ERROR, ASDC.class.getName(),"CheckerException while checking catalog:{}", cx); - } finally { - tracker.clear(); - } - return checker.catalog(); - } - - private void validateCatalog(Catalog catalog, Checker checker, Target cdump) { - try { - checker.validate(cdump, catalog); - } catch (CheckerException cx) { - errLogger.log(LogLevel.ERROR, ASDC.class.getName(),"CheckerException while building catalog:{}", cx); - } - } - /* The common process of recycling, retrieving all related artifacts and then doing 'something' */ private <T> Future<T> processCdump(Reader theCdump, BiFunction<Object, List, T> theProcessor) { diff --git a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/errormng/RequestError.java b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/errormng/RequestError.java index 7207916..0a44a3e 100644 --- a/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/errormng/RequestError.java +++ b/dcaedt_catalog/asdc/src/main/java/org/onap/sdc/dcae/errormng/RequestError.java @@ -9,6 +9,11 @@ public class RequestError { private PolicyException policyException; private ServiceException serviceException; private OkResponseInfo okResponseInfo; + private List<ServiceException> serviceExceptions; + + public PolicyException getPolicyException() { + return policyException; + } public ServiceException getServiceException() { return serviceException; @@ -26,8 +31,11 @@ public class RequestError { this.okResponseInfo = okResponseInfo; } + public List<ServiceException> getServiceExceptions() { + return serviceExceptions; + } void setServiceExceptions(List<ServiceException> serviceExceptions) { - // no one asks for these exception ever + this.serviceExceptions = serviceExceptions; } String getFormattedMessage() { @@ -47,11 +55,9 @@ public class RequestError { } AbstractSdncException getError() { - if (null != policyException) { - return (null != serviceException) ? serviceException : policyException; - } - else { - return (null != serviceException) ? serviceException : okResponseInfo; + if (null != serviceException) { + return serviceException; } + return (null != policyException) ? policyException : okResponseInfo; } }
\ No newline at end of file |