diff options
27 files changed, 1142 insertions, 357 deletions
@@ -10,7 +10,7 @@ <modules> <module>sdc-distribution-client</module> - <module>sdc-distribution-ci</module> + <!-- <module>sdc-distribution-ci</module> --> </modules> <properties> diff --git a/sdc-distribution-ci/src/main/java/org/openecomp/test/ClientTest.java b/sdc-distribution-ci/src/main/java/org/openecomp/test/ClientTest.java index e44013c..872240b 100644 --- a/sdc-distribution-ci/src/main/java/org/openecomp/test/ClientTest.java +++ b/sdc-distribution-ci/src/main/java/org/openecomp/test/ClientTest.java @@ -21,43 +21,93 @@ package org.openecomp.test; import org.openecomp.sdc.api.IDistributionClient; -import org.openecomp.sdc.api.consumer.INotificationCallback; +import org.openecomp.sdc.api.consumer.IComponentDoneStatusMessage; +import org.openecomp.sdc.api.consumer.IStatusCallback; +import org.openecomp.sdc.api.notification.INotificationData; +import org.openecomp.sdc.api.notification.IStatusData; import org.openecomp.sdc.api.results.IDistributionClientResult; import org.openecomp.sdc.impl.DistributionClientFactory; -import org.openecomp.sdc.tosca.parser.api.ISdcCsarHelper; -import org.openecomp.sdc.tosca.parser.impl.SdcToscaParserFactory; -import org.slf4j.LoggerFactory; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; +import org.openecomp.sdc.utils.DistributionStatusEnum; public class ClientTest { public static void main(String[] args) throws Exception { - - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - lc.getLogger("org.apache.http").setLevel(Level.INFO); + soWdListner(); + clientSender(); + + } + + private static void clientSender() { IDistributionClient client = DistributionClientFactory.createDistributionClient(); - INotificationCallback callback; - Boolean download = SimpleConfiguration.toDownload(); - if( download ){ - callback = new AdvanceCallBack(client); - } - else{ - callback = new SimpleCallback(client); + IDistributionClientResult result = client.init(new SimpleConfiguration(), new SimpleCallback(client)); + System.err.println("Init Status: " + result.toString()); + + IDistributionClientResult start = client.start(); + + System.err.println("Start Status: " + start.toString()); + for( int i = 0; i < 2; i++ ){ + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + client.sendComponentDoneStatus(new IComponentDoneStatusMessage() { + + @Override + public long getTimestamp() { + return System.currentTimeMillis(); + } + + @Override + public DistributionStatusEnum getStatus() { + return DistributionStatusEnum.COMPONENT_DONE_OK; + } + + @Override + public String getDistributionID() { + // TODO Auto-generated method stub + return ""; + } + + @Override + public String getConsumerID() { + return client.getConfiguration().getConsumerID(); + } + + @Override + public String getComponentName() { + return "MSO"; + } + }); } - IDistributionClientResult result = client.init(new SimpleConfiguration(), callback); + + } - System.out.println(result.getDistributionMessageResult()); + private static void soWdListner() { + IDistributionClient client = DistributionClientFactory.createDistributionClient(); + IDistributionClientResult result = client.init(new SimpleConfiguration() { + @Override + public boolean isConsumeProduceStatusTopic() { + return true; + } + }, new SimpleCallback(client) { + @Override + public void activateCallback(INotificationData data) { + System.err.println("Monitor Recieved Notification: " + data.toString()); - System.out.println("Starting client..."); - IDistributionClientResult startResult = client.start(); + } + }, new IStatusCallback() { - // Thread.sleep(10000); - // client.stop(); + @Override + public void activateCallback(IStatusData data) { + System.err.println("Monitor Recieved Status: " + data.toString()); - System.out.println(startResult.getDistributionMessageResult()); + } + }); + System.err.println("Init Status: " + result.toString()); + IDistributionClientResult start = client.start(); + System.err.println("Start Status: " + start.toString()); } } diff --git a/sdc-distribution-ci/src/main/java/org/openecomp/test/SimpleConfiguration.java b/sdc-distribution-ci/src/main/java/org/openecomp/test/SimpleConfiguration.java index 60bb7d4..417f564 100644 --- a/sdc-distribution-ci/src/main/java/org/openecomp/test/SimpleConfiguration.java +++ b/sdc-distribution-ci/src/main/java/org/openecomp/test/SimpleConfiguration.java @@ -20,8 +20,11 @@ package org.openecomp.test; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.openecomp.sdc.api.consumer.IConfiguration; public class SimpleConfiguration implements IConfiguration{ @@ -162,9 +165,13 @@ public class SimpleConfiguration implements IConfiguration{ } @Override + public List<String> getMsgBusAddress() { + return new ArrayList<>(); + } + + @Override public String getKeyStorePath() { - //return ""; - return "etc/asdc-client.jks"; + return StringUtils.EMPTY; } @Override @@ -189,4 +196,9 @@ public class SimpleConfiguration implements IConfiguration{ return true; } + @Override + public boolean isConsumeProduceStatusTopic() { + return false; + } + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/IDistributionClient.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/IDistributionClient.java index 620babf..8caf109 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/IDistributionClient.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/IDistributionClient.java @@ -22,33 +22,34 @@ package org.openecomp.sdc.api; import java.util.List; -import org.openecomp.sdc.api.consumer.IConfiguration; -import org.openecomp.sdc.api.consumer.IDistributionStatusMessage; -import org.openecomp.sdc.api.consumer.INotificationCallback; +import org.openecomp.sdc.api.consumer.*; +import org.openecomp.sdc.api.consumer.IStatusCallback; import org.openecomp.sdc.api.notification.IArtifactInfo; import org.openecomp.sdc.api.notification.IVfModuleMetadata; import org.openecomp.sdc.api.results.IDistributionClientDownloadResult; import org.openecomp.sdc.api.results.IDistributionClientResult; public interface IDistributionClient { - + /** * Update the configuration of the distribution client <br> - * Updatable configuration parameters are: pollingInterval, pollingTimeout, consumerGroup and relevantArtifactTypes + * Updatable configuration parameters are: pollingInterval, pollingTimeout, + * consumerGroup and relevantArtifactTypes * - * @param newConf - contains updated configuration + * @param newConf + * - contains updated configuration * * @return IDistributionClientResult */ IDistributionClientResult updateConfiguration(IConfiguration newConf); - + /** * Retrieve the configuration of the distribution client <br> * * @return IConfiguration */ IConfiguration getConfiguration(); - + /** * Start distribution client <br> * - start polling notification topic <br> @@ -56,17 +57,17 @@ public interface IDistributionClient { * @return IDistributionClientResult */ IDistributionClientResult start(); - + /** * Stop distribution client <br> * - stop polling notification topic <br> * - unregister topics (via ASDC) <br> - * - delete keys from UEB + * - delete keys from UEB * * @return IDistributionClientResult */ IDistributionClientResult stop(); - + /** * Downloads an artifact from ASDC Catalog <br> * @@ -74,66 +75,136 @@ public interface IDistributionClient { * @return IDistributionClientDownloadResult */ IDistributionClientDownloadResult download(IArtifactInfo artifactInfo); - + /** - * Initialize the distribution client <br> - * - fetch the UEB server list from ASDC <br> - * - create keys in UEB <br> - * - register for topics (via ASDC) <br> - * - set the notification callback <br> - * - * Note: all configuration fields are mandatory. <br> - * Password must be in clear text and not encrypted <br> - * ECOMP-Component MUST store password as SHA-2 (256) hashed with dynamically generated salt value <br> + * Initialize the distribution client <br> + * - fetch the UEB server list from ASDC <br> + * - create keys in UEB <br> + * - register for topics (via ASDC) <br> + * - set the notification callback <br> + * + * Note: all configuration fields are mandatory. <br> + * Password must be in clear text and not encrypted <br> + * ONAP-Component MUST store password as SHA-2 (256) hashed with + * dynamically generated salt value <br> * * @param conf * @param callback * @return IDistributionClientResult */ IDistributionClientResult init(IConfiguration conf, INotificationCallback callback); - - + /** - * Build and publish Distribution Download Status event to Distribution Status Topic + * Initialize the distribution client <br> + * - fetch the UEB server list from ASDC <br> + * - create keys in UEB <br> + * - register for topics (via ASDC) <br> + * - set the notification callback <br> + * + * Note: all configuration fields are mandatory. <br> + * Password must be in clear text and not encrypted <br> + * ONAP-Component MUST store password as SHA-2 (256) hashed with + * dynamically generated salt value <br> + * + * @param conf + * @param notificationCallback + * @param statusCallback + * @return IDistributionClientResult + */ + IDistributionClientResult init(IConfiguration conf, INotificationCallback notificationCallback, + IStatusCallback statusCallback); + + /** + * Build and publish Distribution Download Status event to Distribution + * Status Topic * * @param statusMessage * @return IDistributionClientResult */ IDistributionClientResult sendDownloadStatus(IDistributionStatusMessage statusMessage); - + /** - * Build and publish Distribution Download Status event to Distribution Status Topic With Error Reason. + * Build and publish Distribution Download Status event to Distribution + * Status Topic With Error Reason. * * @param statusMessage * @param errorReason * @return IDistributionClientResult */ IDistributionClientResult sendDownloadStatus(IDistributionStatusMessage statusMessage, String errorReason); + + /** + * Build and publish Distribution Deployment Status event to Distribution + * Status Topic + * + * @param statusMessage + * @return IDistributionClientResult + */ + IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage statusMessage); + + /** + * Build and publish Distribution Deployment Status event to Distribution + * Status Topic With Error Reason. + * + * @param statusMessage + * @param errorReason + * @return IDistributionClientResult + */ + IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage statusMessage, String errorReason); + + /** + * Build and publish Distribution Component Status event to Distribution + * Status Topic + * + * @param statusMessage + * @return IDistributionClientResult + */ + IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage); + + /** + * Build and publish Distribution Component Status event to Distribution + * Status Topic With Error Reason. + * + * @param statusMessage + * @param errorReason + * @return IDistributionClientResult + */ + IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage, String errorReason); /** - * Build and publish Distribution Deployment Status event to Distribution Status Topic + * Build and publish Distribution Final Status event to Distribution + * Status Topic * * @param statusMessage * @return IDistributionClientResult */ - IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage statusMessage); + IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage); + /** - * Build and publish Distribution Deployment Status event to Distribution Status Topic With Error Reason. + * Build and publish Distribution Final Status event to Distribution + * Status Topic With Error Reason. * * @param statusMessage * @param errorReason * @return IDistributionClientResult */ - IDistributionClientResult sendDeploymentStatus(IDistributionStatusMessage statusMessage, String errorReason); + IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage, String errorReason); + - /**This method parses artifact of type VF_MODULES_METADATA payload data .<br> - * Method is deprecated due to VF Module changes. Only backward compatibility is supported.<br> + /** + * This method parses artifact of type VF_MODULES_METADATA payload data + * .<br> + * Method is deprecated due to VF Module changes. Only backward + * compatibility is supported.<br> + * * @param artifactPayload * @return IVfModuleMetadata list */ - @Deprecated + @Deprecated List<IVfModuleMetadata> decodeVfModuleArtifact(byte[] artifactPayload); + + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/asdc/RegistrationRequest.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/asdc/RegistrationRequest.java index f6ce949..1e398be 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/asdc/RegistrationRequest.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/asdc/RegistrationRequest.java @@ -20,14 +20,37 @@ package org.openecomp.sdc.api.asdc; +import java.util.List; + public class RegistrationRequest { String apiPublicKey; String distrEnvName; - - public RegistrationRequest(String apiPublicKey, String distrEnvName) { + Boolean isConsumerToSdcDistrStatusTopic; + List<String> distEnvEndPoints; + + public RegistrationRequest(String apiPublicKey, String distrEnvName, boolean isConsumerToSdcDistrStatusTopic, List<String> distEnvEndPoints) { this.apiPublicKey = apiPublicKey; this.distrEnvName = distrEnvName; + this.isConsumerToSdcDistrStatusTopic = isConsumerToSdcDistrStatusTopic; + this.distEnvEndPoints = distEnvEndPoints; + } + + public String getApiPublicKey() { + return apiPublicKey; + } + + public String getDistrEnvName() { + return distrEnvName; } - + + public Boolean getIsConsumerToSdcDistrStatusTopic() { + return isConsumerToSdcDistrStatusTopic; + } + + public List<String> getDistEnvEndPoints() { + return distEnvEndPoints; + } + + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IComponentDoneStatusMessage.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IComponentDoneStatusMessage.java new file mode 100644 index 0000000..25661bf --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IComponentDoneStatusMessage.java @@ -0,0 +1,7 @@ +package org.openecomp.sdc.api.consumer; + +public interface IComponentDoneStatusMessage extends IDistributionStatusMessageBasic { + String getComponentName(); + default String getArtifactURL(){return "";} + +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IConfiguration.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IConfiguration.java index 19f94df..51d219f 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IConfiguration.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IConfiguration.java @@ -24,98 +24,134 @@ import java.util.List; import org.openecomp.sdc.api.notification.INotificationData; public interface IConfiguration { - /**SDC Distribution Engine address. - * Value can be either hostname (with or without port), IP:port or FQDN (Fully Qualified Domain Name). - * * @return SDC Distribution Engine address. - */ - String getAsdcAddress(); - + /** + * SDC Distribution Engine address. Value can be either hostname (with or + * without port), IP:port or FQDN (Fully Qualified Domain Name). * @return + * SDC Distribution Engine address. + */ + String getAsdcAddress(); + + /**SDC Distribution Addresses from ONAP Component + * Values need to be set from impl + */ + List<String> getMsgBusAddress(); + /** * User Name for SDC distribution consumer authentication. + * * @return User Name. */ - String getUser(); - + String getUser(); + /** * User Password for SDC distribution consumer authentication. + * * @return User Password. */ - String getPassword(); - + String getPassword(); + /** - * Distribution Client Polling Interval towards UEB in seconds. - * Can Be reconfigured in runtime. + * Distribution Client Polling Interval towards UEB in seconds. Can Be + * reconfigured in runtime. + * * @return Distribution Client Polling Interval. */ - int getPollingInterval(); - + int getPollingInterval(); + /** - * Distribution Client Timeout in seconds waiting to UEB server response in each fetch interval. - * Can Be reconfigured in runtime. + * Distribution Client Timeout in seconds waiting to UEB server response in + * each fetch interval. Can Be reconfigured in runtime. + * * @return Distribution Client Timeout in seconds. */ - int getPollingTimeout(); - - /** List of artifact types.<br> - * If the service contains any of the artifacts in the list, the callback will be activated. - * Can Be reconfigured in runtime. + int getPollingTimeout(); + + /** + * List of artifact types.<br> + * If the service contains any of the artifacts in the list, the callback + * will be activated. Can Be reconfigured in runtime. + * * @return List of artifact types. */ List<String> getRelevantArtifactTypes(); - + /** - * Returns the consumer group defined for this ECOMP component, if no consumer group is defined return null. + * Returns the consumer group defined for this ECOMP component, if no + * consumer group is defined return null. + * * @return Consumer group. */ String getConsumerGroup(); - + /** - * Returns the environment name (testing, production etc...). - * Can Be reconfigured in runtime. - * @return + * Returns the environment name (testing, production etc...). Can Be + * reconfigured in runtime. + * + * @return */ String getEnvironmentName(); - + /** * Unique ID of ECOMP component instance (e.x INSTAR name). + * * @return */ String getConsumerID(); - + /** - * Return full path to Client's Key Store that contains either CA certificate or the ASDC's public key (e.g /etc/keystore/asdc-client.jks) + * Return full path to Client's Key Store that contains either CA + * certificate or the ASDC's public key (e.g /etc/keystore/asdc-client.jks) * file will be deployed with sdc-distribution jar. + * * @return */ String getKeyStorePath(); - + /** * @return Returns client's Key Store password */ String getKeyStorePassword(); - + /** - * Sets whether SDC server TLS authentication is activated. - * If set to false, Key Store path and password are not needed to be set. + * Sets whether SDC server TLS authentication is activated. If set to false, + * Key Store path and password are not needed to be set. + * * @return */ boolean activateServerTLSAuth(); - + /** - * If set to true the method {@link INotificationData#getResources()} will return all found resources.<br> - * That means that metadata of resources that do not contain relevant artifacts types (artifacts that are defined in {@link #getRelevantArtifactTypes()} will be returned.<br> - * Setting the method to false will activate the legacy behavior, in which empty resources are not part of the notification.<br> + * If set to true the method {@link INotificationData#getResources()} will + * return all found resources.<br> + * That means that metadata of resources that do not contain relevant + * artifacts types (artifacts that are defined in + * {@link #getRelevantArtifactTypes()} will be returned.<br> + * Setting the method to false will activate the legacy behavior, in which + * empty resources are not part of the notification.<br> + * * @return */ boolean isFilterInEmptyResources(); /** - * By default, Distribution Client will use HTTPS (TLS 1.2) when connecting to DMAAP. - * This param can be null, then default (HTTPS) behavior will be applied. - * If set to false, distribution client will use HTTP when connecting to DMAAP. + * By default, Distribution Client will use HTTPS (TLS 1.2) when connecting + * to DMAAP. This param can be null, then default (HTTPS) behavior will be + * applied. If set to false, distribution client will use HTTP when + * connecting to DMAAP. + * * @return */ Boolean isUseHttpsWithDmaap(); -} - + /** + * By default, (false value) Distribution Client will trigger the regular registration + * towards SDC (register component as consumer to the SDC-DISTR-NOTIF-TOPIC-[ENV] topic and register component as producer to the SDC-DISTR-STATUS-TOPIC-[ENV]).<br> + * If set to true, distribution client trigger Register to SDC indicating + * that this component request to be consumer and producer of the + * SDC-DISTR-STATUS-TOPIC-[ENV] topic.<br> + * @return + */ + default boolean isConsumeProduceStatusTopic() { + return false; + } +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessage.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessage.java index 86251d1..ab3d6a7 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessage.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessage.java @@ -20,33 +20,9 @@ package org.openecomp.sdc.api.consumer; -import org.openecomp.sdc.utils.DistributionStatusEnum; +public interface IDistributionStatusMessage extends IDistributionStatusMessageBasic{ -public interface IDistributionStatusMessage { - /** - * Distribution ID published in the distribution notification.<br> - * Should be used to link the distribution status reports to the appropriate - * distribution activation.<br> - * Global Distribution Identifier: UUID generated by ASDC per each - * distribution activation.<br> - * Generated UUID is compliant with RFC 4122. It is a 128-bit value - * formatted into blocks of hexadecimal digits separated by a hyphen ("-"). - * Ex.: AA97B177-9383-4934-8543-0F91A7A02836 - */ - String getDistributionID(); - - /**Unique ID of ECOMP component instance (e.x INSTAR name)*/ - String getConsumerID(); - - /** - * Timestamp of the distribution status report creation.<br> - * The number of seconds that have elapsed since January 1, 1970. - */ - long getTimestamp(); - /**Resource URL of the downloaded/deployed artifact - URL specified in the distribution notification message*/ String getArtifactURL(); - - /**Download/Deployment status*/ - DistributionStatusEnum getStatus(); + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessageBasic.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessageBasic.java new file mode 100644 index 0000000..fb1194d --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IDistributionStatusMessageBasic.java @@ -0,0 +1,28 @@ +package org.openecomp.sdc.api.consumer; + +import org.openecomp.sdc.utils.DistributionStatusEnum; + +public interface IDistributionStatusMessageBasic { + /** + * Distribution ID published in the distribution notification.<br> + * Should be used to link the distribution status reports to the appropriate + * distribution activation.<br> + * Global Distribution Identifier: UUID generated by SDC per each + * distribution activation.<br> + * Generated UUID is compliant with RFC 4122. It is a 128-bit value + * formatted into blocks of hexadecimal digits separated by a hyphen ("-"). + * Ex.: AA97B177-9383-4934-8543-0F91A7A02836 + */ + String getDistributionID(); + + /**Unique ID of ONAP component instance (e.x INSTAR name)*/ + String getConsumerID(); + + /** + * Timestamp of the distribution status report creation.<br> + * The number of seconds that have elapsed since January 1, 1970. + */ + long getTimestamp(); + /**Download/Deployment status*/ + DistributionStatusEnum getStatus(); +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IFinalDistrStatusMessage.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IFinalDistrStatusMessage.java new file mode 100644 index 0000000..42affd7 --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IFinalDistrStatusMessage.java @@ -0,0 +1,9 @@ +package org.openecomp.sdc.api.consumer; + + + +public interface IFinalDistrStatusMessage extends IDistributionStatusMessageBasic{ + + default String getConsumerID(){return "";} + default String getComponentName(){return "";} +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IStatusCallback.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IStatusCallback.java new file mode 100644 index 0000000..a889f52 --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/consumer/IStatusCallback.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-distribution-client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.api.consumer; + +import org.openecomp.sdc.api.notification.IStatusData; + +/** + * When a relevant status will be found activateCallback method will be + * activated with the status data.<br> + * Please implement it according to your desired callback logic. + */ +@FunctionalInterface +public interface IStatusCallback { + void activateCallback(IStatusData data); + + +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/notification/IStatusData.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/notification/IStatusData.java new file mode 100644 index 0000000..7a46686 --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/api/notification/IStatusData.java @@ -0,0 +1,65 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-distribution-client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.api.notification; + +import org.openecomp.sdc.utils.DistributionStatusEnum; + +public interface IStatusData { + /** + * Global Distribution Identifier: UUID generated by SDC per each + * distribution activation.<br> + * Generated UUID is compliant with RFC 4122.<br> + * It is a 128-bit value formatted into blocks of hexadecimal digits + * separated by a hyphen ("-").<br> + * Ex.: AA97B177-9383-4934-8543-0F91A7A02836 + */ + String getDistributionID(); + + /** Unique ID of ONAP component instance (e.x INSTAR name). */ + String getConsumerID(); + + /** The predefined ONAP component name configured on the component. */ + String getComponentName(); + + /** + * Timestamp of the distribution status report creation. The number of + * seconds that have elapsed since January 1, 1970 + */ + Long getTimestamp(); + /** + * Resource URL of the downloaded/deployed artifact - URL specified in the + * distribution notification message. + */ + String getArtifactURL(); + /** + * Status Event type + */ + DistributionStatusEnum getStatus(); + /** + * Error Reason describing the Status Event. + */ + String getErrorReason(); + + + + + +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java index 7ace38f..c3a486a 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/HttpAsdcClient.java @@ -60,7 +60,6 @@ import org.apache.http.message.BasicHeader; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.TrustStrategy; import org.openecomp.sdc.api.consumer.IConfiguration; -import org.openecomp.sdc.impl.DistributionClientImpl; import org.openecomp.sdc.utils.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,19 +74,19 @@ public class HttpAsdcClient implements IHttpAsdcClient { private String serverFqdn = null; private String authHeaderValue = ""; - public HttpAsdcClient(IConfiguration configuraion/* String serverFqdn, String username, String password */) { + public HttpAsdcClient(IConfiguration configuraion) { this.serverFqdn = configuraion.getAsdcAddress(); + String username = configuraion.getUser(); String password = configuraion.getPassword(); - - initSSL(serverFqdn, username, password, configuraion.getKeyStorePath(), configuraion.getKeyStorePassword(), configuraion.activateServerTLSAuth()); + initSSL(username, password, configuraion.getKeyStorePath(), configuraion.getKeyStorePassword(), configuraion.activateServerTLSAuth()); String userNameAndPassword = username + ":" + password; this.authHeaderValue = "Basic " + Base64.encodeBase64String(userNameAndPassword.getBytes()); } // @SuppressWarnings("deprecation") - private void initSSL(String serverFqdn, String username, String password, String keyStorePath, String keyStoePass, boolean isSupportSSLVerification) { + private void initSSL(String username, String password, String keyStorePath, String keyStoePass, boolean isSupportSSLVerification) { try { HostnameVerifier hostnameVerifier = new HostnameVerifier() { @@ -245,9 +244,9 @@ public class HttpAsdcClient implements IHttpAsdcClient { log.error("failed to close http response"); } } - ret = new Pair<HttpAsdcResponse, CloseableHttpResponse>(response, null); + ret = new Pair<>(response, null); } else { - ret = new Pair<HttpAsdcResponse, CloseableHttpResponse>(response, httpResponse); + ret = new Pair<>(response, httpResponse); } } @@ -264,7 +263,7 @@ public class HttpAsdcClient implements IHttpAsdcClient { Pair<HttpAsdcResponse, CloseableHttpResponse> ret; CloseableHttpResponse httpResponse = null; String url = HTTPS + serverFqdn + requestUrl; - log.debug("url to send " + url); + log.debug("url to send {}", url); HttpGet httpGet = new HttpGet(url); List<Header> headers = addHeadersToHttpRequest(headersMap); for (Header header : headers) { @@ -277,16 +276,16 @@ public class HttpAsdcClient implements IHttpAsdcClient { try { httpResponse = httpClient.execute(httpGet); - log.debug("GET Response Status " + httpResponse.getStatusLine().getStatusCode()); + log.debug("GET Response Status {}", httpResponse.getStatusLine().getStatusCode()); Header[] headersRes = httpResponse.getAllHeaders(); - Map<String, String> headersResMap = new HashMap<String, String>(); + Map<String, String> headersResMap = new HashMap<>(); for (Header header : headersRes) { headersResMap.put(header.getName(), header.getValue()); } response = new HttpAsdcResponse(httpResponse.getStatusLine().getStatusCode(), httpResponse.getEntity(), headersResMap); } catch (UnknownHostException | ConnectException e) { - log.error("failed to connect to url: " + requestUrl, e); + log.error("failed to connect to url: {}", requestUrl, e); StringEntity errorEntity = null; try { errorEntity = new StringEntity("failed to connect"); diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/AsdcConnectorClient.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/SdcConnectorClient.java index 0ef1711..2ae78af 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/AsdcConnectorClient.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/http/SdcConnectorClient.java @@ -57,9 +57,9 @@ import com.google.gson.reflect.TypeToken; import fj.data.Either; -public class AsdcConnectorClient { +public class SdcConnectorClient { String contentDispositionHeader = "Content-Disposition"; - private static Logger log = LoggerFactory.getLogger(AsdcConnectorClient.class.getName()); + private static Logger log = LoggerFactory.getLogger(SdcConnectorClient.class.getName()); private IConfiguration configuration; private HttpAsdcClient httpClient = null; @@ -90,22 +90,6 @@ public class AsdcConnectorClient { this.httpClient = httpClient; } - public Either<List<String>, IDistributionClientResult> getServerList() { - Pair<HttpAsdcResponse, CloseableHttpResponse> getServersResponsePair = performAsdcServerRequest(AsdcUrls.GET_CLUSTER_SERVER_LIST); - HttpAsdcResponse getServersResponse = getServersResponsePair.getFirst(); - - Either<List<String>, IDistributionClientResult> response; - if (getServersResponse.getStatus() == HttpStatus.SC_OK) { - response = parseGetServersResponse(getServersResponse); - } else { - IDistributionClientResult asdcError = handleAsdcError(getServersResponse); - response = Either.right(asdcError); - - } - handeAsdcConnectionClose(getServersResponsePair); - return response; - - } public Either<List<String>, IDistributionClientResult> getValidArtifactTypesList() { Pair<HttpAsdcResponse, CloseableHttpResponse> getServersResponsePair = performAsdcServerRequest(AsdcUrls.GET_VALID_ARTIFACT_TYPES); @@ -151,7 +135,7 @@ public class AsdcConnectorClient { String requestId = UUID.randomUUID().toString(); Map<String, String> requestHeaders = addHeadersToHttpRequest(requestId); - RegistrationRequest registrationRequest = new RegistrationRequest(credential.getApiKey(), configuration.getEnvironmentName()); + RegistrationRequest registrationRequest = new RegistrationRequest(credential.getApiKey(), configuration.getEnvironmentName(), configuration.isConsumeProduceStatusTopic(), configuration.getMsgBusAddress()); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonRequest = gson.toJson(registrationRequest); StringEntity body = new StringEntity(jsonRequest, ContentType.APPLICATION_JSON); @@ -183,7 +167,7 @@ public class AsdcConnectorClient { HttpAsdcClient httpClient = new HttpAsdcClient(configuration); Map<String, String> requestHeaders = addHeadersToHttpRequest(requestId); - RegistrationRequest registrationRequest = new RegistrationRequest(credential.getApiKey(), configuration.getEnvironmentName()); + RegistrationRequest registrationRequest = new RegistrationRequest(credential.getApiKey(), configuration.getEnvironmentName(), configuration.isConsumeProduceStatusTopic(), configuration.getMsgBusAddress()); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonRequest = gson.toJson(registrationRequest); StringEntity body = new StringEntity(jsonRequest, ContentType.APPLICATION_JSON); @@ -275,7 +259,7 @@ public class AsdcConnectorClient { return result; } - private Either<TopicRegistrationResponse, DistributionClientResultImpl> parseRegistrationResponse(HttpAsdcResponse registerResponse) { + Either<TopicRegistrationResponse, DistributionClientResultImpl> parseRegistrationResponse(HttpAsdcResponse registerResponse) { String jsonMessage; try { @@ -302,8 +286,8 @@ public class AsdcConnectorClient { } } - private Map<String, String> addHeadersToHttpRequest(String requestId) { - Map<String, String> requestHeaders = new HashMap<String, String>(); + protected Map<String, String> addHeadersToHttpRequest(String requestId) { + Map<String, String> requestHeaders = new HashMap<>(); requestHeaders.put(DistributionClientConstants.HEADER_REQUEST_ID, requestId); requestHeaders.put(DistributionClientConstants.HEADER_INSTANCE_ID, configuration.getConsumerID()); requestHeaders.put(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString()); diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/Configuration.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/Configuration.java index dff8a3b..851a198 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/Configuration.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/Configuration.java @@ -22,12 +22,15 @@ package org.openecomp.sdc.impl; import java.util.List; +import fj.data.Either; import org.openecomp.sdc.api.consumer.IConfiguration; +import org.openecomp.sdc.api.results.IDistributionClientResult; +import org.openecomp.sdc.utils.DistributionActionResultEnum; import org.openecomp.sdc.utils.DistributionClientConstants; -public class Configuration implements IConfiguration{ +public class Configuration implements IConfiguration { - + private List<String> msgBusAddressList; private String asdcAddress; private String user; private String password; @@ -39,12 +42,14 @@ public class Configuration implements IConfiguration{ private String comsumerID; private String keyStorePath; private String keyStorePassword; - private boolean activateServerTLSAuth; + private boolean activateServerTLSAuth; private boolean filterInEmptyResources; private Boolean useHttpsWithDmaap; + private boolean consumeProduceStatusTopic; public Configuration(IConfiguration other) { this.asdcAddress = other.getAsdcAddress(); + this.msgBusAddressList = other.getMsgBusAddress(); this.comsumerID = other.getConsumerID(); this.consumerGroup = other.getConsumerGroup(); this.environmentName = other.getEnvironmentName(); @@ -58,6 +63,7 @@ public class Configuration implements IConfiguration{ this.activateServerTLSAuth = other.activateServerTLSAuth(); this.filterInEmptyResources = other.isFilterInEmptyResources(); this.useHttpsWithDmaap = other.isUseHttpsWithDmaap(); + this.consumeProduceStatusTopic = other.isConsumeProduceStatusTopic(); } @Override @@ -66,6 +72,11 @@ public class Configuration implements IConfiguration{ } @Override + public List<String> getMsgBusAddress() { + return msgBusAddressList; + } + + @Override public String getUser() { return user; } @@ -104,11 +115,11 @@ public class Configuration implements IConfiguration{ public String getConsumerID() { return comsumerID; } - + @Override public String getKeyStorePath() { return keyStorePath; - } + } @Override public String getKeyStorePassword() { @@ -154,7 +165,7 @@ public class Configuration implements IConfiguration{ public void setEnvironmentName(String environmentName) { this.environmentName = environmentName; } - + public void setKeyStorePath(String keyStorePath) { this.keyStorePath = keyStorePath; } @@ -163,7 +174,6 @@ public class Configuration implements IConfiguration{ this.keyStorePassword = keyStorePassword; } - public void setactivateServerTLSAuth(boolean activateServerTLSAuth) { this.activateServerTLSAuth = activateServerTLSAuth; } @@ -172,7 +182,7 @@ public class Configuration implements IConfiguration{ public boolean activateServerTLSAuth() { return this.activateServerTLSAuth; } - + @Override public boolean isFilterInEmptyResources() { return this.filterInEmptyResources; @@ -182,19 +192,37 @@ public class Configuration implements IConfiguration{ public Boolean isUseHttpsWithDmaap() { return this.useHttpsWithDmaap; } - - public void setUseHttpsWithDmaap(boolean useHttpsWithDmaap){ + + public void setUseHttpsWithDmaap(boolean useHttpsWithDmaap) { this.useHttpsWithDmaap = useHttpsWithDmaap; } @Override + public boolean isConsumeProduceStatusTopic() { + return this.consumeProduceStatusTopic; + } + + @Override public String toString() { - return "Configuration [asdcAddress=" + asdcAddress + ", user=" + user + ", password=" + password - + ", pollingInterval=" + pollingInterval + ", pollingTimeout=" + pollingTimeout - + ", relevantArtifactTypes=" + relevantArtifactTypes + ", consumerGroup=" + consumerGroup - + ", environmentName=" + environmentName + ", comsumerID=" + comsumerID + ", keyStorePath=" - + keyStorePath + ", keyStorePassword=" + keyStorePassword + ", activateServerTLSAuth=" - + activateServerTLSAuth + ", filterInEmptyResources=" + filterInEmptyResources + ", useHttpsWithDmaap=" - + useHttpsWithDmaap + "]"; + //@formatter:off + return "Configuration ["+ + "asdcAddress=" + asdcAddress + + ", user=" + user + + ", password=" + password + + ", pollingInterval=" + pollingInterval + + ", pollingTimeout=" + pollingTimeout + + ", relevantArtifactTypes=" + relevantArtifactTypes + + ", consumerGroup=" + consumerGroup + + ", environmentName=" + environmentName + + ", comsumerID=" + comsumerID + + ", keyStorePath=" + keyStorePath + + ", keyStorePassword=" + keyStorePassword + + ", activateServerTLSAuth=" + activateServerTLSAuth + + ", filterInEmptyResources=" + filterInEmptyResources + + ", useHttpsWithDmaap=" + useHttpsWithDmaap + + ", consumeProduceStatusTopic=" + consumeProduceStatusTopic + + "]"; + //@formatter:on } + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionClientImpl.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionClientImpl.java index 1543256..a8778e5 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionClientImpl.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionClientImpl.java @@ -20,6 +20,8 @@ package org.openecomp.sdc.impl; +import static java.util.Objects.isNull; + import java.io.IOException; import java.lang.reflect.Type; import java.net.MalformedURLException; @@ -27,6 +29,7 @@ import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -35,17 +38,16 @@ import java.util.regex.Matcher; import org.openecomp.sdc.api.IDistributionClient; import org.openecomp.sdc.api.IDistributionStatusMessageJsonBuilder; -import org.openecomp.sdc.api.consumer.IConfiguration; -import org.openecomp.sdc.api.consumer.IDistributionStatusMessage; -import org.openecomp.sdc.api.consumer.INotificationCallback; +import org.openecomp.sdc.api.consumer.*; import org.openecomp.sdc.api.notification.IArtifactInfo; import org.openecomp.sdc.api.notification.IVfModuleMetadata; import org.openecomp.sdc.api.results.IDistributionClientDownloadResult; import org.openecomp.sdc.api.results.IDistributionClientResult; -import org.openecomp.sdc.http.AsdcConnectorClient; +import org.openecomp.sdc.http.SdcConnectorClient; import org.openecomp.sdc.http.TopicRegistrationResponse; import org.openecomp.sdc.utils.DistributionActionResultEnum; import org.openecomp.sdc.utils.DistributionClientConstants; +import org.openecomp.sdc.utils.GeneralUtils; import org.openecomp.sdc.utils.Wrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,13 +73,14 @@ public class DistributionClientImpl implements IDistributionClient { private static Logger log = LoggerFactory.getLogger(DistributionClientImpl.class.getName()); - protected AsdcConnectorClient asdcConnector = new AsdcConnectorClient(); + protected SdcConnectorClient asdcConnector = new SdcConnectorClient(); private ScheduledExecutorService executorPool = null; protected CambriaIdentityManager cambriaIdentityManager = null; private List<String> brokerServers; protected ApiCredential credential; protected Configuration configuration; private INotificationCallback callback; + private IStatusCallback statusCallback; private String notificationTopic; private String statusTopic; private boolean isConsumerGroupGenerated = false; @@ -139,7 +142,8 @@ public class DistributionClientImpl implements IDistributionClient { public synchronized IDistributionClientResult start() { log.info("start DistributionClient"); - CambriaConsumer cambriaConsumer = null; + IDistributionClientResult startResult; + CambriaConsumer cambriaNotificationConsumer = null; Wrapper<IDistributionClientResult> errorWrapper = new Wrapper<>(); validateRunReady(errorWrapper); if (errorWrapper.isEmpty()) { @@ -147,30 +151,49 @@ public class DistributionClientImpl implements IDistributionClient { } if (errorWrapper.isEmpty()) { try { - cambriaConsumer = new ConsumerBuilder().authenticatedBy(credential.getApiKey(), credential.getApiSecret()).knownAs(configuration.getConsumerGroup(), configuration.getConsumerID()).onTopic(notificationTopic).usingHttps(configuration.isUseHttpsWithDmaap()).usingHosts(brokerServers) + cambriaNotificationConsumer = new ConsumerBuilder().authenticatedBy(credential.getApiKey(), credential.getApiSecret()).knownAs(configuration.getConsumerGroup(), configuration.getConsumerID()).onTopic(notificationTopic).usingHttps(configuration.isUseHttpsWithDmaap()).usingHosts(brokerServers) .withSocketTimeout(configuration.getPollingTimeout() * 1000).build(); + } catch (MalformedURLException | GeneralSecurityException e) { handleCambriaInitFailure(errorWrapper, e); } } - + if (errorWrapper.isEmpty()) { + + List<String> relevantArtifactTypes = configuration.getRelevantArtifactTypes(); + // Remove nulls from list - workaround for how configuration is built + while (relevantArtifactTypes.remove(null)); + + NotificationConsumer consumer = new NotificationConsumer(cambriaNotificationConsumer, callback, relevantArtifactTypes, this); + executorPool = Executors.newScheduledThreadPool(DistributionClientConstants.POOL_SIZE); + executorPool.scheduleAtFixedRate(consumer, 0, configuration.getPollingInterval(), TimeUnit.SECONDS); + + handleStatusConsumer(errorWrapper, executorPool); + } if (!errorWrapper.isEmpty()) { - return errorWrapper.getInnerElement(); + startResult = errorWrapper.getInnerElement(); + } + else{ + startResult = new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS, "distribution client started successfuly"); + isStarted = true; } - - List<String> relevantArtifactTypes = configuration.getRelevantArtifactTypes(); - // Remove nulls from list - workaround for how configuration is built - while (relevantArtifactTypes.remove(null)); - - NotificationConsumer consumer = new NotificationConsumer(cambriaConsumer, callback, relevantArtifactTypes, this); - executorPool = Executors.newScheduledThreadPool(DistributionClientConstants.POOL_SIZE); - executorPool.scheduleAtFixedRate(consumer, 0, configuration.getPollingInterval(), TimeUnit.SECONDS); - - DistributionClientResultImpl startResult = new DistributionClientResultImpl(DistributionActionResultEnum.SUCCESS, "distribution client started successfuly"); - isStarted = true; return startResult; } + private void handleStatusConsumer(Wrapper<IDistributionClientResult> errorWrapper, ScheduledExecutorService executorPool) { + if( configuration.isConsumeProduceStatusTopic()){ + CambriaConsumer cambriaStatusConsumer = null; + try { + cambriaStatusConsumer = new ConsumerBuilder().authenticatedBy(credential.getApiKey(), credential.getApiSecret()).knownAs(configuration.getConsumerGroup(), configuration.getConsumerID()).onTopic(statusTopic).usingHttps(configuration.isUseHttpsWithDmaap()).usingHosts(brokerServers) + .withSocketTimeout(configuration.getPollingTimeout() * 1000).build(); + StatusConsumer statusConsumer = new StatusConsumer(cambriaStatusConsumer, statusCallback); + executorPool.scheduleAtFixedRate(statusConsumer, 0, configuration.getPollingInterval(), TimeUnit.SECONDS); + } catch (MalformedURLException | GeneralSecurityException e) { + handleCambriaInitFailure(errorWrapper, e); + } + } + } + @Override /* see javadoc */ public synchronized IDistributionClientResult stop() { @@ -219,7 +242,24 @@ public class DistributionClientImpl implements IDistributionClient { } return asdcConnector.dowloadArtifact(artifactInfo); } + @Override + public synchronized IDistributionClientResult init(IConfiguration conf, INotificationCallback notificationCallback, + IStatusCallback statusCallback) { + IDistributionClientResult initResult; + if( !conf.isConsumeProduceStatusTopic() ){ + initResult = new DistributionClientResultImpl(DistributionActionResultEnum.CONF_INVALID_CONSUME_PRODUCE_STATUS_TOPIC_FALG, "configuration is invalid: isConsumeProduceStatusTopic() should be set to 'true'" ); + } + else if( isNull(statusCallback) ){ + initResult = new DistributionClientResultImpl(DistributionActionResultEnum.CONF_INVALID_CONSUME_PRODUCE_STATUS_TOPIC_FALG, "configuration is invalid: statusCallback is not defined" ); + } + else{ + this.statusCallback = statusCallback; + initResult = init(conf, notificationCallback); + } + return initResult; + } + @Override /* * see javadoc @@ -236,7 +276,7 @@ public class DistributionClientImpl implements IDistributionClient { if (errorWrapper.isEmpty()) { validateAndInitConfiguration(errorWrapper, conf); } - // 1. get servers list from ASDC + // 1. get ueb server list from configuration if (errorWrapper.isEmpty()) { initUebServerList(errorWrapper); } @@ -295,6 +335,7 @@ public class DistributionClientImpl implements IDistributionClient { } private void validateArtifactTypesWithAsdcServer(IConfiguration conf, Wrapper<IDistributionClientResult> errorWrapper) { + asdcConnector.init(configuration); Either<List<String>, IDistributionClientResult> eitherValidArtifactTypesList = asdcConnector.getValidArtifactTypesList(); if (eitherValidArtifactTypesList.isRight()) { DistributionActionResultEnum errorType = eitherValidArtifactTypesList.right().value().getDistributionActionResult(); @@ -319,15 +360,16 @@ public class DistributionClientImpl implements IDistributionClient { } private void initUebServerList(Wrapper<IDistributionClientResult> errorWrapper) { - log.debug("get cluster server list from ASDC"); - asdcConnector.init(configuration); + log.debug("get ueb cluster server list from component(configuration file)"); - Either<List<String>, IDistributionClientResult> serverListResponse = asdcConnector.getServerList(); + Either<List<String>, IDistributionClientResult> serverListResponse = getUEBServerList(); if (serverListResponse.isRight()) { errorWrapper.setInnerElement(serverListResponse.right().value()); } else { + brokerServers = serverListResponse.left().value(); } + } private void validateNotInitilized(Wrapper<IDistributionClientResult> errorWrapper) { @@ -457,32 +499,25 @@ public class DistributionClientImpl implements IDistributionClient { result = DistributionActionResultEnum.CONF_MISSING_USERNAME; } else if (conf.getPassword() == null || conf.getPassword().isEmpty()) { result = DistributionActionResultEnum.CONF_MISSING_PASSWORD; + } else if (conf.getMsgBusAddress() == null || conf.getMsgBusAddress().isEmpty()) { + result = DistributionActionResultEnum.CONF_MISSING_MSG_BUS_ADDRESS; } else if (conf.getAsdcAddress() == null || conf.getAsdcAddress().isEmpty()) { result = DistributionActionResultEnum.CONF_MISSING_ASDC_FQDN; } else if (!isValidFqdn(conf.getAsdcAddress())) { result = DistributionActionResultEnum.CONF_INVALID_ASDC_FQDN; + } else if (!isValidFqdns(conf.getMsgBusAddress())){ + result = DistributionActionResultEnum.CONF_INVALID_MSG_BUS_ADDRESS; } else if (conf.getEnvironmentName() == null || conf.getEnvironmentName().isEmpty()) { result = DistributionActionResultEnum.CONF_MISSING_ENVIRONMENT_NAME; } else if (conf.getRelevantArtifactTypes() == null || conf.getRelevantArtifactTypes().isEmpty()) { result = DistributionActionResultEnum.CONF_MISSING_ARTIFACT_TYPES; } + else if( conf.isConsumeProduceStatusTopic() && Objects.isNull(statusCallback) ){ + result = DistributionActionResultEnum.CONF_INVALID_CONSUME_PRODUCE_STATUS_TOPIC_FALG; + } // DistributionActionResultEnum.SUCCESS else { - this.configuration = new Configuration(conf); - if (!isPollingIntervalValid(conf.getPollingInterval())) { - configuration.setPollingInterval(DistributionClientConstants.MIN_POLLING_INTERVAL_SEC); - } - if (!isPollingTimeoutValid(conf.getPollingTimeout())) { - configuration.setPollingTimeout(DistributionClientConstants.POLLING_TIMEOUT_SEC); - } - if (conf.getConsumerGroup() == null) { - generateConsumerGroup(); - } - - //Default use HTTPS with DMAAP - if (conf.isUseHttpsWithDmaap() == null){ - configuration.setUseHttpsWithDmaap(true); - } + handleValidConf(conf); } if (result != DistributionActionResultEnum.SUCCESS) { @@ -495,6 +530,24 @@ public class DistributionClientImpl implements IDistributionClient { return result; } + private void handleValidConf(IConfiguration conf) { + this.configuration = new Configuration(conf); + if (!isPollingIntervalValid(conf.getPollingInterval())) { + configuration.setPollingInterval(DistributionClientConstants.MIN_POLLING_INTERVAL_SEC); + } + if (!isPollingTimeoutValid(conf.getPollingTimeout())) { + configuration.setPollingTimeout(DistributionClientConstants.POLLING_TIMEOUT_SEC); + } + if (conf.getConsumerGroup() == null) { + generateConsumerGroup(); + } + + //Default use HTTPS with DMAAP + if (conf.isUseHttpsWithDmaap() == null){ + configuration.setUseHttpsWithDmaap(true); + } + } + private void generateConsumerGroup() { String generatedConsumerGroup = UUID.randomUUID().toString(); configuration.setConsumerGroup(generatedConsumerGroup); @@ -509,6 +562,19 @@ public class DistributionClientImpl implements IDistributionClient { } return false; } + protected boolean isValidFqdns(List<String> fqdns) { + if (fqdns != null && !fqdns.isEmpty()) { + for (String fqdn : fqdns) { + if (isValidFqdn(fqdn)) { + continue; + } else { + return false; + } + } + return true; + } + return false; + } private void shutdownExecutor() { if (executorPool == null) @@ -633,6 +699,31 @@ public class DistributionClientImpl implements IDistributionClient { } @Override + public IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage) { + log.info("DistributionClient - sendComponentDone status"); + Wrapper<IDistributionClientResult> errorWrapper = new Wrapper<>(); + validateRunReady(errorWrapper); + if (!errorWrapper.isEmpty()) { + return errorWrapper.getInnerElement(); + } + return sendStatus(DistributionStatusMessageJsonBuilderFactory.getSimpleBuilder(statusMessage)); + + } + + @Override + public IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage, + String errorReason) { + log.info("DistributionClient - sendComponentDone status with errorReason"); + Wrapper<IDistributionClientResult> errorWrapper = new Wrapper<>(); + validateRunReady(errorWrapper); + if (!errorWrapper.isEmpty()) { + return errorWrapper.getInnerElement(); + } + return sendStatus(DistributionStatusMessageJsonBuilderFactory.getErrorReasonBuilder(statusMessage, errorReason)); + } + + + @Override public List<IVfModuleMetadata> decodeVfModuleArtifact(byte[] artifactPayload) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); String vfModuleJsonString = new String(artifactPayload, StandardCharsets.UTF_8); @@ -641,4 +732,47 @@ public class DistributionClientImpl implements IDistributionClient { List<IVfModuleMetadata> vfModules = gson.fromJson(vfModuleJsonString, type); return vfModules; } + + + public IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage) { + log.info("DistributionClient - sendFinalDistributionStatus status"); + Wrapper<IDistributionClientResult> errorWrapper = new Wrapper<>(); + validateRunReady(errorWrapper); + if (!errorWrapper.isEmpty()) { + return errorWrapper.getInnerElement(); + } + return sendStatus(DistributionStatusMessageJsonBuilderFactory.getSimpleBuilder(statusMessage)); + + } + + + @Override + public IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage, + String errorReason) { + log.info("DistributionClient - sendFinalDistributionStatus status with errorReason"); + Wrapper<IDistributionClientResult> errorWrapper = new Wrapper<>(); + validateRunReady(errorWrapper); + if (!errorWrapper.isEmpty()) { + return errorWrapper.getInnerElement(); + } + return sendStatus(DistributionStatusMessageJsonBuilderFactory.getErrorReasonBuilder(statusMessage, errorReason)); + + + } + + public Either<List<String>,IDistributionClientResult> getUEBServerList() { + List<String> msgBusAddresses = configuration.getMsgBusAddress(); + if(msgBusAddresses.isEmpty()){ + return Either.right(new DistributionClientResultImpl(DistributionActionResultEnum.CONF_MISSING_MSG_BUS_ADDRESS, "Message bus address was not found in the config file")); + } + else{ + return GeneralUtils.convertToValidHostName(msgBusAddresses); + } + } + + + + + + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageImpl.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageImpl.java index d570142..d9ed654 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageImpl.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageImpl.java @@ -20,78 +20,80 @@ package org.openecomp.sdc.impl; +import org.openecomp.sdc.api.consumer.IComponentDoneStatusMessage; import org.openecomp.sdc.api.consumer.IDistributionStatusMessage; +import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage; import org.openecomp.sdc.utils.DistributionStatusEnum; class DistributionStatusMessageImpl implements IDistributionStatusMessage { - - + String distributionID; String consumerID; long timestamp; String artifactURL; DistributionStatusEnum status; String errorReason; - - - public DistributionStatusMessageImpl(IDistributionStatusMessage message){ + private String componentName; + + public DistributionStatusMessageImpl(IDistributionStatusMessage message) { super(); distributionID = message.getDistributionID(); consumerID = message.getConsumerID(); timestamp = message.getTimestamp(); artifactURL = message.getArtifactURL(); status = message.getStatus(); - + + } + + public DistributionStatusMessageImpl(IComponentDoneStatusMessage message) { + super(); + distributionID = message.getDistributionID(); + consumerID = message.getConsumerID(); + timestamp = message.getTimestamp(); + artifactURL = message.getArtifactURL(); + status = message.getStatus(); + componentName = message.getComponentName(); + } + + public DistributionStatusMessageImpl(IFinalDistrStatusMessage message) { + super(); + distributionID = message.getDistributionID(); + consumerID = message.getConsumerID(); + timestamp = message.getTimestamp(); + + artifactURL = ""; + status = message.getStatus(); + componentName = message.getComponentName(); } @Override public String getDistributionID() { - + return distributionID; } @Override public String getConsumerID() { - + return consumerID; } @Override public long getTimestamp() { - + return timestamp; } @Override public String getArtifactURL() { - + return artifactURL; } @Override public DistributionStatusEnum getStatus() { - - return status; - } - - public void setDistributionID(String distributionID) { - this.distributionID = distributionID; - } - - public void setConsumerID(String consumerID) { - this.consumerID = consumerID; - } - - public void setTimestamp(long timestamp) { - this.timestamp = timestamp; - } - - public void setArtifactURL(String artifactURL) { - this.artifactURL = artifactURL; - } - public void setStatus(DistributionStatusEnum status) { - this.status = status; + return status; } public String getErrorReason() { @@ -102,4 +104,10 @@ class DistributionStatusMessageImpl implements IDistributionStatusMessage { this.errorReason = errorReason; } + public String getComponentName() { + return componentName; + } + + + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageJsonBuilderFactory.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageJsonBuilderFactory.java index 9d97805..e2f9f89 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageJsonBuilderFactory.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/DistributionStatusMessageJsonBuilderFactory.java @@ -21,7 +21,9 @@ package org.openecomp.sdc.impl; import org.openecomp.sdc.api.IDistributionStatusMessageJsonBuilder; +import org.openecomp.sdc.api.consumer.IComponentDoneStatusMessage; import org.openecomp.sdc.api.consumer.IDistributionStatusMessage; +import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage; import org.openecomp.sdc.utils.DistributionStatusEnum; import com.google.gson.Gson; @@ -35,6 +37,18 @@ public class DistributionStatusMessageJsonBuilderFactory { return prepareBuilderFromImpl(message); } + + public static IDistributionStatusMessageJsonBuilder getSimpleBuilder(IComponentDoneStatusMessage statusMessage){ + DistributionStatusMessageImpl message = new DistributionStatusMessageImpl(statusMessage); + + return prepareBuilderFromImpl(message); + } + + public static IDistributionStatusMessageJsonBuilder getSimpleBuilder(IFinalDistrStatusMessage statusMessage){ + DistributionStatusMessageImpl message = new DistributionStatusMessageImpl(statusMessage); + + return prepareBuilderFromImpl(message); + } public static IDistributionStatusMessageJsonBuilder getErrorReasonBuilder(IDistributionStatusMessage statusMessage, String errorReason){ DistributionStatusMessageImpl message = new DistributionStatusMessageImpl(statusMessage); @@ -42,6 +56,20 @@ public class DistributionStatusMessageJsonBuilderFactory { return prepareBuilderFromImpl(message); } + + public static IDistributionStatusMessageJsonBuilder getErrorReasonBuilder(IComponentDoneStatusMessage statusMessage, + String errorReason) { + DistributionStatusMessageImpl message = new DistributionStatusMessageImpl(statusMessage); + message.setErrorReason(errorReason); + return prepareBuilderFromImpl(message); + } + + public static IDistributionStatusMessageJsonBuilder getErrorReasonBuilder(IFinalDistrStatusMessage statusMessage, + String errorReason) { + DistributionStatusMessageImpl message = new DistributionStatusMessageImpl(statusMessage); + message.setErrorReason(errorReason); + return prepareBuilderFromImpl(message); + } static IDistributionStatusMessageJsonBuilder prepareBuilderForNotificationStatus(final String consumerId, final long currentTimeMillis, final String distributionId, final ArtifactInfoImpl artifactInfo, boolean isNotified){ @@ -112,6 +140,9 @@ public class DistributionStatusMessageJsonBuilderFactory { private enum DistributionStatusNotificationEnum { NOTIFIED, NOT_NOTIFIED } + + + } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusConsumer.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusConsumer.java new file mode 100644 index 0000000..34d85ec --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusConsumer.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-distribution-client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.impl; + +import org.openecomp.sdc.api.consumer.IStatusCallback; +import org.openecomp.sdc.api.notification.IStatusData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.att.nsa.cambria.client.CambriaConsumer; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +class StatusConsumer implements Runnable { + + private static Logger log = LoggerFactory.getLogger(StatusConsumer.class.getName()); + + private CambriaConsumer cambriaConsumer; + private IStatusCallback clientCallback; + + public StatusConsumer(CambriaConsumer cambriaConsumer, IStatusCallback clientCallback) { + this.cambriaConsumer = cambriaConsumer; + this.clientCallback = clientCallback; + } + + @Override + public void run() { + + try { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + for (String statusMsg : cambriaConsumer.fetch()) { + log.debug("received message from topic"); + log.debug("recieved notification from broker: {}", statusMsg); + IStatusData statusData = gson.fromJson(statusMsg, StatusDataImpl.class); + clientCallback.activateCallback(statusData); + + + } + + } catch (Exception e) { + log.error("Error exception occured when fetching with Cambria Client:{}", e.getMessage()); + log.debug("Error exception occured when fetching with Cambria Client:{}", e.getMessage(), e); + } + } + + + +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusDataImpl.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusDataImpl.java new file mode 100644 index 0000000..119a7f3 --- /dev/null +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/StatusDataImpl.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.impl; + +import org.openecomp.sdc.api.notification.IStatusData; +import org.openecomp.sdc.utils.DistributionStatusEnum; + +public class StatusDataImpl implements IStatusData{ + + String distributionID; + String consumerID; + long timestamp; + String artifactURL; + DistributionStatusEnum status; + String componentName; + String errorReason; + + @Override + public String getDistributionID() { + return distributionID; + } + + public void setDistributionID(String distributionId) { + this.distributionID = distributionId; + } + @Override + public String getConsumerID() { + return consumerID; + } + + public void setConsumerID(String consumerId) { + this.consumerID = consumerId; + } + @Override + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + @Override + public String getArtifactURL() { + return artifactURL; + } + + public void setArtifactURL(String artifactURL) { + this.artifactURL = artifactURL; + } + @Override + public DistributionStatusEnum getStatus() { + return status; + } + + public void setStatus(DistributionStatusEnum status) { + this.status = status; + } + + + @Override + public String toString() { + return "StatusDataImpl [distributionId=" + distributionID + ", consumerId=" + consumerID + ", timestamp=" + timestamp + ", artifactURL=" + artifactURL + ", status=" + status +", errorReason=" + errorReason+ "]"; + } + @Override + public String getComponentName() { + return componentName; + } + + @Override + public String getErrorReason() { + return errorReason; + } + + + + +} diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/mock/DistributionClientStubImpl.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/mock/DistributionClientStubImpl.java index b8044cd..1730290 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/mock/DistributionClientStubImpl.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/impl/mock/DistributionClientStubImpl.java @@ -23,18 +23,14 @@ package org.openecomp.sdc.impl.mock; import java.util.List; import org.openecomp.sdc.api.IDistributionClient; -import org.openecomp.sdc.api.consumer.IConfiguration; -import org.openecomp.sdc.api.consumer.IDistributionStatusMessage; -import org.openecomp.sdc.api.consumer.INotificationCallback; +import org.openecomp.sdc.api.consumer.*; import org.openecomp.sdc.api.notification.IArtifactInfo; import org.openecomp.sdc.api.notification.IVfModuleMetadata; import org.openecomp.sdc.api.results.IDistributionClientDownloadResult; import org.openecomp.sdc.api.results.IDistributionClientResult; /** Mock Implementation */ public class DistributionClientStubImpl implements IDistributionClient{ - public DistributionClientStubImpl(){ - - } + public IDistributionClientResult updateConfiguration(IConfiguration newConf) { return new DistributionClientResultStubImpl(); @@ -67,6 +63,12 @@ public class DistributionClientStubImpl implements IDistributionClient{ } @Override + public IDistributionClientResult init(IConfiguration conf, INotificationCallback notificationCallback, + IStatusCallback statusCallback) { + return new DistributionClientResultStubImpl(); + } + + @Override public IConfiguration getConfiguration() { // TODO Auto-generated method stub return null; @@ -87,10 +89,36 @@ public class DistributionClientStubImpl implements IDistributionClient{ } @Override + public IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage) { + return null; + } + + @Override + public IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage) { + return null; + } + + @Override public List<IVfModuleMetadata> decodeVfModuleArtifact(byte[] artifactPayload) { // TODO Auto-generated method stub return null; } + + @Override + public IDistributionClientResult sendComponentDoneStatus(IComponentDoneStatusMessage statusMessage, + String errorReason) { + // TODO Auto-generated method stub + return null; + } + + @Override + public IDistributionClientResult sendFinalDistrStatus(IFinalDistrStatusMessage statusMessage, String errorReason) { + // TODO Auto-generated method stub + return null; + } + + + diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionActionResultEnum.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionActionResultEnum.java index 47333d5..6ac4d35 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionActionResultEnum.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionActionResultEnum.java @@ -43,6 +43,9 @@ public enum DistributionActionResultEnum { CONF_MISSING_ENVIRONMENT_NAME, CONF_MISSING_CONSUMER_GROUP, CONF_INVALID_ASDC_FQDN, + CONF_INVALID_CONSUME_PRODUCE_STATUS_TOPIC_FALG, + CONF_MISSING_MSG_BUS_ADDRESS, + CONF_INVALID_MSG_BUS_ADDRESS, ASDC_AUTHENTICATION_FAILED, ASDC_AUTHORIZATION_FAILED, ASDC_NOT_FOUND, diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionStatusEnum.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionStatusEnum.java index 1d2d03c..13fcfcc 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionStatusEnum.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/DistributionStatusEnum.java @@ -21,21 +21,36 @@ package org.openecomp.sdc.utils; public enum DistributionStatusEnum { - /**Can be sent when ECOMP component successfully downloaded the specific artifact*/ + /**Can be sent when ONAP component successfully downloaded the specific artifact*/ DOWNLOAD_OK, - /**Can be sent when ECOMP component failed to download the specific artifact (corrupted file)*/ + /**Can be sent when ONAP component failed to download the specific artifact (corrupted file)*/ DOWNLOAD_ERROR, - /**Can be sent only if the repeated distribution notification event is sent when the ECOMP component already downloaded the artifact , but still not stored it in the local repository .*/ + /**Can be sent only if the repeated distribution notification event is sent when the ONAP component already downloaded the artifact , but still not stored it in the local repository .*/ ALREADY_DOWNLOADED, - /**Can be sent when ECOMP component successfully deployed the specific artifact in the local repository*/ + /**Can be sent when ONAP component successfully deployed the specific artifact in the local repository*/ DEPLOY_OK, - /**Can be sent when ECOMP component failed to store the downloaded artifact in the local repository*/ + /**Can be sent when ONAP component failed to store the downloaded artifact in the local repository*/ DEPLOY_ERROR, /**Sent when the repeated distribution notification event is sent for already stored in the local repository service artifact ( artifact's version and checksum match the one stored in the local repository)*/ - ALREADY_DEPLOYED + ALREADY_DEPLOYED, + /** + * ONAP component is requested to publish this status once component successfully complete downloading and storing all the data it needs from the service. + */ + COMPONENT_DONE_OK, + + /**ONAP component is requested to publish this status when component failed to download or failed to store one or more of the mandatory information it requires from the service model. + + It is recommended to populate the errorReason field with appropriate description of the error +*/ + COMPONENT_DONE_ERROR, + /** The DISTRIBUTION_COMPLETE_OK/ERROR status indicating the overall ONAP components status of retrieving and storing the information. +*/ + DISTRIBUTION_COMPLETE_OK, + + DISTRIBUTION_COMPLETE_ERROR } diff --git a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/GeneralUtils.java b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/GeneralUtils.java index 9d786d0..0f76574 100644 --- a/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/GeneralUtils.java +++ b/sdc-distribution-client/src/main/java/org/openecomp/sdc/utils/GeneralUtils.java @@ -20,12 +20,22 @@ package org.openecomp.sdc.utils; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Pattern; import org.apache.commons.codec.binary.Base64; +import org.openecomp.sdc.api.results.IDistributionClientResult; +import org.openecomp.sdc.impl.DistributionClientResultImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import fj.data.Either; public class GeneralUtils { - + private static final Logger log = LoggerFactory.getLogger(GeneralUtils.class.getName()); public static String calculateMD5 (String data){ String calculatedMd5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(data); // encode base-64 result @@ -59,4 +69,24 @@ public class GeneralUtils { return isEncoded; } + + public static Either<List<String>, IDistributionClientResult> convertToValidHostName(List<String> msgBusAddresses) { + List<String> uebLocalHostsNames = new ArrayList<>(); + for(String name : msgBusAddresses){ + try { + uebLocalHostsNames.add(InetAddress.getByName(name).getHostName()); + } catch (UnknownHostException e) { + log.debug("UnknownHost: {}", e.getMessage(), e); + } + } + Either<List<String>, IDistributionClientResult> response; + if( uebLocalHostsNames.isEmpty() ){ + response = Either.right(new DistributionClientResultImpl(DistributionActionResultEnum.CONF_INVALID_MSG_BUS_ADDRESS, "configuration is invalid: " + DistributionActionResultEnum.CONF_INVALID_MSG_BUS_ADDRESS.name())); + + } + else{ + response = Either.left(uebLocalHostsNames); + } + return response; + } } diff --git a/sdc-distribution-client/src/test/java/org/openecomp/sdc/http/SdcConnectorClientTest.java b/sdc-distribution-client/src/test/java/org/openecomp/sdc/http/SdcConnectorClientTest.java new file mode 100644 index 0000000..5ddc915 --- /dev/null +++ b/sdc-distribution-client/src/test/java/org/openecomp/sdc/http/SdcConnectorClientTest.java @@ -0,0 +1,119 @@ +package org.openecomp.sdc.http; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.openecomp.sdc.api.asdc.RegistrationRequest; +import org.openecomp.sdc.api.consumer.IConfiguration; +import org.openecomp.sdc.impl.DistributionClientResultImpl; +import org.openecomp.sdc.utils.Pair; + +import com.att.nsa.apiClient.credentials.ApiCredential; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import fj.data.Either; + +public class SdcConnectorClientTest { + private Gson gson = new GsonBuilder().create(); + private static final String MOCK_ENV = "MockEnv"; + private static final String MOCK_API_KEY = "MockApikey"; + private static HttpAsdcClient httpClient = Mockito.mock(HttpAsdcClient.class); + private static IConfiguration configuration = Mockito.mock(IConfiguration.class); + private static ApiCredential apiCredential = Mockito.mock(ApiCredential.class); + private static HttpAsdcResponse httpAsdcResponse = Mockito.mock(HttpAsdcResponse.class); + @SuppressWarnings("unchecked") + private static Either<TopicRegistrationResponse, DistributionClientResultImpl> mockResponse = Mockito + .mock(Either.class); + private static Map<String, String> mockHeaders = new HashMap<>(); + Pair<HttpAsdcResponse, CloseableHttpResponse> mockPair = new Pair<>(httpAsdcResponse, null); + private HttpEntity lastHttpEntity = null; + + private static SdcConnectorClient asdcClient = Mockito.spy(new SdcConnectorClient()); + + @BeforeClass + public static void beforeClass() { + asdcClient.setConfiguration(configuration); + asdcClient.setHttpClient(httpClient); + when(apiCredential.getApiKey()).thenReturn(MOCK_API_KEY); + when(httpAsdcResponse.getStatus()).thenReturn(HttpStatus.SC_OK); + + doReturn(mockHeaders).when(asdcClient).addHeadersToHttpRequest(Mockito.anyString()); + doReturn(mockResponse).when(asdcClient).parseRegistrationResponse(httpAsdcResponse); + } + + @Before + public void beforeMethod() { + Mockito.reset(configuration, httpClient); + lastHttpEntity = null; + when(configuration.getEnvironmentName()).thenReturn(MOCK_ENV); + + + doAnswer(new Answer<Pair<HttpAsdcResponse, CloseableHttpResponse>>() { + @Override + public Pair<HttpAsdcResponse, CloseableHttpResponse> answer(InvocationOnMock invocation) throws Throwable { + lastHttpEntity = invocation.getArgumentAt(1, HttpEntity.class); + return mockPair; + } + }).when(httpClient).postRequest(Mockito.eq(AsdcUrls.POST_FOR_TOPIC_REGISTRATION), Mockito.any(HttpEntity.class), + Mockito.eq(mockHeaders), Mockito.eq(false)); + } + + @Test + public void testConsumeProduceStatusTopicFalse() throws UnsupportedOperationException, IOException { + + testConsumeProduceStatusTopic(false); + + } + + @Test + public void testConsumeProduceStatusTopicTrue() throws UnsupportedOperationException, IOException { + + testConsumeProduceStatusTopic(true); + + } + + private void testConsumeProduceStatusTopic(final boolean isConsumeProduceStatusFlag) throws IOException { + when(configuration.isConsumeProduceStatusTopic()).thenReturn(isConsumeProduceStatusFlag); + asdcClient.registerAsdcTopics(apiCredential); + verify(httpClient, times(1)).postRequest(Mockito.eq(AsdcUrls.POST_FOR_TOPIC_REGISTRATION), + Mockito.any(HttpEntity.class), Mockito.eq(mockHeaders), Mockito.eq(false)); + assertNotNull(lastHttpEntity); + RegistrationRequest actualRegRequest = gson.fromJson(IOUtils.toString(lastHttpEntity.getContent(), StandardCharsets.UTF_8), RegistrationRequest.class); + RegistrationRequest expectedRegRequest = gson.fromJson(excpectedStringBody(isConsumeProduceStatusFlag), RegistrationRequest.class); + + assertTrue(actualRegRequest.getApiPublicKey().equals(expectedRegRequest.getApiPublicKey())); + assertTrue(actualRegRequest.getDistrEnvName().equals(expectedRegRequest.getDistrEnvName())); + assertTrue(actualRegRequest.getIsConsumerToSdcDistrStatusTopic() + .equals(expectedRegRequest.getIsConsumerToSdcDistrStatusTopic())); + } + + + + private String excpectedStringBody(boolean isConsumeProduceStatusTopic) { + String stringBodyTemplate = "{\r\n" + " \"apiPublicKey\": \"MockApikey\",\r\n" + + " \"distrEnvName\": \"MockEnv\",\r\n" + " \"isConsumerToSdcDistrStatusTopic\": %s\r\n" + "}"; + return String.format(stringBodyTemplate, isConsumeProduceStatusTopic); + + } +} diff --git a/sdc-distribution-client/src/test/java/org/openecomp/sdc/impl/DistributionClientTest.java b/sdc-distribution-client/src/test/java/org/openecomp/sdc/impl/DistributionClientTest.java index cf380cb..81f9a17 100644 --- a/sdc-distribution-client/src/test/java/org/openecomp/sdc/impl/DistributionClientTest.java +++ b/sdc-distribution-client/src/test/java/org/openecomp/sdc/impl/DistributionClientTest.java @@ -22,16 +22,14 @@ package org.openecomp.sdc.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; import java.io.IOException; -import java.net.MalformedURLException; -import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import org.openecomp.sdc.api.IDistributionClient; @@ -39,7 +37,7 @@ import org.openecomp.sdc.api.consumer.IConfiguration; import org.openecomp.sdc.api.notification.IArtifactInfo; import org.openecomp.sdc.api.notification.IVfModuleMetadata; import org.openecomp.sdc.api.results.IDistributionClientResult; -import org.openecomp.sdc.http.AsdcConnectorClient; +import org.openecomp.sdc.http.SdcConnectorClient; import org.openecomp.sdc.http.TopicRegistrationResponse; import org.openecomp.sdc.utils.ArtifactTypeEnum; import org.openecomp.sdc.utils.ArtifactsUtils; @@ -51,28 +49,17 @@ import org.openecomp.sdc.utils.Wrapper; import com.att.nsa.apiClient.credentials.ApiCredential; import com.att.nsa.apiClient.http.HttpException; import com.att.nsa.cambria.client.CambriaClient.CambriaApiException; -import com.att.nsa.cambria.client.CambriaClientBuilders; import com.att.nsa.cambria.client.CambriaIdentityManager; -import com.att.nsa.cambria.client.CambriaTopicManager; import fj.data.Either; public class DistributionClientTest { static CambriaIdentityManager cc; - static List<String> serverList; - DistributionClientImpl client = new DistributionClientImpl(); + DistributionClientImpl client = Mockito.spy(new DistributionClientImpl()); IConfiguration testConfiguration = new TestConfiguration(); - AsdcConnectorClient connector = Mockito.mock(AsdcConnectorClient.class); + SdcConnectorClient connector = Mockito.mock(SdcConnectorClient.class); - @BeforeClass - public static void setup() { - serverList = new ArrayList<String>(); - serverList.add("uebsb91sfdc.it.open.com:3904"); - serverList.add("uebsb92sfdc.it.open.com:3904"); - serverList.add("uebsb93sfdc.it.open.com:3904"); - - } @After public void afterTest() { @@ -150,9 +137,6 @@ public class DistributionClientTest { @Test public void initWithMocksBadConfigurationTest() throws HttpException, CambriaApiException, IOException { - // connectorMock - Either<List<String>, IDistributionClientResult> serversResult = Either.left(serverList); - Mockito.when(connector.getServerList()).thenReturn(serversResult); TopicRegistrationResponse topics = new TopicRegistrationResponse(); topics.setDistrNotificationTopicName("notificationTopic"); @@ -222,7 +206,7 @@ public class DistributionClientTest { validationResult = client.init(testEnv, new TestNotificationCallback()); Assert.assertEquals(DistributionActionResultEnum.CONF_MISSING_ENVIRONMENT_NAME, validationResult.getDistributionActionResult()); - Mockito.verify(connector, Mockito.times(0)).getServerList(); + Mockito.verify(client, Mockito.times(0)).getUEBServerList(); Mockito.verify(cambriaMock, Mockito.times(0)).createApiKey(Mockito.anyString(), Mockito.anyString()); Mockito.verify(connector, Mockito.times(0)).registerAsdcTopics(Mockito.any(ApiCredential.class)); } @@ -252,8 +236,6 @@ public class DistributionClientTest { @Test public void getConfigurationTest() throws HttpException, CambriaApiException, IOException { // connectorMock - Either<List<String>, IDistributionClientResult> serversResult = Either.left(serverList); - Mockito.when(connector.getServerList()).thenReturn(serversResult); mockArtifactTypeList(); TopicRegistrationResponse topics = new TopicRegistrationResponse(); topics.setDistrNotificationTopicName("notificationTopic"); @@ -300,9 +282,6 @@ public class DistributionClientTest { @Test public void initWithMocksTest() throws HttpException, CambriaApiException, IOException { - // connectorMock - Either<List<String>, IDistributionClientResult> serversResult = Either.left(serverList); - Mockito.when(connector.getServerList()).thenReturn(serversResult); mockArtifactTypeList(); TopicRegistrationResponse topics = new TopicRegistrationResponse(); @@ -323,7 +302,7 @@ public class DistributionClientTest { IDistributionClientResult initResponse = client.init(testConfiguration, new TestNotificationCallback()); assertEquals(DistributionActionResultEnum.SUCCESS, initResponse.getDistributionActionResult()); - Mockito.verify(connector, Mockito.times(1)).getServerList(); + Mockito.verify(client, Mockito.times(1)).getUEBServerList(); Mockito.verify(cambriaMock, Mockito.times(1)).createApiKey(Mockito.anyString(), Mockito.anyString()); Mockito.verify(connector, Mockito.times(1)).registerAsdcTopics(Mockito.any(ApiCredential.class)); System.out.println(initResponse); @@ -352,7 +331,7 @@ public class DistributionClientTest { // connectorMock IDistributionClientResult getServersResult = new DistributionClientResultImpl(DistributionActionResultEnum.ASDC_SERVER_PROBLEM, "problem"); Either<List<String>, IDistributionClientResult> serversResult = Either.right(getServersResult); - Mockito.when(connector.getServerList()).thenReturn(serversResult); + doReturn(serversResult).when(client).getUEBServerList(); TopicRegistrationResponse topics = new TopicRegistrationResponse(); topics.setDistrNotificationTopicName("notificationTopic"); @@ -371,7 +350,7 @@ public class DistributionClientTest { IDistributionClientResult initResponse = client.init(testConfiguration, new TestNotificationCallback()); assertEquals(DistributionActionResultEnum.ASDC_SERVER_PROBLEM, initResponse.getDistributionActionResult()); - Mockito.verify(connector, Mockito.times(1)).getServerList(); + Mockito.verify(client, Mockito.times(1)).getUEBServerList(); Mockito.verify(cambriaMock, Mockito.times(0)).createApiKey(Mockito.anyString(), Mockito.anyString()); Mockito.verify(connector, Mockito.times(0)).registerAsdcTopics(Mockito.any(ApiCredential.class)); @@ -382,8 +361,6 @@ public class DistributionClientTest { public void initCreateKeysFailedTest() throws HttpException, CambriaApiException, IOException { // connectorMock - Either<List<String>, IDistributionClientResult> serversResult = Either.left(serverList); - Mockito.when(connector.getServerList()).thenReturn(serversResult); mockArtifactTypeList(); TopicRegistrationResponse topics = new TopicRegistrationResponse(); @@ -403,7 +380,7 @@ public class DistributionClientTest { IDistributionClientResult initResponse = client.init(testConfiguration, new TestNotificationCallback()); assertEquals(DistributionActionResultEnum.UEB_KEYS_CREATION_FAILED, initResponse.getDistributionActionResult()); - Mockito.verify(connector, Mockito.times(1)).getServerList(); + Mockito.verify(client, Mockito.times(1)).getUEBServerList(); Mockito.verify(cambriaMock, Mockito.times(1)).createApiKey(Mockito.anyString(), Mockito.anyString()); Mockito.verify(connector, Mockito.times(0)).registerAsdcTopics(Mockito.any(ApiCredential.class)); System.out.println(initResponse); @@ -413,8 +390,6 @@ public class DistributionClientTest { public void initRegistrationFailedTest() throws HttpException, CambriaApiException, IOException { // connectorMock - Either<List<String>, IDistributionClientResult> serversResult = Either.left(serverList); - Mockito.when(connector.getServerList()).thenReturn(serversResult); mockArtifactTypeList(); DistributionClientResultImpl failureResult = new DistributionClientResultImpl(DistributionActionResultEnum.BAD_REQUEST, "Bad Request"); Either<TopicRegistrationResponse, DistributionClientResultImpl> topicsResult = Either.right(failureResult); @@ -430,7 +405,7 @@ public class DistributionClientTest { IDistributionClientResult initResponse = client.init(testConfiguration, new TestNotificationCallback()); assertEquals(DistributionActionResultEnum.BAD_REQUEST, initResponse.getDistributionActionResult()); - Mockito.verify(connector, Mockito.times(1)).getServerList(); + Mockito.verify(client, Mockito.times(1)).getUEBServerList(); Mockito.verify(cambriaMock, Mockito.times(1)).createApiKey(Mockito.anyString(), Mockito.anyString()); Mockito.verify(connector, Mockito.times(1)).registerAsdcTopics(Mockito.any(ApiCredential.class)); System.out.println(initResponse); @@ -450,7 +425,7 @@ public class DistributionClientTest { } // ########### TESTS TO ADD TO CI START ########### - public void createKeysTestCI() throws MalformedURLException, GeneralSecurityException { + /*public void createKeysTestCI() throws MalformedURLException, GeneralSecurityException { validateConfigurationTest(); CambriaIdentityManager trueCambria = new CambriaClientBuilders.IdentityManagerBuilder().usingHttps().usingHosts(serverList).build(); client.cambriaIdentityManager = trueCambria; @@ -462,7 +437,7 @@ public class DistributionClientTest { System.out.println(keysResult); System.out.println("keys: public=" + client.credential.getApiKey() + " | secret=" + client.credential.getApiSecret()); } - +*/ public void initTestCI() { IDistributionClient distributionClient = DistributionClientFactory.createDistributionClient(); IDistributionClientResult init = distributionClient.init(testConfiguration, new TestNotificationCallback()); @@ -507,59 +482,9 @@ public class DistributionClientTest { } - // @Test - public void registerProducerCI() { - - try { - CambriaTopicManager topicManager = new CambriaClientBuilders.TopicManagerBuilder().usingHttps().usingHosts(serverList).authenticatedBy("sSJc5qiBnKy2qrlc", "4ZRPzNJfEUK0sSNBvccd2m7X").build(); - topicManager.allowProducer("ASDC-DISTR-STATUS-TOPIC-TESTER", "1FSVAA3bRjhSKNAI"); - } catch (HttpException | IOException | GeneralSecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - // publish - // StringBuilder sb = new StringBuilder(); - // for (String s : serverList) - // { - // sb.append(s); - // sb.append(","); - // } - // CambriaBatchingPublisher pub = CambriaClientFactory.createSimplePublisher(sb.toString(), "ASDC-DISTR-STATUS-TOPIC-TESTER"); - // pub.setApiCredentials("yPMwjhmOgHUyJEeW", "3RYpgvBsjpA8Y2CHdA1PM8xK" ); - // - // - // try { - // pub.send("MyPartitionKey", "{\"artifactURL\":\"artifactURL_Val\", \"consumerID\" : \"123\", \"distributionID\" : \"AAA\", \"status\" : \"DOWNLOAD_OK\", \"timestamp\" : 1000}"); - // } catch (IOException e) { - // e.printStackTrace(); - // } - // - // finally{ - // - // - // try { - // List<message> stuck = pub.close(15L, TimeUnit.SECONDS); - // assertTrue(stuck.isEmpty()); - // } catch (IOException | InterruptedException e) { - // // TODO Auto-generated catch block - // e.printStackTrace(); - // } - // } - - } - - public void connectorGetServersTestCI() { - AsdcConnectorClient connector = new AsdcConnectorClient(); - connector.init(testConfiguration); - - Either<List<String>, IDistributionClientResult> serverListFromAsdc = connector.getServerList(); - assertTrue(serverListFromAsdc.isLeft()); - assertEquals(serverList, serverListFromAsdc.left().value()); - } public void connectorRegisterCI() { - AsdcConnectorClient connector = new AsdcConnectorClient(); + SdcConnectorClient connector = new SdcConnectorClient(); connector.init(testConfiguration); ApiCredential creds = new ApiCredential("publicKey", "secretKey"); @@ -569,7 +494,7 @@ public class DistributionClientTest { } public void downloadArtifactTestCI() { - AsdcConnectorClient connector = new AsdcConnectorClient(); + SdcConnectorClient connector = new SdcConnectorClient(); connector.init(testConfiguration); IArtifactInfo artifactInfo = initArtifactInfo(); connector.dowloadArtifact(artifactInfo); diff --git a/sdc-distribution-client/src/test/java/org/openecomp/sdc/utils/TestConfiguration.java b/sdc-distribution-client/src/test/java/org/openecomp/sdc/utils/TestConfiguration.java index 727f9a6..22814f4 100644 --- a/sdc-distribution-client/src/test/java/org/openecomp/sdc/utils/TestConfiguration.java +++ b/sdc-distribution-client/src/test/java/org/openecomp/sdc/utils/TestConfiguration.java @@ -24,8 +24,6 @@ import java.util.ArrayList; import java.util.List; import org.openecomp.sdc.api.consumer.IConfiguration; -import org.openecomp.sdc.utils.ArtifactTypeEnum; -import org.openecomp.sdc.utils.DistributionClientConstants; public class TestConfiguration implements IConfiguration { @@ -43,6 +41,7 @@ public class TestConfiguration implements IConfiguration { private boolean activateServerTLSAuth; private boolean isFilterInEmptyResources; private boolean useHttpsWithDmaap; + private List<String> msgBusAddress; public TestConfiguration(IConfiguration other) { this.asdcAddress = other.getAsdcAddress(); @@ -75,6 +74,10 @@ public class TestConfiguration implements IConfiguration { this.keyStorePassword = "Aa123456"; this.activateServerTLSAuth = false; this.isFilterInEmptyResources = false; + msgBusAddress = new ArrayList<String>(); + msgBusAddress.add("www.cnn.com"); + msgBusAddress.add("www.cnn.com"); + msgBusAddress.add("www.cnn.com"); } @Override @@ -83,6 +86,11 @@ public class TestConfiguration implements IConfiguration { } @Override + public List<String> getMsgBusAddress() { + return msgBusAddress; + } + + @Override public String getUser() { return user; } |