From 3ffd59f93ee349f42812cb38184d9186cbbc5d7c Mon Sep 17 00:00:00 2001 From: Shaohua Wen Date: Tue, 17 Mar 2020 22:32:37 +0800 Subject: [PATCH 01/47] fix test spec --- specs/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/build.gradle b/specs/build.gradle index 503df724..7c780eb0 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -26,7 +26,7 @@ repositories { dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.5:indy' - compile 'org.spockframework:spock-core:1.1-groovy-2.4-SNAPSHOT' + compile 'org.spockframework:spock-core:1.1-groovy-2.4' compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0-SNAPSHOT' compile 'com.jayway.restassured:rest-assured:2.4.0' From 7b78cd58425516d9566f6373fb550af0578eb4c3 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 23 Apr 2020 18:05:11 +0300 Subject: [PATCH 02/47] Increase minor version and regenerate help --- build.gradle | 2 +- help/changelog.yaml | 6 +- help/metadata.yaml | 4 +- pages/EC-WebSphere_help.xml | 3445 +++++++++++++++++++++++------------ 4 files changed, 2280 insertions(+), 1177 deletions(-) diff --git a/build.gradle b/build.gradle index ed6619c4..c914116f 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { group = 'com.electriccloud' description = 'Plugins : EC-WebSphere' -version = '2.7.0' +version = '2.8.0' apply plugin: 'flow-gradle-plugin' apply plugin: 'license' diff --git a/help/changelog.yaml b/help/changelog.yaml index 8a22f6bf..525800e7 100644 --- a/help/changelog.yaml +++ b/help/changelog.yaml @@ -1,3 +1,7 @@ +2.8.0: + - Add checking connection while creating a configuration. + - Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved. + - Add logging while running "CreateConfiguration". 2.7.0: - Preserve time limit settings after upgrade. 2.6.3: @@ -5,7 +9,7 @@ 2.6.2: - Configurations can be created by users with "@" sign in a name. 2.6.1: - - The plugin icon has been updated.< + - The plugin icon has been updated. 2.6.0: - | Following new procedures have been added to support management of clusters: diff --git a/help/metadata.yaml b/help/metadata.yaml index 0f754846..01d62dcb 100644 --- a/help/metadata.yaml +++ b/help/metadata.yaml @@ -7,7 +7,6 @@ proceduresGrouping: description: These procedures for WAS component management procedures: - CreateEndToEndMailProvider - - CreateEJBContainer - CreateMailSession - PublishWSDL - name: WAS Server Management Procedures @@ -24,7 +23,7 @@ proceduresGrouping: - ListClusterMembers - RemoveClusterMembers - SyncNodes - - ConfigureEJBContainer + - ConfigEJBContainer - CreateFirstClusterMember - CreateClusterMembers - name: WAS Server Administration Procedures @@ -79,7 +78,6 @@ proceduresGrouping: procedures: - DeployApp - DeployEnterpriseApp - - DeployOSGIApp - UndeployApp - UpdateApp - name: Check Procedures diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 8058274e..195bde05 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -13,23 +13,28 @@

@PLUGIN_KEY@

Plugin version @PLUGIN_VERSION@

- -

Revised on July 5, 2019

- + +

Revised on April 23, 2020

+

Contents

-

Overview

+ + +

Overview

WebSphere Application Server (WAS) is a software product that performs the role of a web application server. More specifically, it is a software framework and middleware that hosts Java based web applications. It is the flagship product within IBM's WebSphere software suite. @@ -99,16 +112,19 @@ Beginning Release 2.4 we do not certify this plugin on the 7.0 version of WAS co Please refer to this IBM Link

- - - + + + + + + - +
-

Plugin Configurations

+

Plugin Configurations

Plugin configurations are sets of parameters that apply @@ -128,8 +144,8 @@ Please refer to this
Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. @@ -137,7 +153,7 @@ They reduce repetition of common values, create predefined parameter sets for en and securely store credentials where needed. Each configuration is given a unique name that is entered in designated parameters on procedures that use them.

- + Configuration Parameters @@ -147,63 +163,79 @@ Each configuration is given a unique name that is entered in designated paramete - + - - + + + + - + - - + + + + - + - - + + + + - + - - + + + + - + - - + + + + - + - - + + + + - + - - + + + + - +
Configuration NameIdentifier of the configuration to create. i.e: myconfigConfiguration NameIdentifier of the configuration to create. i.e: myconfig
WSAdmin Absolute PathAbsolute path to wsadmin script.WSAdmin Absolute PathAbsolute path to wsadmin script.
Connection TypeSpecifies type of connection to use to connect to the application server that you want to administer.Connection TypeSpecifies type of connection to use to connect to the application server that you want to administer.
WebSphere HostHostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer.WebSphere HostHostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer.
WebSphere Connector PortPort of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server.WebSphere Connector PortPort of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server.
Login asCredentials used to connect to WebSphere instance.Login asCredentials used to connect to WebSphere instance.
Debug LevelDebug level.Debug LevelDebug level.
- +
+ +

Plugin Procedures

+ + - - - +

CreateEndToEndMailProvider

- - + +

Creates a mail provider along with protocol provider and mail session.

- - + +

This procedure creates mail provider with a protocol provider, a mail session and a custom property in the specified scope.

- +

CreateEndToEndMailProvider Parameters

@@ -213,130 +245,181 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Scope Specifies the scope in which the mail provider supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster'
Mail Provider Name Specifies the name to be given to the new mail provider .
Mail Provider Description Specifies the mail provider description.
Isolate this mail provider? Specifies that this mail provider will be loaded in its own class loader. This allows the application server to load different versions or implementations of the same mail provider in the same Java Virtual Machine. Give each version or implementation of the mail provider a unique class path in following (Mail provider classpath) field that is appropriate for that version or implementation.
Mail Provider Classpath Specifies the class path to a Java archive (JAR) file that contains the implementation classes for this mail provider.
Custom Property Name Specifies the name of custom property to create.
Custom Property Value Specifies the value to associate with this custom property of the resource.
Protocol Provider Name Specifies the name to be given to the new protocol provider .
Protocol Provider Class Name Specifies the implementation class of this protocol provider.
Protocol Provider Type Specifies the type of protocol provider. Valid options are STORE(for incoming protocol provider) or TRANSPORT(for outgoing protocol provider).
Mail Session Name Specifies the administrative name of the JavaMail session object.
Mail Session JNDI Name Specifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts.
Category Optional string to use while classifying or grouping the resources.
Enable Debug Mode? Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file.
Mail Session Description Specifies optional description for mail session.
Incoming Mail Server Specifies the host name server that is accessed when receiving mail.
Incoming Mail Server Port Specifies the port of the server that is accessed when receiving mail.
Incoming Mail Server Credentials Specifies the credential for the mail account when the incoming mail server requires authentication.
Outgoing Mail Server Specifies the host name of server that is accessed when sending mail.
Outgoing Mail Server Port Specifies the port of the server that is accessed when sending mail.
Outgoing Mail Server Credential Specifies the user of the mail account when the outgoing mail server requires authentication.
Enable Strict Internet Address Parsing? Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822.
+ + +

CreateEndToEndMailProvider

To create a new mail provider along with protocol provider and mail session, do these steps:

@@ -354,20 +437,20 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

CreateMailSession

- - + +

Creates a new JavaMail session using the wsadmin tool.

- - + +

This procedure creates a JavaMail session object for default mail provider at specified scope.

- +

CreateMailSession Parameters

@@ -377,100 +460,139 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Scope Specifies the scope in which the mail session supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster'
Mail Session Name Specifies the administrative name of the JavaMail session object.
Mail Session Description Specifies optional description for mail session.
Mail Session JNDI Name Specifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts.
Category Optional string to use while classifying or grouping the resources.
Enable Debug Mode? Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file.
Outgoing Mail Server Specifies the host name of server that is accessed when sending mail.
Outgoing Mail Server Port Specifies the port of the server that is accessed when sending mail.
Outgoing Mail Server Protocol Specifies the protocol to use when sending mail.
Outgoing Mail Server Credential Specifies the user of the mail account when the outgoing mail server requires authentication.
Return E-mail Address Represents the Internet email address that, by default, displays in the received message in the From or the Reply-To address. The recipient's reply will come to this address.
Incoming Mail Server Specifies the host name server that is accessed when receiving mail.
Incoming Mail Server Port Specifies the port of the server that is accessed when receiving mail.
Incoming Mail Server Protocol Specifies the protocol to use when receiving mail.
Incoming Mail Server Credentials Specifies the credential for the mail account when the incoming mail server requires authentication.
Enable Strict Internet Address Parsing? Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822.
+ + +

Create Mail Session

To create a mail session for default mail provider, do these steps:

@@ -488,20 +610,20 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

PublishWSDL

- - + +

Publishes WSDL files in each web services-enabled module to the file system location

- - + +

This procedure publishes WSDL files in each web services-enabled module to the file system location.

- +

PublishWSDL Parameters

@@ -511,55 +633,76 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the application of which to publish the WSDL file. i.e: 'webapp'.
Location to publish WSDL file Filename and absolute path on the filesystem where published WSDL files should get stored.For example, 'C:/webservices/sampleWSDL.zip'
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
SOAP address prefixes Give SOAP address prefix in format "{{module {{binding partial-url}}}}" to customize the WSDL SOAP address for each module.. i.e: '{ {AddressBookJ2WB.war {{http http://localhost:9080}}} {StockQuote.jar {{http https://localhost:9443}}} }'.
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Publish WSDL

To publish WSDL files, do these steps:

@@ -569,22 +712,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

CreateApplicationServer

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure creates an Application Server identical to an existing Application Server or an Application Server definition which is part of a template. In addition it will synchronize nodes if checked.

- - + +

CreateApplicationServer Parameters

@@ -594,31 +737,40 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Node Name Name of the node where application server is to be created.
Server Name Name of application server to be created.
Generate Unique Ports? By default ports generated during server creation will be created uniquely. If not checked ports in template will be used as is for server creation.
Source Type Type of source which should be used for server creation. Select Template or Application Server. @@ -626,41 +778,53 @@ Each configuration is given a unique name that is entered in designated paramete template will be created from existing application server and new server will be created from this template then. After successful creation template will be deleted.
Source Template Name This parameter is applicable only when the source is a Template. Name of server template to be the source for a new server.
Source Template Location The configuration Id that represents the location of a template. This parameter is applicable only when the source is a Template.
Source Server Name Name of application server to be the source for a new server in format nodename:servername.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Create Application Server

To Create Application Server in Flow interface, do these steps:

@@ -679,22 +843,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

DeleteApplicationServer

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure deletes an existing Application Server. In addition it will synchronize nodes if checked.

- - + +

DeleteApplicationServer Parameters

@@ -704,32 +868,43 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Node Name Name of the node where application server to be deleted.
Server Name Name of application server to be deleted.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Delete Application Server

To Delete Application Server in Flow interface, do these steps:

@@ -748,22 +923,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

CreateApplicationServerTemplate

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure creates a template of an existing Application Server.

- - + +

CreateApplicationServerTemplate Parameters

@@ -773,49 +948,66 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Node Name Name of the node where application server is located.
Application Server Name Name of the application server the template will be based out of.
Template Name Application server template name to be created.
Template Location Specifies a configuration Id that represents the location to place the template.
Template Description Description of application server template.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Create Application Server Template

To Create Application Server Template in Flow interface, do these steps:

@@ -834,22 +1026,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

DeleteApplicationServerTemplate

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure deletes an existing Application Server Template.

- - + +

DeleteApplicationServerTemplate Parameters

@@ -859,27 +1051,36 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Template Name Application server template name to be deleted.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Delete Application Server Template

To Delete Application Server Template in Flow interface, do these steps:

@@ -898,25 +1099,25 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

CreateCluster

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Creates a new Application Server cluster.

- - + +

This procedure creates a cluster, adds members to it, and can deploy an application in it using a Jython script.

- +

CreateCluster Parameters

@@ -926,29 +1127,38 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of the new cluster.
Prefer Local? Specifies whether enterprise bean requests are routed to the node on which the client resides whenever such a routing is possible.
Create First Cluster Member? If not checked, empty cluster will be created
First Cluster Member Creation Policy Controls how 1st cluster member is to be created @@ -956,46 +1166,60 @@ Each configuration is given a unique name that is entered in designated paramete Convert - convert existing server to 1st cluster member Template - use app server template to create 1st cluster member
Source Template Name Name of server template to be the source for first cluster member.
Source Server Name Name of application server to be the source for a new server in format nodename:servername.
First Cluster Member Node Node name where first cluster member will be created.
First Cluster Member Name Name of the server that will be created as a first cluster member.
First Cluster Member Weight Weight of first cluster member.
Generate Unique Ports for First Cluster Member? By default ports generated during for first cluster member creation will be created uniquely. If not checked ports in template will be used as is for server creation.
Server Resources Promotion Policy Specifies how resources such as data sources are initially created in the cluster. @@ -1004,45 +1228,59 @@ Each configuration is given a unique name that is entered in designated paramete Creating settings at the cluster scope reduces the amount of configuration that you maintain. Default is Cluster.
Add Cluster Members? If checked, additional cluster members will be added right after cluster creation.
Gen Unique Ports for Cluster Members? By default ports generated during cluster members creation will be created uniquely. If not checked ports in template will be used as is for server creation.
Weight of Each Cluster Member Weight of each cluster member from list.
Cluster Members List List of cluster members to be created in format NodeName:server1, NodeName2:server2.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Create Cluster

To Create Cluster in Flow interface, do these steps:

@@ -1061,25 +1299,25 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

DeleteCluster

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Deletes an existing cluster using the wsadmin tool

- - + +

This procedure delete the specified cluster.

- +

DeleteCluster Parameters

@@ -1089,27 +1327,36 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name The name of the cluster to delete.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Delete Cluster

To Delete Cluster in Flow interface, do these steps:

@@ -1128,22 +1375,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

ExportApplicationServer

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure exports the definition of an Application Server in an environment to an archive (with extension .car) in the filesystem, that can in turn be used import into another environment and create an identical server.

- - + +

ExportApplicationServer Parameters

@@ -1153,30 +1400,41 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Node Name Name of application server node.
Application Server Name Name of the application server to be exported.
Archive Specifies the fully qualified path of the exported configuration archive.
+ + +

Export Application Server

To Export Application Server in Flow interface, do these steps:

@@ -1195,22 +1453,22 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

ImportApplicationServer

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure imports an Application Server from an Archive and creates an identical server in the environment the Archive is imported into.

- - + +

ImportApplicationServer Parameters

@@ -1220,60 +1478,79 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Node Name Name of the Node in which the Application Server is to be Imported.
Application Server Name Name of the Application Server to be created based on the server in the Imported Archive.
Archive Specifies the fully qualified path of the configuration archive.
Node Name in Archive Specifies the node name of the server defined in the configuration archive. Not required if there is only one Node in the Archive to be imported. If there are multiple nodes in the Archive, mention the node name of the Server to be imported.
Server Name in Archive Specifies the name of the server defined in the configuration archive. Not required if there is only one Server in the Archive to be imported. If there are multiple servers in the Archive, mention the name of the Server to be imported.
Core Group Specifies the core group name to which the server should belong.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Import Application Server

To Import Application Server in Flow interface, do these steps:

@@ -1292,25 +1569,25 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

ListClusterMembers

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Lists all the members of cluster using wsadmin tool.

- - + +

This procedure lists down all the members (application servers) of the cluster using a Jython script.

- +

ListClusterMembers Parameters

@@ -1320,25 +1597,34 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of the cluster of which members to list down.
Output Property Path Property where cluster members list is to be stored.
+ + +

List Cluster Members

To List Cluster Members in Flow interface, do these steps:

@@ -1357,25 +1643,25 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

RemoveClusterMembers

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Removes list of application servers from existing cluster

- - + +

This procedure removes specified application servers from the cluster using a Jython script.

- +

RemoveClusterMembers Parameters

@@ -1385,35 +1671,46 @@ Each configuration is given a unique name that is entered in designated paramete - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of cluster from which to remove/delete the members.
List of Cluster Members List of cluster members in the form Node01:server1, Node02:server2 to remove/delete from cluster. Important note: server will be not only removed from cluster, but also deleted.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Remove Cluster Members

To Remove Cluster Members in Flow interface, do these steps:

@@ -1432,28 +1729,28 @@ Each configuration is given a unique name that is entered in designated paramete

- +
- +

SyncNodes

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Synchronizes active nodes.

- - + +

Synchronizes Cell's Deployment Manager config repository with nodes of the cell. By default, WebSphere nodes are configured for auto-sync. This procedure should be used for manual nodes synchronization. For example: New custom property for node was added, and configuration was saved. Next, to make it available on each server it should be propagated to all servers of the node by nodes synchronization.

- +

SyncNodes Parameters

@@ -1463,35 +1760,173 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
+ + +
+ +
+

ConfigEJBContainer

+ + +

Configures EJB container using the wsadmin tool

+ + +

This procedure configures EJB container properites using a Jython script.

+ + +

ConfigEJBContainer Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Cell NameName of cell to which EJB container belongs to.
Node NameName of node to which EJB container belongs to.
Server NameName of application server to which EJB container belongs to.
Passivation DirectorySpecifies the directory into which the container saves the persistent state of passivated stateful session beans. This directory must already exist. It is not automatically created.Default is ${USER_INSTALL_ROOT}/temp.
Cache SizeNumber of buckets in the active instance list within the EJB container.Input value range - greater than 0. The container selects the next largest prime number equal to or greater than the specified value.Default is 2053
Cleanup IntervalInterval (in milliseconds)at which the container attempts to remove unused items from the cache.Default is 3000. Allowed range is 0 to 2147483647
Inactive Pool Cleanup IntervalSpecifies the interval at which the container examines the pools of available bean instances to determine if some instances can be deleted to reduce memory usage.
Enable stateful session bean fail over using memory-to-memory replication?Specifies that failover is enabled for all stateful session beans installed in this EJB container.Replication domains must already exist to failover feature to work.
Replication domainSpecifies the replication domain in which HTTP sessions are replicated.
Replication ModeThe mode specifies whether data is only sent (client), only received (server), or both. Select client if sessions need to be replicated. Select server if sessions need to be stored. Select both client and server if sessions need to be replicated and stored. The default is both.
+ + + + +

+

Configure EJB Container

+

To Configure EJB Container, do these steps:

+
    +
  1. Go to the ConfigEJBContainer procedure.
  2. +
  3. Enter the following parameters:
  4. +
+

After the job runs, you can view the results, including the following job details, which show that + EJB container is configured successfully:

+ +

In the ConfigEJBContainer step, click the Log icon + to see the diagnostic information. The output is similar to + the following diagnostic + report.

+ + +

+ +
+

CreateFirstClusterMember

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Creates the First Cluster Member of an existing cluster.

- - + +

CreateFirstClusterMember Parameters

@@ -1501,47 +1936,60 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of the new cluster.
First Cluster Member Name Server Name of first cluster member.
First Cluster Member Node Node Name of first cluster member.
First Cluster Member Weight Weight of first cluster member.
Generate Unique Ports for First Cluster Member? By default the port generated for first cluster member will be created uniquely. If this option is not checked, ports in template will be used as is.
Server Resources Promotion Policy Specifies how resources such as data sources are initially created in the cluster. @@ -1550,41 +1998,53 @@ Next, to make it available on each server it should be propagated to all servers Creating settings at the cluster scope reduces the amount of configuration that you maintain. Default is Cluster.
First Cluster Member Creation Policy Controls how first cluster member is created. The values mean the following. Existing - Use existing server Template - Use app server template to create first cluster member
Source Template Name Name of server template to be the source for first cluster member.
Source Server Name Name of application server to be the source for a new server in format nodename:servername.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Create First Cluster Member

To Create First Cluster Member in Flow interface, do these steps:

@@ -1603,22 +2063,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

CreateClusterMembers

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Creates members under an existing cluster.

- - + +

CreateClusterMembers Parameters

@@ -1628,42 +2088,57 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name A name of the cluster where servers is to be created.
Gen Unique Ports? Generate unique ports number if checked.
Cluster Member Weight Weight of each cluster member
List of Cluster Members List of cluster members.
Sync Nodes? The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured.
+ + +

Create Cluster Members

To Create Cluster Members in Flow interface, do these steps:

@@ -1682,22 +2157,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartApplicationServers

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure starts one or more Application Servers that can be spread across nodes.

- - + +

StartApplicationServers Parameters

@@ -1707,28 +2182,37 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Server List - List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, + List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to start all servers within Node4.
Wait time Not Required. Time to wait until all servers are started. If not specified wait time will be treated as 0.
+ + +

Start Application Servers

To Start Application Servers in Flow interface, do these steps:

@@ -1747,22 +2231,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StopApplicationServers

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure stops one or more Application Servers that can be spread across nodes.

- - + +

StopApplicationServers Parameters

@@ -1772,28 +2256,37 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Server List - List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, + List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to stop all servers within Node4.
Wait time Not Required. Time to wait until all servers are stopped. If not specified wait time will be treated as 0.
+ + +

Stop Application Servers

To Stop Application Servers in Flow interface, do these steps:

@@ -1812,25 +2305,25 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartCluster

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Starts cluster using wsadmin tool.

- - + +

This procedure starts a cluster.

- +

StartCluster Parameters

@@ -1840,27 +2333,36 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of the cluster to be started.
Timeout Specifies the waiting time before cluster start times out and returns an error.
+ + +

Start Cluster

To Start Cluster in Flow interface, do these steps:

@@ -1879,25 +2381,25 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StopCluster

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Stops cluster using wsadmin tool.

- - + +

This procedure stops a cluster.

- +

StopCluster Parameters

@@ -1907,32 +2409,43 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Cluster Name Name of the cluster to be stopped.
Timeout Specifies the waiting time before cluster stop times out and returns an error.
Perform Ripple Start? If checked, all servers within cluster will be stopped one-by-one and then started.
+ + +

Stop Cluster

To Stop Cluster in Flow interface, do these steps:

@@ -1951,22 +2464,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartDeploymentManager

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure starts the Deployment Manager in a WAS network deployment.

- - + +

StartDeploymentManager Parameters

@@ -1976,45 +2489,60 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
StartManager Location Absolute Physical path in Filesystem to location of startManager script i.e., /path/to/startManager.sh or startManager.bat
Deployment Manager Profile Profile name of the DeploymentManager which needs to be started. If this is not provided StartManager will start the DeploymentManager which has the default profile.
Log File Location Absolute Physical path in Filesystem to location of startManager.sh logs i.e., /path/to/startServer.log
Timeout Specifies the waiting time before deployment manager start times out and returns an error.
Additional Parameters This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help.
+ + +

Start Deployment Manager

To Start Deployment Manager in Flow interface, do these steps:

@@ -2033,22 +2561,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StopDeploymentManager

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Stops Deployment Manager

- - + +

StopDeploymentManager Parameters

@@ -2058,45 +2586,60 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
StopManager Location Absolute Physical path in Filesystem to location of stopManager script i.e., /path/to/stopManager.sh or stopManager.bat
Deployment Manager Profile Profile name of the DeploymentManager which needs to be stopped. If this is not provided StopManager will stop the DeploymentManager which has the default profile.
Log File Location Absolute Physical path in Filesystem to location of stopManager.sh logs i.e., /path/to/stopServer.log
Timeout Specifies the waiting time before deployment manager stop times out and returns an error.
Additional Parameters This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help.
+ + +

Stop Deployment Manager

To Stop Deployment Manager in Flow interface, do these steps:

@@ -2115,22 +2658,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartNode

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure starts a WAS node and optionally starts all Application Servers in that Node.

- - + +

StartNode Parameters

@@ -2140,55 +2683,74 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
StartNode Location Absolute Physical path in Filesystem to location of startNode script i.e., /path/to/startNode.sh or startNode.bat
Node Profile Profile name of the Node which needs to be started. If this is not provided StartNode will start the Node which has the default profile.
Log File Location Absolute Physical path in Filesystem to location of startNode.sh logs i.e., /path/to/startServer.log
Timeout Specifies the waiting time before node start times out and returns an error.
Start all Application Servers? Start all application servers within node after nodeagent is started.
Node Name to start Servers Name of the node where application servers needs to be started.
Additional Parameters This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help.
+ + +

Start Node

To Start Node in Flow interface, do these steps:

@@ -2207,22 +2769,22 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StopNode

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

This procedure stops a WAS node and stops the Application Servers in that Node based on the Stop Node policy.

- - + +

StopNode Parameters

@@ -2232,50 +2794,67 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
StopNode Location Absolute Physical path in Filesystem to location of stopNode script i.e., /path/to/stopNode.sh or stopNode.bat
Node Profile Profile name of the Node which needs to be stopped. If this is not provided StopNode will stop the Node which has the default profile.
Log File Location Absolute Physical path in Filesystem to location of stopNode.sh logs i.e., /path/to/stopServer.log
Timeout Specifies the waiting time before node stop times out and returns an error.
Node Stop Policy Policy that will be used for node stopping. It could be one of: Just Stop node agent, stop Spplication Servers, Save Node State.
Additional Parameters This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help.
+ + +

Stop Node

To Stop Node in Flow interface, do these steps:

@@ -2294,20 +2873,20 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartServer

- - + +

Starts a WebSphere instance

- - + +

This procedure starts a WebSphere instance or an application server using startServer.sh.

- +

StartServer Parameters

@@ -2317,38 +2896,47 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
StartServer Absolute Path Absolute path of the start server script, including filename and extension. i.e: 'startServer.bat' or '/path/to/startServer.sh' or 'C:\Program Files\IBM\WebSphere\AppServer\bin\startServer.bat'.
Instance name The name of the instance of the server to be started. i.e: 'server01'.
Additional Commands Additional commands to be entered for the startup of the server.
-
+ + +
+

StopServer

- - + +

Stops a WebSphere instance

- - + +

This procedure stops a WebSphere instance or an application server using stopServer.sh

- +

StopServer Parameters

@@ -2358,43 +2946,54 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Script Location Absolute path of the stop server script, including filename and extension. i.e: 'C:/Program Files/IBM/WebSphere/AppServer/bin/stopServer.bat', 'stopServer.bat', '/path/to/stopServer.sh'
Instance Name Server instance name of the server to be stopped. i.e: 'server01'.
Additional Commands Additional commands to be entered for stop the server.
-
+ + + +

RunCustomJob

- - + +

Runs a task using wsadmin

- - + +

This procedure runs a task using wsadmin and the Jython code files.

- +

RunCustomJob Parameters

@@ -2404,74 +3003,95 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
Script File Absolute Path Path of a Jython script that will be run using wsadmin. i.e: '/path/to/scriptFile.jython' or 'c:/dir/scriptFile.jython'.
Script File Source Indicates either if a script file route or an embedded script file will be provided.
Script File Content of the script file to run if Embedded File is chosen in the Script File Source.
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Running Custom Jobs

For a complete example, go to the Examples and Use Cases section.

- +
- +

ConfigureSession

- - + +

Configures the session management properties for the deployed application.

- - + +

This procedure configures the session management related properties for deployed application. For more information on each of the parameter, please refer to the WebSphere Knowledge Center Page.

- +

ConfigureSession Parameters

@@ -2481,80 +3101,111 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. /path/to/wsadmin.sh or wsadmin.bat.
Application Name Name of the web application to configure.
Enable SSL Tracking Specifies that session tracking uses Secure Sockets Layer (SSL) information as a session ID. Enabling SSL tracking takes precedence over cookie-based session tracking and URL rewriting.
Enable Cookies Specifies whether to enable cookies.
Enable URL Rewriting Specifies whether the session management facility uses rewritten URLs to carry the session IDs. If URL rewriting is enabled, the session management facility recognizes session IDs that arrive in the URL if the encodeURL method is called in the servlet.
Enable Protocol Switching This option is only applicable when Enable URL rewriting is selected. This option specifies that the session ID is added to a URL when the URL requires a switch from HTTP to HTTPS or from HTTPS to HTTP. If rewriting is enabled, the session ID is required to go between HTTP and HTTPS.
Max in-memory session count Specifies the maximum number of sessions to maintain in memory.
Allow Overflow Specifies whether the number of sessions in memory can exceed the value specified by the Max in-memory session count property. This option is valid only in non-distributed sessions mode..
Enable Serialized Session If selected, concurrent session access in a given server is not permitted.
Maximum Wait Time Specifies the maximum amount of time in seconds a servlet request waits on an HTTP session before continuing execution. The default is 5 seconds. Under normal conditions, a servlet request waiting for access to an HTTP session gets notified by the request that currently owns the given HTTP session when the request finishes.
Access Session On Timeout Specifies whether the servlet is started normally or aborted in the event of a timeout. If you specify true, the servlet is started normally. If you specify false, the servlet execution aborts and error logs are generated.
Invalid Timeout Specifies how long(in minutes) a session can go unused before it is no longer valid.
Session Persistence Mode Specifies whether to enable session persistence mode.
+ + +

Configure Session Management for application

To Configure Session Management for application, do these steps:

@@ -2572,20 +3223,20 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

MapSharedLibrary

- - + +

Maps shared library.

- - + +

This procedure maps shared library to already deployed application.

- +

MapSharedLibrary Parameters

@@ -2595,30 +3246,41 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Library Name Shared Library Name.
Application Name Name of application to which shared library will be mapped.
+ + +

Map Shared Library to Application

To map shared library to application, do these steps:

@@ -2635,20 +3297,20 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

ModifyApplicationClassLoader

- - + +

Modify Application ClassLoader.

- - + +

This procedure modifies ClassLoader of the deployed Application.

- +

ModifyApplicationClassLoader Parameters

@@ -2658,35 +3320,48 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Load Order The class-loader delegation mode, also known as the class loader order, determines whether a class loader delegates the loading of classes to the parent class loader.
ClassLoader Isolation Policy Application class loaders load EJB modules, dependency JAR files, embedded resource adapters, and application-scoped shared libraries. Depending on the application class-loader policy, an application class loader can be shared by multiple applications (Single) or unique for each application (Multiple). The application class-loader policy controls the isolation of applications that are running in the system. When set to Single, applications are not isolated. When set to Multiple, applications are isolated from each other.
Application Name Name of the existing web application, which ClassLoader should be modified.
+ + +

Modify Application's ClassLoader

To modify Application's ClassLoader do the following steps:

@@ -2703,20 +3378,20 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

StartApp

- - + +

Start an application using wsadmin

- - + +

This procedure starts an application using wsadmin. If the application is already running, a warning will be thrown.

- +

StartApp Parameters

@@ -2726,55 +3401,76 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the application to start. i.e: 'webapp'.
Cluster Name Name of the cluster on which application is deployed. Not required in WebSphere Base Edition.
Server Name Name of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition.
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Starting Applications

To start an application, do these steps:

@@ -2791,20 +3487,20 @@ Next, to make it available on each server it should be propagated to all servers report.

- +
- +

StopApp

- - + +

Stop an application using wsadmin

- - + +

This procedure stops an application using wsadmin. If the application is already stopped, a warning will be thrown.

- +

StopApp Parameters

@@ -2814,55 +3510,76 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the application to stop. i.e: 'webapp'.
Cluster Name Name of the cluster on which application is deployed. Not required in WebSphere Base Edition.
Server Name Name of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition.
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Stopping Applications

To stop an application, do these steps:

@@ -2879,20 +3596,20 @@ Next, to make it available on each server it should be propagated to all servers report.

- +
- +

CreateJDBCProvider

- - + +

Creates a JDBC Provider using the wsadmin tool

- - + +

This procedure creates a JDBC provider using a Jython script.

- +

CreateJDBCProvider Parameters

@@ -2902,60 +3619,83 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
JDBC Provider Name Name of the JDBC Provider.
JDBC Provider Description A description for the JDBC Provider.
Cell Scope Parent object where the JDBC Provider will be created. This determines the visibility scope of the JDBC Provider. When the Cell Scope is provided, if the node and server scopes are not provided, then the scope will be the 'cell'; if the node is provided and the server not, then the scope will be the 'node'; if the server is provided and the node not, then the scope will be the 'server'. At least the Cell, the Node or the Server scope must be provided. i.e: 'wsaspluginNode01Cell'.
Cluster Scope When the Cluster Scope is provided, then the scope will be the cluster. i.e: 'cluster1'.
Node Scope When the Node Scope is provided, if the cell and server scopes are not provided, then the scope will be the 'node'; if the cell is provided and the server not, then the scope will be the 'node'; if the server is provided and the cell not, then the scope will be the 'server'. i.e: 'wsaspluginNode01'.
Server Scope When the Server Scope is provided, then the scope will be the Node and the server always, even if the Node and the Cell Scopes are not provided. i.e: 'server1'.
Implementation Class Name Java class name of the JDBC provider implementation.
Driver Class Path A path for the resource provider classes.
+ + +

Creating a JDBC Providers

To create a JDBC provider, do these steps:

@@ -2974,20 +3714,20 @@ Next, to make it available on each server it should be propagated to all servers report.

- +
- +

DeleteJDBCProvider

- - + +

Deletes a JDBC Provider using the wsadmin tool

- - + +

This procedure deletes a JDBC provider using a Jython script.

- +

DeleteJDBCProvider Parameters

@@ -2997,25 +3737,34 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
JDBC Provider Name A unique name that identifies the JDBC Provider to delete in the WebSphere domain.
+ + +

Deleting JDBC Providers

To delete a JDBC provider, do these steps:

@@ -3033,20 +3782,20 @@ Next, to make it available on each server it should be propagated to all servers

- +
- +

CreateDatasource

- - + +

Creates a datasource using the wsadmin tool. The scope assigned to the datasource is provided by the JDBC Provider.

- - + +

The procedure creates a datasource by using a Jython script.

- +

CreateDatasource Parameters

@@ -3056,55 +3805,76 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
JDBC Provider Name of an existing JDBC Provider.
Datasource Name A unique name that identifies this Datasource in the WebSphere domain.
Datasource Description A description for the datasource.
JNDI Name The JNDI path to where this Datasource is bound.
Statement Cache Size Specifies the number of statements that can be cached per connection. The application server caches a statement after you close that statement.
Authentication Alias Name Provide the authentication data alias.
Datasource Helper Class Name Provide the datasource helper class name.
+ + +

To create a datasource, do the following steps:

    @@ -3122,20 +3892,20 @@ Next, to make it available on each server it should be propagated to all servers report.

    - +
- +

DeleteDatasource

- - + +

Deletes a datasource using the wsadmin tool

- - + +

This procedure deletes a datasource using a Jython script.

- +

DeleteDatasource Parameters

@@ -3145,25 +3915,34 @@ Next, to make it available on each server it should be propagated to all servers - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Datasource Name A unique name that identifies the datasource to delete in the WebSphere domain.
+ + +

Deleting Datasources

To delete a datasource, do these steps:

@@ -3181,20 +3960,20 @@ the following diagnostic report.

- +
- +

CreateJMSProvider

- - + +

Creates a JMS Provider using the wsadmin tool

- - + +

This procedure creates a new JMS provider using a Jython script.

- +

CreateJMSProvider Parameters

@@ -3204,75 +3983,104 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Scope Specifies a scope of cell, node, server, or cluster for the JMS provider. E.g. Cell=Cell01,Node=Node01,Server=server1
JMS Provider Name Specifies the name to assign to the new JMS provider.
Initial Context Factory Specifies the Java class name of the initial context factory for the JMS provider.
JMS provider URL Specifies the JMS provider URL for external JNDI lookups.
Classpath Specifies a list of paths or Java archive (JAR) file names which together form the location for the resource provider classes. Use a semicolon (;) to separate class paths.
Description Specifies a description of the JMS Provider.
Isolated Class Loader If set to true, specifies that the resource provider is loaded in its own class loader.
Native Path Specifies an optional path to any native libraries, such as *.dll and *.so. Native path entries are separated by a semicolon (;).
Provider Type Specifies the JMS provider type that this JMS provider uses.
Property Set Specifies resource properties in the following format: [[['name','nameValue1'],['type','typeValue1'],['value','valueValue1']]... [['name','nameValuen'],['type','typeValuen'],['value','valueValuen']]]
Supports ASF If set to true, specifies that the JMS provider supports Application Server Facilities (ASF), which provides concurrency and transactional support for applications.
+ + +

Create JMS Provider

To create a new JMS provider, do these steps:

@@ -3282,20 +4090,20 @@ report.

DeleteJMSProvider

- - + +

Deletes JMS Provider

- - + +

This procedure deletes an existing JMS Provider.

- +

DeleteJMSProvider Parameters

@@ -3305,25 +4113,34 @@ report.

Configuration Name + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
JMS Provider Scope Scope of the WebSphere messaging provider to be deleted.
JMS Provider Administartive Name The administrative name of JMS Provider to be deleted.
+ + +

Delete JMS Provider

To delete JMS Provider in Commander interface, do these steps:

@@ -3357,20 +4174,20 @@ report.

- +
- +

CreateOrUpdateJMSQueue

- - + +

Creates or updates JMS Queues

- - + +

This procedure creates a new JMS Queue or updates an existing JMS Queue.

- +

CreateOrUpdateJMSQueue Parameters

@@ -3380,58 +4197,79 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Queue Scope Scope of the messaging provider at which the JMS Queue is to be created.
Queue Administrative Name The administrative name assigned to this WebSphere MQ messaging provider queue.
Queue Name Name of the Queue.
JNDI Name The name used to bind this object into WebSphere Application Server JNDI.
Queue Manager Name Queue manager that hosts the queue.
Queue Administrative Description An administrative description assigned to queue.
Additional Options - This parameter can be used to either override defaults or pass Custom Properties. + This parameter can be used to either override defaults or pass Custom Properties. For example: -ccsid 1208 -readAhead YES
+ + +

Create or update JMS Queue

To create or update JMS Queue in Commander interface, do these steps:

@@ -3465,20 +4303,20 @@ report.

- +
- +

DeleteJMSQueue

- - + +

Deletes JMS Queues

- - + +

This procedure deletes an existing JMS Queue.

- +

DeleteJMSQueue Parameters

@@ -3488,30 +4326,41 @@ report.

Configuration Name + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Queue Scope Scope of the messaging provider at which the JMS Queue is to be deleted.
Queue Administrative Name The administrative name assigned to this WebSphere MQ messaging provider queue.
+ + +

Delete JMS Queue

To delete JMS Queue in Commander interface, do these steps:

@@ -3545,20 +4394,20 @@ report.

- +
- +

CreateOrUpdateJMSTopic

- - + +

Creates or updates JMS Topics

- - + +

This procedure creates a new JMS Topic or updates an existing JMS Topic.

- +

CreateOrUpdateJMSTopic Parameters

@@ -3568,53 +4417,72 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Topic Scope Scope of the messaging provider at which the JMS Topic is to be created.
Topic Administrative Name The administrative name assigned to this WebSphere MQ messaging provider Topic.
Topic Name Name of the Topic.
JNDI Name The name used to bind this object into WebSphere Application Server JNDI.
Topic Administrative Description An administrative description assigned to Topic.
Additional Options - This parameter can be used to either override defaults or pass Custom Properties. + This parameter can be used to either override defaults or pass Custom Properties. For example: -readAhead YES -ccsid 1208
+ + +

Create or update JMS Topic

To create or update JMS Topic in Commander interface, do these steps:

@@ -3648,20 +4516,20 @@ report.

- +
- +

DeleteJMSTopic

- - + +

Deletes JMS Topics

- - + +

This procedure deletes an existing JMS Topic.

- +

DeleteJMSTopic Parameters

@@ -3671,30 +4539,41 @@ report.

Configuration Name + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Topic Scope Scope of the messaging provider at which the JMS Topic is to be deleted.
Topic Administrative Name The administrative name assigned to this WebSphere MQ messaging provider topic.
+ + +

Delete JMS Topic

To delete JMS Topic in Commander interface, do these steps:

@@ -3728,20 +4607,20 @@ report.

- +
- +

CreateOrUpdateSIBJMSActivationSpec

- - + +

Creates or updates SIB JMS Activation Specs

- - + +

This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec.

- +

CreateOrUpdateSIBJMSActivationSpec Parameters

@@ -3751,43 +4630,58 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Scope of the Activation Spec Scope of the WebSphere Default messaging provider at which the Activation Spec is to be created.
Activation Spec Administrative Name The administrative name assigned to this Activation Spec.
JNDI Name The name and location used to bind this object into WebSphere Application Server JNDI.
Destination JNDI Name The JNDI name of the destination JMS queue or topic used by the message-driven bean.
Activation Spec Administrative Description An Administrative description assigned to Activation Spec.
Destination Type An option to determine whether the message_driven bean uses a JMS queue or a JMS topic.
Message Selector The JMS message selector used to determine which messages the message-driven bean receives. @@ -3798,16 +4692,22 @@ report.

- + - +

CreateOrUpdateWMQJMSActivationSpec

- - + +

Creates or updates WMQ JMS Activation Specs

- - + +

This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec.

- +

CreateOrUpdateWMQJMSActivationSpec Parameters

@@ -3864,62 +4764,85 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Scope of the Activation Spec Scope of the WebSphere MQ messaging provider at which the Activation Spec is to be created.
Activation Spec Administrative Name The administrative name assigned to this Activation Spec.
JNDI Name The name and location used to bind this object into WebSphere Application Server JNDI.
Destination JNDI Name The JNDI name of the destination JMS queue or topic used by the message-driven bean.
Destination JNDI Type The type of the destination specified by "Destination JNDI Name" parameter.
Activation Spec Administrative Description An Administrative Description assigned to Activation Spec.
Client Channel Definition URL A URL to a client channel definition table to use, for this Activation Spec, when contacting WebSphere MQ.
Client Channel Definition Queue Manager A queue manager name, used to select one or more entries from a client channel definition table.
Additional Options Used to either override defaults or pass Custom Properties.
+ + +

Create or update WMQ JMS Activation Spec

To create or update WMQ JMS Activation Spec in Commander interface, do these steps:

@@ -3953,20 +4876,20 @@ report.

- +
- +

DeleteJMSActivationSpec

- - + +

Deletes JMS Activation Specs

- - + +

This procedure deletes an existing JMS ActivationSpec.

- +

DeleteJMSActivationSpec Parameters

@@ -3976,30 +4899,41 @@ report.

Configuration Name + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Scope of the Activation Spec Scope of the messaging provider at which the JMS Activation Spec is to be deleted.
Activation Spec Administrative Name The administrative name assigned to this WebSphere MQ messaging provider Activation Spec.
+ + +

Delete JMS Activation Spec

To delete JMS Activation Spec in Commander interface, do these steps:

@@ -4037,20 +4971,20 @@ report.

- +
- +

CreateOrUpdateSIBJMSConnectionFactory

- - + +

Creates or updates SIB JMS Connection Factories

- - + +

This procedure creates a new SIB JMS Connection Factory or updates an existing JMS Connection Factory.

- +

CreateOrUpdateSIBJMSConnectionFactory Parameters

@@ -4060,39 +4994,50 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Scope of the Connection Factory Scope of the WebSphere Default messaging provider at which the Connection Factory is to be created.
Connection Factory Administrative Name The administrative name assigned to this Connection Factory.
Bus Name Name of the service integration bus to which connections are made.
JNDI Name The name and location used to bind this object into WebSphere Application Server JNDI.
Connection Factory Type Type of Connection Factory to create. Should be one of Queue or Topic. @@ -4100,21 +5045,29 @@ report.

- + - +

CreateOrUpdateWMQJMSConnectionFactory

- - + +

Creates or updates WMQ JMS Connection Factories

- - + +

This procedure creates a new WMQ JMS Connection Factory or updates an existing JMS Connection Factory.

- +

CreateOrUpdateWMQJMSConnectionFactory Parameters

@@ -4171,67 +5124,88 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Scope of the Connection Factory Scope of the WebSphere MQ messaging provider at which the Connection Factory is to be created.
Connection Factory Administrative Name The administrative name assigned to this Connection Factory.
Connection Factory Type Use this parameter to determine whether a unified connection factory, a queue connection factory or a topic connection factory is to be created. This needs to be one of the values from CF, QCF and TCF. Default is CF. Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists.
JNDI Name The name and location used to bind this object into WebSphere Application Server JNDI.
Connection Factory Administrative Description An Administrative description assigned to Connection Factory.
Client Channel Definition URL A URL to a client channel definition table to use, for this Connection Factory, when contacting WebSphere MQ.
Client Channel Definition Queue Manager A queue manager name, used to select one or more entries from a client channel definition table.
Additional Options Used to either override defaults or pass Custom Properties.
+ + +

Create or update WMQ JMS Connection Factory

To create or update WMQ JMS Connection Factory in Commander interface, do these steps:

@@ -4265,20 +5239,20 @@ report.

- +
- +

DeleteJMSConnectionFactory

- - + +

Deletes JMS Connection Factories

- - + +

This procedure deletes an existing JMS ConnectionFactory.

- +

DeleteJMSConnectionFactory Parameters

@@ -4288,32 +5262,43 @@ report.

Configuration Name + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Messaging System Type The name of the messaging provider. Pass in either WMQ or SIB.
Scope of the Connection Factory Scope of the WebSphere messaging provider at which the Connection Factory is to be deleted.
Connection Factory Administrative Name The administrative name assigned to this Connection Factory.
+ + +

Delete JMS ConnectionFactory

To delete JMS ConnectionFactory in Commander interface, do these steps:

@@ -4347,20 +5332,20 @@ report.

- +
- +

DeployApp

- - + +

Deploys an application using AdminApp.install

- - + +

This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall.

- +

DeployApp Parameters

@@ -4370,50 +5355,69 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'
Application Name Name of the web application to be deploy. i.e: 'webapp'.
Application Path Absolute path of the application to deploy. i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'.
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Deploying Applications

To deploy an application, do these steps:select the following @@ -4432,20 +5436,20 @@ report.

- +
- +

DeployEnterpriseApp

- - + +

Deploys an enterprise application using wsadmin tool

- - + +

This procedure deploys java enterprise application (.EAR) or java web application (.WAR) on given targets. If application is already deployed, procedure updates application.

- +

DeployEnterpriseApp Parameters

@@ -4455,183 +5459,252 @@ report.

Configuration Name + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Specifies logical name to be given to installing enterprise application. Do not include whitespaces in application name.
Application Path Absolute path of the application to deploy. Use "/" as the path separator on both linux and windows i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'.
Target cluster Name of the cluster on which to deploy enterprise application. Not required in WebSphere Base Edition. Enter either target cluster or target server(s).
Target server(s) Specify single or list of standalone application servers on which to deploy enterprise application. Specify servers in the form Node=server. For e.g. Node01=Server1,Node02=Server2. Not required in WebSphere Base Edition.
Map modules to servers Specify deployment targets where you want to install the modules that are contained in your application. Modules can be installed on the same deployment target or dispersed among several deployment targets. Give input in format [ "Module1Name" Module1URL server1][ "Module2Name" Module2URL server2 ] E.g. [ "Increment EJB module" Increment.jar,META-INF/ejb-jar.xml WebSphere:cell=Cell01,node=Node01,server=singleServer ]
Additional deployment parameters Specify any additional options for AdminApp. Install object in case not listed in this input form. For more information about each of the supported arguments, refer to 'http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/rxml_taskoptions.html'.
Directory to install application Specifies the directory to which the enterprise archive (EAR) file will be installed. Default is profile_root/installedApps/cell_name/application_name.ear directory.
Precompile JavaServer Pages files? Specify whether to precompile JavaServer Pages (JSP) files as a part of installation. The default is not to precompile JSP files.
Distribute application? Specifies whether the product expands application binaries in the installation location during installation.
Use binary configuration? Specifies whether the application server uses the binding, extensions, and deployment descriptors located with the application deployment document, the deployment.xml file (default), or those located in the enterprise archive (EAR) file. Default is to use bindings located in deployment.xml.
Deploy enterprise beans? Specifies whether the EJBDeploy tool runs during application installation. Default is false(true for EJB 3.0 modules).
Create MBeans for resources? Specifies whether to create MBeans for resources such as servlets or JSP files within an application when the application starts. Default is create MBeans.
Override class reloading settings for web and EJB modules? Specifies whether the product run time detects changes to application classes when the application is running. If yes, then on such changes application is stopped and restarted to reload updated classes.
Deploy web services? Specifies whether to deploy web services. Default is do not enable Deploy web services.
Process embedded configuration? Specifies whether the embedded configuration should be processed. An embedded configuration consists of files such as resource.xml, variables.xml, and deployment.xml.
Allow EJB reference targets to resolve automatically? Specifies whether the embedded configuration should be processed.
Deploy client modules? Select if the file to deploy has one or more client modules and want to configure environment entries for the client modules. Default is do not enable Client Module.
Validate schema? Specifies whether to validate the deployment descriptors against published Java EE deployment descriptor schemas.
Synchronize active nodes? Specify whether to synchronize active nodes. Applicable only for Network Deployment installation. Enabled by default.
Start application? Specify whether to start application or not. Enabled by default.
Reload interval in seconds Specifies the number of seconds to scan the application's file system for updated files. Default is 3 seconds.
Validate resource references Specifies whether websphere examines the application references specified during application installation or updating and, if validation is enabled, warns you of incorrect references or fails the operation.
File permission Specifies access permissions for application binaries.
Customized file permission Provide custom file permissions if not listed in File permissions drop down.
Business level application name Specifies whether websphere creates a new business-level application with the enterprise application that you are installing or makes the enterprise application a composition unit of an existing business-level application. The default is to create a new business-level application.
Client deployment mode Specifies whether to deploy client modules to an isolated deployment target (Isolated), a federated node of a deployment manager (Federated), or an application server (Server Deployed). Default is Isolated
Wsadmin Commands Commands to be entered to wsadmin. Use one command per line.
Wsadmin Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
Wsadmin Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Wsadmin Additional Arguments Additional arguements to be passed to wsadmin.
Context root Applicable only to web applications (WAR). Specifies the context root of the web application (WAR). A context root for each web module is defined in the application deployment descriptor during application assembly. Use this field to assign a different context root to a web module. The context root is combined with the defined servlet mapping (from the WAR file) to compose the full URL that users type to access the servlet. For example, if the context root is /gettingstarted and the servlet mapping is MySession, then the URL is http://host:port/gettingstarted/MySession.
+ + +

Deploy Enterprise Application

To deploy an enterprise application, do these steps:

@@ -4649,20 +5722,20 @@ A context root for each web module is defined in the application deployment desc

- +
- +

UndeployApp

- - + +

Undeploys an application using AdminApp.uninstall

- - + +

This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall.

- +

UndeployApp Parameters

@@ -4672,45 +5745,62 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the application to undeploy. i.e: 'webapp'.
Commands Commands to be entered to wsadmin. Use one command per line.
Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
Classpath Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'
Additional Commands Additional commands to be entered for wsadmin.
+ + +

Undeploying Applications

To undeploy an application, do these steps:

@@ -4727,20 +5817,20 @@ A context root for each web module is defined in the application deployment desc report.

- +
- +

UpdateApp

- - + +

Updates existing application

- - + +

This procedure updates already deployed application in units of files, modules or entire application.

- +

UpdateApp Parameters

@@ -4750,60 +5840,83 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the web application to be updated. i.e: 'webapp'.
Content Type Specifies to type of content to update. Use File option for updating a single file, Partial Application option for updating application partially, Module option to add/update a module to the deployed application, Application option for updating the entire deployed application.
Operation Specifies to type of operation to perform as part of update procedure. Use Add option to add new content, Update option to update existing content, AddUpdate option to add content and to replace if already exist, Delete option to remove existing content respectively.
Content Specifies the file that contains the content that you want to update. For example, depending on the content type, the file could be an EAR file, a module, a partial zip, or a single file.Not required for Delete operation.
Content URI The relative path beginning with the installed application archive file to the file to be replaced or added. For example, if the file is located at com/company/greeting.class in module hello.jar, specify hello.jar/com/company/greeting.class for the relative path
Cluster Name Name of the cluster on which application is deployed.
Server Name Name of the server on which application is deployed.
Additional Parameters Additional parameters to pass while updating entire application or module/s, if required. For e.g. -nodeployejb, -BindJndiForEJBNonMessageBinding etc.
+ + +

Update Application

To update application , do these steps:

@@ -4821,20 +5934,20 @@ A context root for each web module is defined in the application deployment desc

- +
- +

CheckApp

- - + +

Checks if a web application is ready

- - + +

This procedure checks if a web application is ready by using a Jython script.

- +

CheckApp Parameters

@@ -4844,38 +5957,51 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Absolute path of wsadmin, including filename and extension. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Application Name Name of the web application to be checked. i.e: 'webapp'.
Application State Checked Application State that is being checked, with any applicable retries based on wait time parameter. Any state that is not the desired state after any applicable retries, will be returned as a failure by the procedure.
Wait Time Maximum duration of check application state retries.
+ + +

Checking Application State

To check Application State, do these steps:

@@ -4904,25 +6030,25 @@ A context root for each web module is defined in the application deployment desc

- +
- +

CheckNodeStatus

- +

(Applicable only for WebSphere Network Deployment installation.)

- - + +

Checks Node Status.

- - + +

This procedure checks WebSphere node status. It checks Node Agent and all servers associated with node by it's name.

- +

CheckNodeStatus Parameters

@@ -4932,43 +6058,54 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Name of the Node Name of the Node, which should be checked.
Success Criteria Conditions that must be met for successful completion of the procedure.
-
+ + + +

CheckPageStatus

- - + +

Check the status of a page on a given URL

- - + +

This procedure checks the status of the page with the specified URL.

- +

CheckPageStatus Parameters

@@ -4978,30 +6115,41 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - +
Credentials to be entered The credentials needed to check the status of the page.
Target URL URL of the page to be checked.
Maximum Elapsed Time Defines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time).
Success Criteria Indicates the expected correct result to be obtained when running checking the server.
+ + +

Checking the Status of a Page

To check the status of page at a specific URL, do the following steps:

@@ -5019,20 +6167,20 @@ A context root for each web module is defined in the application deployment desc report.

- +
- +

CheckServerStatus

- - + +

Check the status of the given server URL

- - + +

This procedure checks the status of the specified server URL.

- +

CheckServerStatus Parameters

@@ -5042,147 +6190,52 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Maximum Elapsed Time Defines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time).
Success Criteria Indicates the expected correct result to be obtained when running checking the server.
-

- - -

- -
- - -
-

ConfigEJBContainer

- - -

Configures EJB container using the wsadmin tool

- - -

This procedure configures EJB container properites using a Jython script.

- - -

ConfigEJBContainer Parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescription
Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Cell NameName of cell to which EJB container belongs to.
Node NameName of node to which EJB container belongs to.
Server NameName of application server to which EJB container belongs to.
Passivation DirectorySpecifies the directory into which the container saves the persistent state of passivated stateful session beans. This directory must already exist. It is not automatically created.Default is ${USER_INSTALL_ROOT}/temp.
Cache SizeNumber of buckets in the active instance list within the EJB container.Input value range - greater than 0. The container selects the next largest prime number equal to or greater than the specified value.Default is 2053
Cleanup IntervalInterval (in milliseconds)at which the container attempts to remove unused items from the cache.Default is 3000. Allowed range is 0 to 2147483647
Inactive Pool Cleanup IntervalSpecifies the interval at which the container examines the pools of available bean instances to determine if some instances can be deleted to reduce memory usage.
Enable stateful session bean fail over using memory-to-memory replication?Specifies that failover is enabled for all stateful session beans installed in this EJB container.Replication domains must already exist to failover feature to work.
Replication domainSpecifies the replication domain in which HTTP sessions are replicated.
Replication ModeThe mode specifies whether data is only sent (client), only received (server), or both. Select client if sessions need to be replicated. Select server if sessions need to be stored. Select both client and server if sessions need to be replicated and stored. The default is both.
+ +

-

Configure EJB Container

-

To Configure EJB Container, do these steps:

-
    -
  1. Go to the ConfigEJBContainer procedure.
  2. -
  3. Enter the following parameters:
  4. -
-

After the job runs, you can view the results, including the following job details, which show that - EJB container is configured successfully:

- -

In the ConfigEJBContainer step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

- +

- +
- +

DeployOSGiApp

- - + +

Deploy OSGi application using the wsadmin tool

- - + +

This procedure deploys the OSGi application.It optionally configures external OSGi bundle library if the application to be deployed reference bundles that are stored in an external bundle repository. This procedure can also add the bundles to internal bundle repository, if required.

- +

DeployOSGiApp Parameters

@@ -5192,55 +6245,76 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - +
Configuration Name Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

A Configuration defines connection details and can be created by going to plugin configuration page.
Wsadmin Absolute Path Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
Want to add external bundle repository? If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required.
External Bundle Repository Name Name of the external bundle repository to configure.
External Bundle Repository URL URL of the external bundle repository to configure.
List of bundles to add to local repository Comma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar
EBA file Path Absolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'.
Application Name Name to be given to newly deployed OSGi application.
Target Deployment Unit Deployment Unit on which to deploy the OSGi application. For e.g cluster=cluster1 or node=node01,server=server1
+ + +

Deploy OSGi Application

To deploy an OSGi application, do these steps:

@@ -5258,17 +6332,17 @@ A context root for each web module is defined in the application deployment desc

- +
- +

Discover

- - + +

Discover WebSphere instance configuration on a resources or environment

- - + +

Discover Parameters

@@ -5278,59 +6352,86 @@ A context root for each web module is defined in the application deployment desc - + + + - + + + - +
Configuration Name The plugin's configuration name.
Resource Names List of resources, on which discovery procedure should run. Enter multiple values on separate lines.
-
+ + + + + + + + + + +

Release Notes

- + +

@PLUGIN_KEY@ 2.8.0

+
    + +
  • Add checking connection while creating a configuration.
  • + +
  • Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved.
  • + +
  • Add logging while running "CreateConfiguration".
  • + +
+

@PLUGIN_KEY@ 2.7.0

    +
  • Preserve time limit settings after upgrade.
  • +
- +

@PLUGIN_KEY@ 2.6.3

    - +
  • Renaming from "Electric Cloud" to "CloudBees".
  • - +
- +

@PLUGIN_KEY@ 2.6.2

    - +
  • Configurations can be created by users with "@" sign in a name.
  • - +
- +

@PLUGIN_KEY@ 2.6.1

    - -
  • The plugin icon has been updated.
  • - + +
  • The plugin icon has been updated.<
  • +
- +

@PLUGIN_KEY@ 2.6.0

    - +
  • Following new procedures have been added to support management of clusters:
    • CreateFirstClusterMember
    • @@ -5347,12 +6448,12 @@ The Interface for the Following procedures have been Improved (for moving WSADMI
    Error Reporting has been improved by leveraging postp to capture granular error messages in Diagnostics.
  • - +
- +

@PLUGIN_KEY@ 2.5.0

    - +
  • Following New procedures have been added to support application server management:
    • CreateApplicationServer
    • @@ -5373,19 +6474,19 @@ Error Reporting has been improved by leveraging postp to capture granular error
  • WSAdmin Absolute path has been changed from non-required to required in plugin configuration.
  • - +
- +

@PLUGIN_KEY@ 2.4.1

    - +
  • Configured the plugin to allow the ElectricFlow UI to create configs inline of procedure form.
  • - +
- +

@PLUGIN_KEY@ 2.4.0

    - +
  • Following New procedures have been added to support the entire set of IBM JMS functionality:
  • - +
- +

@PLUGIN_KEY@ 2.3.1

    - +
  • Help links have been updated for DeleteJMSTopic and DeleteJMSQueue procedures.
  • - +
  • Configured the plugin to allow the ElectricFlow UI to render the plugin procedure parameters entirely using the configured form XMLs.
  • - +
  • Enabled the plugin for managing the plugin configurations in-line when defining an application process step or a pipeline stage task.
  • - +
- +

@PLUGIN_KEY@ 2.3.0

    - +
  • Following New procedures have been added:
    • DeleteJMSQueue
    • @@ -5466,220 +6567,220 @@ Error Reporting has been improved by leveraging postp to capture granular error
    • Procedure has been improved and now it could check for different application states.
  • - +
- +

@PLUGIN_KEY@ 2.2.4

    - +
  • Documentation has been improved.
  • - +
  • Cluster Scope field has been added to CreateJDBCProvider procedure.
  • - +
- +

@PLUGIN_KEY@ 2.2.3

    - +
  • Added support of parallel execution for all plugin procedures.
  • - +
  • Added "Context root" parameter for Deploy Enterprise Application procedure.
  • - +
  • Bug fixes in CheckPageStatus procedure.
  • - +
  • Added warning instead of stack trace in the Stop/StartApp procedures if app was already stoped or started.
  • - +
- +

@PLUGIN_KEY@ 2.2.2

    - +
  • Added new procedures - SyncNodes, CheckNodeStatus.
  • - +
  • Added following optional parameters to DeployEnterpriseApplication procedure:
    • "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default.
    • "Start application": Start the deployed application after deploying the application. Enabled by default.
  • - +
  • Changed default value for "Distribute application" from unchecked to checked. (Deploy Enterprise Application procedure).
  • - +
- +

@PLUGIN_KEY@ 2.2.1

    - +
  • Added new procedures - StartCluster, StopCluster, MapSharedLibrary, ModifyApplicationClassLoader.
  • - +
  • DeployEnterpriseApp procedure will now update the application if it is already deployed. This procedure was refactored.
  • - +
  • Added debugging in DeployEnterpriseApp procedure.
  • - +
  • Bug fixes in DeployEnterpriseApplication procedure on WASND 8.5.5 Windows platform.
  • - +
  • Bug fixes in UpdateApp procedure on WAS 8.5 and WASND 8.5.5 Windows platform.
  • - +
  • Added application name to step log when ModifyApplicationClassLoader procedure fails to find application.
  • - +
  • Added debug flag to plugin configurations.
  • - +
- +

@PLUGIN_KEY@ 2.2.0

    - +
  • Added suport for discovering WebSphere configuraiton on ElectricFlow resource.
  • - +
  • Moved 'Connection Type' parameter for all plugin procedures to plugin's configuration.
  • - +
  • Added 'Cluster Name' and 'Server Name' optional parameter to 'Start Application' and 'Stop Application' procedures.
  • - +
- +

@PLUGIN_KEY@ 2.1.2

    - +
  • Fixed issue with configurations being cached for IE.
  • - +
- +

@PLUGIN_KEY@ 2.1.1

    - +
  • Added link to plugin Configuration Page in plugin step panels.
  • - +
- +

@PLUGIN_KEY@ 2.1.0

    - +
  • Added support for WebSphere Network Deployment 8.5
  • - +
  • Added support to create a cluster, add application servers to it, deploy applications in the cluster, remove cluster members, and delete the cluster.
  • - +
  • Added support to deploy Java enterprise applications (EARs) and web archives (WARs).
  • - +
  • Added support to update deployed applications.
  • - +
  • Added support to deploy OSGi applications and to configure external and internal bundle repositories.
  • - +
  • Added support to configure session management component for deployed applications.
  • - +
  • Added support for setting the EJB container properties for improved memory consumption and stateful session bean failover.
  • - +
  • Added support for the JavaMail session.
  • - +
- +

@PLUGIN_KEY@ 2.0.6

    - +
  • Fixed the DeployApp procedure to not include the password in the log file.
  • - +
  • Fixed the problem about attaching credentials in the CheckApp procedure.
  • - +
  • Fixed the problem where the wsadmin password appeared when you view job step log files and property information.
  • - +
  • Fixed instructions to create WebSphere plugin configurations.
  • - +
  • Fixed instructions to access plugins in ElectricFlow.
  • - +
- +

@PLUGIN_KEY@ 2.0.5

    - +
  • Fix minor bugs.
  • - +
- +

@PLUGIN_KEY@ 2.0.4

    - +
  • [Add four new procedures:CreateDatasources, DeleteDatasources, CreateJDBCProviders, and DeleteJDBCProviders.]
  • - +
  • Fix minor bugs.
  • - +
- +

@PLUGIN_KEY@ 2.0.3

    - +
  • Change the procedure names in the step picker section.
  • - +
- +

@PLUGIN_KEY@ 2.0.2

    - +
  • Make improvements to the help document.
  • - +
- +

@PLUGIN_KEY@ 2.0.1

    - +
  • Features and Enhancements in EC-WebSphere 2.0.1.
  • - +
  • Use the new Parameter Form XML.
  • - +
  • Add a link directly to the new help document.
  • - +
- +

@PLUGIN_KEY@ 2.0.0

    - +
  • Use the new help page format.
  • - +
  • Add new parameter panels for each procedure.
  • - +
- +

@PLUGIN_KEY@ 1.3.0

    - +
  • Add the CheckPageStatus procedure.
  • - +
  • Remove the CURL dependency from the CheckServerStatus procedure.
  • - +
  • Fix minor bugs.
  • - +
  • The procedures now have only one step using ec-perl to execute the necessary commands.
  • - +
- +

@PLUGIN_KEY@ 1.2.1

    - +
  • Fix a minor bug on the Configuration List page.
  • - +
- +

@PLUGIN_KEY@ 1.2.0

    - +
  • Add the StartApp, StopApp, DeployApp, and UndeployApp procedures.
  • - +
- +

@PLUGIN_KEY@ 1.1.1

    - +
  • Jython commands can now be entered manually in the RunCustomJob procedure.
  • - +
  • The absolute path of executable files now requires the path and filename with an extension.
  • - +
- +

@PLUGIN_KEY@ 1.1.0

    - +
  • RunCustomJob procedure has been added.
  • - +
- + From 64436ac19c36e41e9a976910380bd7debef00fb0 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 23 Apr 2020 18:18:59 +0300 Subject: [PATCH 03/47] Rollback DeployOSGIApp --- help/metadata.yaml | 1 + pages/EC-WebSphere_help.xml | 226 ++++++++++++++++++------------------ 2 files changed, 114 insertions(+), 113 deletions(-) diff --git a/help/metadata.yaml b/help/metadata.yaml index 01d62dcb..79723ed0 100644 --- a/help/metadata.yaml +++ b/help/metadata.yaml @@ -78,6 +78,7 @@ proceduresGrouping: procedures: - DeployApp - DeployEnterpriseApp + - DeployOSGiApp - UndeployApp - UpdateApp - name: Check Procedures diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 195bde05..8de08463 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -55,8 +55,8 @@
  • StopDeploymentManager (Applicable only for WebSphere Network Deployment installation.)
  • StartNode (Applicable only for WebSphere Network Deployment installation.)
  • StopNode (Applicable only for WebSphere Network Deployment installation.) -
  • StartServer
  • StopServer
  • RunCustomJob
  • WAS Application Component Management Procedures
    These procedures for application component management.
  • WAS Application Administration Procedures
    These procedures for application administration.
  • WAS Datasource Management Procedures
    These procedures for datasource management.
  • WAS JMS Management Procedures
    These procedures for JMS resources management.
  • WAS Application Deployment Procedures
    These procedures for applications deployment.
  • Check Procedures
    Procedures for status checking
  • Other
  • +
  • StartServer
  • StopServer
  • RunCustomJob
  • WAS Application Component Management Procedures
    These procedures for application component management.
  • WAS Application Administration Procedures
    These procedures for application administration.
  • WAS Datasource Management Procedures
    These procedures for datasource management.
  • WAS JMS Management Procedures
    These procedures for JMS resources management.
  • WAS Application Deployment Procedures
    These procedures for applications deployment.
  • Check Procedures
    Procedures for status checking
  • Other
  • @@ -5726,6 +5726,116 @@ A context root for each web module is defined in the application deployment desc +
    +

    DeployOSGiApp

    + + +

    Deploy OSGi application using the wsadmin tool

    + + +

    This procedure deploys the OSGi application.It optionally configures external OSGi bundle library if the application to be deployed reference bundles that are stored in an external bundle repository. This procedure can also add the bundles to internal bundle repository, if required.

    + + +

    DeployOSGiApp Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Want to add external bundle repository?If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required.
    External Bundle Repository NameName of the external bundle repository to configure.
    External Bundle Repository URLURL of the external bundle repository to configure.
    List of bundles to add to local repositoryComma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar
    EBA file PathAbsolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'.
    Application NameName to be given to newly deployed OSGi application.
    Target Deployment UnitDeployment Unit on which to deploy the OSGi application. For e.g cluster=cluster1 or node=node01,server=server1
    + + + + +

    +

    Deploy OSGi Application

    +

    To deploy an OSGi application, do these steps:

    +
      +
    1. Go to the DeployOSGiApp procedure.
    2. +
    3. Enter the following parameters:
    4. +
    +

    After the job runs, you can view the results, including the following job details, which show that + OSGi application is deployed successfully:

    + +

    In the DeployOSGi step, click the Log icon + to see the diagnostic information. The output is similar to + the following diagnostic + report.

    + + +

    + +
    + +

    UndeployApp

    @@ -6226,116 +6336,6 @@ A context root for each web module is defined in the application deployment desc
    -
    -

    DeployOSGiApp

    - - -

    Deploy OSGi application using the wsadmin tool

    - - -

    This procedure deploys the OSGi application.It optionally configures external OSGi bundle library if the application to be deployed reference bundles that are stored in an external bundle repository. This procedure can also add the bundles to internal bundle repository, if required.

    - - -

    DeployOSGiApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Want to add external bundle repository?If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required.
    External Bundle Repository NameName of the external bundle repository to configure.
    External Bundle Repository URLURL of the external bundle repository to configure.
    List of bundles to add to local repositoryComma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar
    EBA file PathAbsolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'.
    Application NameName to be given to newly deployed OSGi application.
    Target Deployment UnitDeployment Unit on which to deploy the OSGi application. For e.g cluster=cluster1 or node=node01,server=server1
    - - - - -

    -

    Deploy OSGi Application

    -

    To deploy an OSGi application, do these steps:

    -
      -
    1. Go to the DeployOSGiApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - OSGi application is deployed successfully:

    - -

    In the DeployOSGi step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - -

    Discover

    @@ -6425,7 +6425,7 @@ A context root for each web module is defined in the application deployment desc

    @PLUGIN_KEY@ 2.6.1

      -
    • The plugin icon has been updated.<
    • +
    • The plugin icon has been updated.
    From d0b1ba1c1203fce7a2dc387de1177f4403f8de69 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Fri, 29 May 2020 16:03:28 +0300 Subject: [PATCH 04/47] Rebranding from "CloudBees Flow" to "CloudBees CD". --- README.md | 6 +- build.gradle | 2 +- help/changelog.yaml | 6 +- help/overview.md | 2 +- help/procedures/CheckApp/postface.md | 2 +- .../CreateApplicationServer/postface.md | 2 +- .../postface.md | 2 +- help/procedures/CreateCluster/postface.md | 2 +- .../CreateClusterMembers/postface.md | 2 +- .../procedures/CreateConfiguration/preface.md | 2 +- .../CreateFirstClusterMember/postface.md | 2 +- .../CreateOrUpdateJMSQueue/postface.md | 2 +- .../CreateOrUpdateJMSTopic/postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../DeleteApplicationServer/postface.md | 2 +- .../postface.md | 2 +- help/procedures/DeleteCluster/postface.md | 2 +- .../DeleteJMSActivationSpec/postface.md | 2 +- .../DeleteJMSConnectionFactory/postface.md | 2 +- help/procedures/DeleteJMSProvider/postface.md | 2 +- help/procedures/DeleteJMSQueue/postface.md | 2 +- help/procedures/DeleteJMSTopic/postface.md | 2 +- .../ExportApplicationServer/postface.md | 2 +- .../ImportApplicationServer/postface.md | 2 +- .../procedures/ListClusterMembers/postface.md | 2 +- .../RemoveClusterMembers/postface.md | 2 +- .../StartApplicationServers/postface.md | 2 +- help/procedures/StartCluster/postface.md | 2 +- .../StartDeploymentManager/postface.md | 2 +- help/procedures/StartNode/postface.md | 2 +- .../StopApplicationServers/postface.md | 2 +- help/procedures/StopCluster/postface.md | 2 +- .../StopDeploymentManager/postface.md | 2 +- help/procedures/StopNode/postface.md | 2 +- pages/EC-WebSphere_help.xml | 83 +++++++++---------- src/main/resources/META-INF/plugin.xml | 2 +- .../resources/project/WebSphere/Discovery.pm | 2 +- 40 files changed, 82 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index 6f72517c..04daaa64 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ EC-WebSphere ============ -The ElectricFlow WebSphere integration +The CloudBees CD WebSphere integration ## Compile ## @@ -20,6 +20,6 @@ Create an ecplugin.properties at the root of this repository with the following These represent secrets that **should not** be checked in. #### Running tests #### -Run the `test` task to run the system tests. You may want to specify the ElectricFlow Server to test against by way of the COMMANDER_SERVER environment variable. +Run the `test` task to run the system tests. You may want to specify the CloudBees CD Server to test against by way of the COMMANDER_SERVER environment variable. -`COMMANDER_SERVER= ./gradlew test` +`COMMANDER_SERVER= ./gradlew test` diff --git a/build.gradle b/build.gradle index c914116f..c94b855c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ // // Gradle build script for EC-WebSphere plugin. // -// Copyright (c) 2016 Electric Cloud, Inc. +// Copyright (c) 2016 CloudBees, Inc. // All rights reserved buildscript { diff --git a/help/changelog.yaml b/help/changelog.yaml index 525800e7..4e5a8162 100644 --- a/help/changelog.yaml +++ b/help/changelog.yaml @@ -1,7 +1,5 @@ -2.8.0: - - Add checking connection while creating a configuration. - - Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved. - - Add logging while running "CreateConfiguration". +2.7.1: + - Rebranding from "CloudBees Flow" to "CloudBees CD". 2.7.0: - Preserve time limit settings after upgrade. 2.6.3: diff --git a/help/overview.md b/help/overview.md index b76eb523..b6bde7bc 100644 --- a/help/overview.md +++ b/help/overview.md @@ -19,7 +19,7 @@ In case you install more WebSphere instances these values will be changed. For more information about WebSphere, go to the WebSphere Home Page. -## CloudBees Flow Integration to WebSphere +## CloudBees CD Integration to WebSphere You can use this plugin to interact with an IBM WebSphere Server. You can start and stop the server. You can also manage applications within the server (start, diff --git a/help/procedures/CheckApp/postface.md b/help/procedures/CheckApp/postface.md index 9669d9af..bfd3432e 100644 --- a/help/procedures/CheckApp/postface.md +++ b/help/procedures/CheckApp/postface.md @@ -8,7 +8,7 @@

    After the job runs, you can view the results, including the following job details:

    -

    To check Application State in Flow interface, do these steps:

    +

    To check Application State in CloudBees CD interface, do these steps:

    1. Create Pipeline.
    2. Create task.
    3. diff --git a/help/procedures/CreateApplicationServer/postface.md b/help/procedures/CreateApplicationServer/postface.md index a5cdfc28..110395e4 100644 --- a/help/procedures/CreateApplicationServer/postface.md +++ b/help/procedures/CreateApplicationServer/postface.md @@ -1,7 +1,7 @@ ### Create Application Server -To Create Application Server in Flow interface, do these steps: +To Create Application Server in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/CreateApplicationServerTemplate/postface.md b/help/procedures/CreateApplicationServerTemplate/postface.md index 59a733d9..1ca8d202 100644 --- a/help/procedures/CreateApplicationServerTemplate/postface.md +++ b/help/procedures/CreateApplicationServerTemplate/postface.md @@ -1,7 +1,7 @@ ### Create Application Server Template -To Create Application Server Template in Flow interface, do these steps: +To Create Application Server Template in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/CreateCluster/postface.md b/help/procedures/CreateCluster/postface.md index 56b6a817..32c4ae5e 100644 --- a/help/procedures/CreateCluster/postface.md +++ b/help/procedures/CreateCluster/postface.md @@ -1,7 +1,7 @@ ### Create Cluster -To Create Cluster in Flow interface, do these steps: +To Create Cluster in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/CreateClusterMembers/postface.md b/help/procedures/CreateClusterMembers/postface.md index 5b3e0949..c98ac971 100644 --- a/help/procedures/CreateClusterMembers/postface.md +++ b/help/procedures/CreateClusterMembers/postface.md @@ -1,7 +1,7 @@ ### Create Cluster Members -To Create Cluster Members in Flow interface, do these steps: +To Create Cluster Members in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/CreateConfiguration/preface.md b/help/procedures/CreateConfiguration/preface.md index 49ec96fe..dba65b63 100644 --- a/help/procedures/CreateConfiguration/preface.md +++ b/help/procedures/CreateConfiguration/preface.md @@ -1,4 +1,4 @@ -Note: After you perform the setup below it is important to make sure that the CloudBees Flow agent machine on which WebSphere runs is registered as a resource that can be pinged. +Note: After you perform the setup below it is important to make sure that the CloudBees CD agent machine on which WebSphere runs is registered as a resource that can be pinged.
      Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. They reduce repetition of common values, create predefined parameter sets for end users, diff --git a/help/procedures/CreateFirstClusterMember/postface.md b/help/procedures/CreateFirstClusterMember/postface.md index 9351048a..9acb0657 100644 --- a/help/procedures/CreateFirstClusterMember/postface.md +++ b/help/procedures/CreateFirstClusterMember/postface.md @@ -1,7 +1,7 @@ ### Create First Cluster Member -To Create First Cluster Member in Flow interface, do these steps: +To Create First Cluster Member in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/CreateOrUpdateJMSQueue/postface.md b/help/procedures/CreateOrUpdateJMSQueue/postface.md index 51e86d18..c65030b5 100644 --- a/help/procedures/CreateOrUpdateJMSQueue/postface.md +++ b/help/procedures/CreateOrUpdateJMSQueue/postface.md @@ -10,7 +10,7 @@

      After the job runs, you can view the results, including the following job details:

      -

      To create or update JMS Queue in Flow interface, do these steps:

      +

      To create or update JMS Queue in CloudBees CD interface, do these steps:

      1. Create Pipeline.
      2. Create task.
      3. diff --git a/help/procedures/CreateOrUpdateJMSTopic/postface.md b/help/procedures/CreateOrUpdateJMSTopic/postface.md index 37142486..0000744f 100644 --- a/help/procedures/CreateOrUpdateJMSTopic/postface.md +++ b/help/procedures/CreateOrUpdateJMSTopic/postface.md @@ -10,7 +10,7 @@

        After the job runs, you can view the results, including the following job details:

        -

        To create or update JMS Topic in Flow interface, do these steps:

        +

        To create or update JMS Topic in CloudBees CD interface, do these steps:

        1. Create Pipeline.
        2. Create task.
        3. diff --git a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md index 3e13e6ad..4a0b5e67 100644 --- a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md @@ -10,7 +10,7 @@

          After the job runs, you can view the results, including the following job details:

          -

          To create or update JMS Topic in Flow interface, do these steps:

          +

          To create or update JMS Topic in CloudBees CD interface, do these steps:

          1. Create Pipeline.
          2. Create task.
          3. diff --git a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md index ec0b1fd0..73d13185 100644 --- a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md @@ -10,7 +10,7 @@

            After the job runs, you can view the results, including the following job details:

            -

            To create or update JMS Topic in Flow interface, do these steps:

            +

            To create or update JMS Topic in CloudBees CD interface, do these steps:

            1. Create Pipeline.
            2. Create task.
            3. diff --git a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md index 38242e66..a72c9311 100644 --- a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md @@ -10,7 +10,7 @@

              After the job runs, you can view the results, including the following job details:

              -

              To create or update WMQ JMS Activation Spec in Flow interface, do these steps:

              +

              To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

              1. Create Pipeline.
              2. Create task.
              3. diff --git a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md index f7811366..24eee8ba 100644 --- a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md @@ -10,7 +10,7 @@

                After the job runs, you can view the results, including the following job details:

                -

                To create or update JMS Topic in Flow interface, do these steps:

                +

                To create or update JMS Topic in CloudBees CD interface, do these steps:

                1. Create Pipeline.
                2. Create task.
                3. diff --git a/help/procedures/DeleteApplicationServer/postface.md b/help/procedures/DeleteApplicationServer/postface.md index bcc77412..8b843f5c 100644 --- a/help/procedures/DeleteApplicationServer/postface.md +++ b/help/procedures/DeleteApplicationServer/postface.md @@ -1,7 +1,7 @@ ### Delete Application Server -To Delete Application Server in Flow interface, do these steps: +To Delete Application Server in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/DeleteApplicationServerTemplate/postface.md b/help/procedures/DeleteApplicationServerTemplate/postface.md index d34db7f8..a910139d 100644 --- a/help/procedures/DeleteApplicationServerTemplate/postface.md +++ b/help/procedures/DeleteApplicationServerTemplate/postface.md @@ -1,7 +1,7 @@ ### Delete Application Server Template -To Delete Application Server Template in Flow interface, do these steps: +To Delete Application Server Template in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/DeleteCluster/postface.md b/help/procedures/DeleteCluster/postface.md index 00fcc3f3..a19f6c2c 100644 --- a/help/procedures/DeleteCluster/postface.md +++ b/help/procedures/DeleteCluster/postface.md @@ -1,7 +1,7 @@ ### Delete Cluster -To Delete Cluster in Flow interface, do these steps: +To Delete Cluster in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/DeleteJMSActivationSpec/postface.md b/help/procedures/DeleteJMSActivationSpec/postface.md index dd20f8a0..e51fcc8a 100644 --- a/help/procedures/DeleteJMSActivationSpec/postface.md +++ b/help/procedures/DeleteJMSActivationSpec/postface.md @@ -14,7 +14,7 @@ diagnostic information. The output is similar to the following diagnostic report.

                  -

                  To delete JMS Activation Spec in Flow interface, do these steps:

                  +

                  To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                  1. Create Pipeline.
                  2. Create task.
                  3. diff --git a/help/procedures/DeleteJMSConnectionFactory/postface.md b/help/procedures/DeleteJMSConnectionFactory/postface.md index 2f374fdc..6b3708a3 100644 --- a/help/procedures/DeleteJMSConnectionFactory/postface.md +++ b/help/procedures/DeleteJMSConnectionFactory/postface.md @@ -10,7 +10,7 @@

                    After the job runs, you can view the results, including the following job details:

                    -

                    To delete JMS ConnectionFactory in Flow interface, do these steps:

                    +

                    To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

                    1. Create Pipeline.
                    2. Create task.
                    3. diff --git a/help/procedures/DeleteJMSProvider/postface.md b/help/procedures/DeleteJMSProvider/postface.md index 5a51b16b..17fe2786 100644 --- a/help/procedures/DeleteJMSProvider/postface.md +++ b/help/procedures/DeleteJMSProvider/postface.md @@ -10,7 +10,7 @@

                      After the job runs, you can view the results, including the following job details:

                      -

                      To delete JMS Provider in Flow interface, do these steps:

                      +

                      To delete JMS Provider in CloudBees CD interface, do these steps:

                      1. Create Pipeline.
                      2. Create task.
                      3. diff --git a/help/procedures/DeleteJMSQueue/postface.md b/help/procedures/DeleteJMSQueue/postface.md index f4c2eba1..8c9d98bf 100644 --- a/help/procedures/DeleteJMSQueue/postface.md +++ b/help/procedures/DeleteJMSQueue/postface.md @@ -10,7 +10,7 @@

                        After the job runs, you can view the results, including the following job details:

                        -

                        To delete JMS Queue in Flow interface, do these steps:

                        +

                        To delete JMS Queue in CloudBees CD interface, do these steps:

                        1. Create Pipeline.
                        2. Create task.
                        3. diff --git a/help/procedures/DeleteJMSTopic/postface.md b/help/procedures/DeleteJMSTopic/postface.md index 6258da49..165829bb 100644 --- a/help/procedures/DeleteJMSTopic/postface.md +++ b/help/procedures/DeleteJMSTopic/postface.md @@ -10,7 +10,7 @@

                          After the job runs, you can view the results, including the following job details:

                          -

                          To delete JMS Topic in Flow interface, do these steps:

                          +

                          To delete JMS Topic in CloudBees CD interface, do these steps:

                          1. Create Pipeline.
                          2. Create task.
                          3. diff --git a/help/procedures/ExportApplicationServer/postface.md b/help/procedures/ExportApplicationServer/postface.md index 84d9568d..9dcfa5d3 100644 --- a/help/procedures/ExportApplicationServer/postface.md +++ b/help/procedures/ExportApplicationServer/postface.md @@ -1,7 +1,7 @@ ### Export Application Server -To Export Application Server in Flow interface, do these steps: +To Export Application Server in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/ImportApplicationServer/postface.md b/help/procedures/ImportApplicationServer/postface.md index 43685b1a..bb58d9e7 100644 --- a/help/procedures/ImportApplicationServer/postface.md +++ b/help/procedures/ImportApplicationServer/postface.md @@ -1,7 +1,7 @@ ### Import Application Server -To Import Application Server in Flow interface, do these steps: +To Import Application Server in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/ListClusterMembers/postface.md b/help/procedures/ListClusterMembers/postface.md index c56897ee..5bd61d45 100644 --- a/help/procedures/ListClusterMembers/postface.md +++ b/help/procedures/ListClusterMembers/postface.md @@ -1,7 +1,7 @@ ### List Cluster Members -To List Cluster Members in Flow interface, do these steps: +To List Cluster Members in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/RemoveClusterMembers/postface.md b/help/procedures/RemoveClusterMembers/postface.md index 61a06361..861d3b10 100644 --- a/help/procedures/RemoveClusterMembers/postface.md +++ b/help/procedures/RemoveClusterMembers/postface.md @@ -1,7 +1,7 @@ ### Remove Cluster Members -To Remove Cluster Members in Flow interface, do these steps: +To Remove Cluster Members in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StartApplicationServers/postface.md b/help/procedures/StartApplicationServers/postface.md index e5b522bb..ef980c5b 100644 --- a/help/procedures/StartApplicationServers/postface.md +++ b/help/procedures/StartApplicationServers/postface.md @@ -1,7 +1,7 @@ ### Start Application Servers -To Start Application Servers in Flow interface, do these steps: +To Start Application Servers in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StartCluster/postface.md b/help/procedures/StartCluster/postface.md index b34f64ea..c8e1faef 100644 --- a/help/procedures/StartCluster/postface.md +++ b/help/procedures/StartCluster/postface.md @@ -1,7 +1,7 @@ ### Start Cluster -To Start Cluster in Flow interface, do these steps: +To Start Cluster in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StartDeploymentManager/postface.md b/help/procedures/StartDeploymentManager/postface.md index 31153017..281cba16 100644 --- a/help/procedures/StartDeploymentManager/postface.md +++ b/help/procedures/StartDeploymentManager/postface.md @@ -1,7 +1,7 @@ ### Start Deployment Manager -To Start Deployment Manager in Flow interface, do these steps: +To Start Deployment Manager in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StartNode/postface.md b/help/procedures/StartNode/postface.md index fac114a6..7b3e5b2f 100644 --- a/help/procedures/StartNode/postface.md +++ b/help/procedures/StartNode/postface.md @@ -1,7 +1,7 @@ ### Start Node -To Start Node in Flow interface, do these steps: +To Start Node in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StopApplicationServers/postface.md b/help/procedures/StopApplicationServers/postface.md index 9ba2fa4b..a08d950c 100644 --- a/help/procedures/StopApplicationServers/postface.md +++ b/help/procedures/StopApplicationServers/postface.md @@ -1,7 +1,7 @@ ### Stop Application Servers -To Stop Application Servers in Flow interface, do these steps: +To Stop Application Servers in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StopCluster/postface.md b/help/procedures/StopCluster/postface.md index b9ec69f3..d13e279d 100644 --- a/help/procedures/StopCluster/postface.md +++ b/help/procedures/StopCluster/postface.md @@ -1,7 +1,7 @@ ### Stop Cluster -To Stop Cluster in Flow interface, do these steps: +To Stop Cluster in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StopDeploymentManager/postface.md b/help/procedures/StopDeploymentManager/postface.md index 06b45682..180c40a4 100644 --- a/help/procedures/StopDeploymentManager/postface.md +++ b/help/procedures/StopDeploymentManager/postface.md @@ -1,7 +1,7 @@ ### Stop Deployment Manager -To Stop Deployment Manager in Flow interface, do these steps: +To Stop Deployment Manager in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/help/procedures/StopNode/postface.md b/help/procedures/StopNode/postface.md index 3242f796..f7abdee4 100644 --- a/help/procedures/StopNode/postface.md +++ b/help/procedures/StopNode/postface.md @@ -1,7 +1,7 @@ ### Stop Node -To Stop Node in Flow interface, do these steps: +To Stop Node in CloudBees CD interface, do these steps: * Create Pipeline. * Create task. diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 8de08463..90c0f875 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -14,7 +14,7 @@

                            @PLUGIN_KEY@

                            Plugin version @PLUGIN_VERSION@

                            -

                            Revised on April 23, 2020

                            +

                            Revised on May 29, 2020


                            Contents

                            @@ -90,7 +90,7 @@ It works with a number of Web servers including Apache HTTP Server, Netscape Ent It uses port 9060 for connection as the default administration port and port 9080 as the default website publication port. In case you install more WebSphere instances these values will be changed.

                            For more information about WebSphere, go to the WebSphere Home Page.

                            -

                            CloudBees Flow Integration to WebSphere

                            +

                            CloudBees CD Integration to WebSphere

                            You can use this plugin to interact with an IBM WebSphere Server. You can start and stop the server. You can also manage applications within the server (start, @@ -137,7 +137,7 @@ Please refer to this

                          4. Click Create Configuration as per the description of parameters below.
                          5. -

                            Note: After you perform the setup below it is important to make sure that the CloudBees Flow agent machine on which WebSphere runs is registered as a resource that can be pinged. +

                            Note: After you perform the setup below it is important to make sure that the CloudBees CD agent machine on which WebSphere runs is registered as a resource that can be pinged.
                            Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. They reduce repetition of common values, create predefined parameter sets for end users, @@ -154,7 +154,8 @@ and securely store credentials where needed. Each configuration is given a unique name that is entered in designated parameters on procedures that use them.

                            - Configuration Parameters + +

                            Configuration Procedure Parameters

                            @@ -827,7 +828,7 @@ Each configuration is given a unique name that is entered in designated paramete

                            Create Application Server

                            -

                            To Create Application Server in Flow interface, do these steps:

                            +

                            To Create Application Server in CloudBees CD interface, do these steps:

                            • Create Pipeline.
                            • Create task.
                            • @@ -907,7 +908,7 @@ Each configuration is given a unique name that is entered in designated paramete

                              Delete Application Server

                              -

                              To Delete Application Server in Flow interface, do these steps:

                              +

                              To Delete Application Server in CloudBees CD interface, do these steps:

                              • Create Pipeline.
                              • Create task.
                              • @@ -1010,7 +1011,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                Create Application Server Template

                                -

                                To Create Application Server Template in Flow interface, do these steps:

                                +

                                To Create Application Server Template in CloudBees CD interface, do these steps:

                                • Create Pipeline.
                                • Create task.
                                • @@ -1083,7 +1084,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                  Delete Application Server Template

                                  -

                                  To Delete Application Server Template in Flow interface, do these steps:

                                  +

                                  To Delete Application Server Template in CloudBees CD interface, do these steps:

                                  • Create Pipeline.
                                  • Create task.
                                  • @@ -1283,7 +1284,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                    Create Cluster

                                    -

                                    To Create Cluster in Flow interface, do these steps:

                                    +

                                    To Create Cluster in CloudBees CD interface, do these steps:

                                    • Create Pipeline.
                                    • Create task.
                                    • @@ -1359,7 +1360,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                      Delete Cluster

                                      -

                                      To Delete Cluster in Flow interface, do these steps:

                                      +

                                      To Delete Cluster in CloudBees CD interface, do these steps:

                                      • Create Pipeline.
                                      • Create task.
                                      • @@ -1437,7 +1438,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                        Export Application Server

                                        -

                                        To Export Application Server in Flow interface, do these steps:

                                        +

                                        To Export Application Server in CloudBees CD interface, do these steps:

                                        • Create Pipeline.
                                        • Create task.
                                        • @@ -1553,7 +1554,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                          Import Application Server

                                          -

                                          To Import Application Server in Flow interface, do these steps:

                                          +

                                          To Import Application Server in CloudBees CD interface, do these steps:

                                          • Create Pipeline.
                                          • Create task.
                                          • @@ -1627,7 +1628,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                            List Cluster Members

                                            -

                                            To List Cluster Members in Flow interface, do these steps:

                                            +

                                            To List Cluster Members in CloudBees CD interface, do these steps:

                                            • Create Pipeline.
                                            • Create task.
                                            • @@ -1713,7 +1714,7 @@ Each configuration is given a unique name that is entered in designated paramete

                                              Remove Cluster Members

                                              -

                                              To Remove Cluster Members in Flow interface, do these steps:

                                              +

                                              To Remove Cluster Members in CloudBees CD interface, do these steps:

                                              • Create Pipeline.
                                              • Create task.
                                              • @@ -2047,7 +2048,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                Create First Cluster Member

                                                -

                                                To Create First Cluster Member in Flow interface, do these steps:

                                                +

                                                To Create First Cluster Member in CloudBees CD interface, do these steps:

                                                • Create Pipeline.
                                                • Create task.
                                                • @@ -2141,7 +2142,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                  Create Cluster Members

                                                  -

                                                  To Create Cluster Members in Flow interface, do these steps:

                                                  +

                                                  To Create Cluster Members in CloudBees CD interface, do these steps:

                                                  • Create Pipeline.
                                                  • Create task.
                                                  • @@ -2215,7 +2216,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                    Start Application Servers

                                                    -

                                                    To Start Application Servers in Flow interface, do these steps:

                                                    +

                                                    To Start Application Servers in CloudBees CD interface, do these steps:

                                                    • Create Pipeline.
                                                    • Create task.
                                                    • @@ -2289,7 +2290,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                      Stop Application Servers

                                                      -

                                                      To Stop Application Servers in Flow interface, do these steps:

                                                      +

                                                      To Stop Application Servers in CloudBees CD interface, do these steps:

                                                      • Create Pipeline.
                                                      • Create task.
                                                      • @@ -2365,7 +2366,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                        Start Cluster

                                                        -

                                                        To Start Cluster in Flow interface, do these steps:

                                                        +

                                                        To Start Cluster in CloudBees CD interface, do these steps:

                                                        • Create Pipeline.
                                                        • Create task.
                                                        • @@ -2448,7 +2449,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                          Stop Cluster

                                                          -

                                                          To Stop Cluster in Flow interface, do these steps:

                                                          +

                                                          To Stop Cluster in CloudBees CD interface, do these steps:

                                                          • Create Pipeline.
                                                          • Create task.
                                                          • @@ -2545,7 +2546,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                            Start Deployment Manager

                                                            -

                                                            To Start Deployment Manager in Flow interface, do these steps:

                                                            +

                                                            To Start Deployment Manager in CloudBees CD interface, do these steps:

                                                            • Create Pipeline.
                                                            • Create task.
                                                            • @@ -2642,7 +2643,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                              Stop Deployment Manager

                                                              -

                                                              To Stop Deployment Manager in Flow interface, do these steps:

                                                              +

                                                              To Stop Deployment Manager in CloudBees CD interface, do these steps:

                                                              • Create Pipeline.
                                                              • Create task.
                                                              • @@ -2753,7 +2754,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                                Start Node

                                                                -

                                                                To Start Node in Flow interface, do these steps:

                                                                +

                                                                To Start Node in CloudBees CD interface, do these steps:

                                                                • Create Pipeline.
                                                                • Create task.
                                                                • @@ -2857,7 +2858,7 @@ Next, to make it available on each server it should be propagated to all servers

                                                                  Stop Node

                                                                  -

                                                                  To Stop Node in Flow interface, do these steps:

                                                                  +

                                                                  To Stop Node in CloudBees CD interface, do these steps:

                                                                  • Create Pipeline.
                                                                  • Create task.
                                                                  • @@ -4154,7 +4155,7 @@ report.

                                                                    -

                                                                    To delete JMS Provider in Flow interface, do these steps:

                                                                    +

                                                                    To delete JMS Provider in CloudBees CD interface, do these steps:

                                                                    1. Create Pipeline.
                                                                    2. Create task.
                                                                    3. @@ -4283,7 +4284,7 @@ report.

                                                                      -

                                                                      To create or update JMS Queue in Flow interface, do these steps:

                                                                      +

                                                                      To create or update JMS Queue in CloudBees CD interface, do these steps:

                                                                      1. Create Pipeline.
                                                                      2. Create task.
                                                                      3. @@ -4374,7 +4375,7 @@ report.

                                                                        -

                                                                        To delete JMS Queue in Flow interface, do these steps:

                                                                        +

                                                                        To delete JMS Queue in CloudBees CD interface, do these steps:

                                                                        1. Create Pipeline.
                                                                        2. Create task.
                                                                        3. @@ -4496,7 +4497,7 @@ report.

                                                                          -

                                                                          To create or update JMS Topic in Flow interface, do these steps:

                                                                          +

                                                                          To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                          1. Create Pipeline.
                                                                          2. Create task.
                                                                          3. @@ -4587,7 +4588,7 @@ report.

                                                                            -

                                                                            To delete JMS Topic in Flow interface, do these steps:

                                                                            +

                                                                            To delete JMS Topic in CloudBees CD interface, do these steps:

                                                                            1. Create Pipeline.
                                                                            2. Create task.
                                                                            3. @@ -4721,7 +4722,7 @@ report.

                                                                              -

                                                                              To create or update JMS Topic in Flow interface, do these steps:

                                                                              +

                                                                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                              1. Create Pipeline.
                                                                              2. Create task.
                                                                              3. @@ -4856,7 +4857,7 @@ report.

                                                                                -

                                                                                To create or update WMQ JMS Activation Spec in Flow interface, do these steps:

                                                                                +

                                                                                To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                1. Create Pipeline.
                                                                                2. Create task.
                                                                                3. @@ -4951,7 +4952,7 @@ report.

                                                                                  -

                                                                                  To delete JMS Activation Spec in Flow interface, do these steps:

                                                                                  +

                                                                                  To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                  1. Create Pipeline.
                                                                                  2. Create task.
                                                                                  3. @@ -5081,7 +5082,7 @@ report.

                                                                                    -

                                                                                    To create or update JMS Topic in Flow interface, do these steps:

                                                                                    +

                                                                                    To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                                    1. Create Pipeline.
                                                                                    2. Create task.
                                                                                    3. @@ -5219,7 +5220,7 @@ report.

                                                                                      -

                                                                                      To create or update JMS Topic in Flow interface, do these steps:

                                                                                      +

                                                                                      To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                                      1. Create Pipeline.
                                                                                      2. Create task.
                                                                                      3. @@ -5312,7 +5313,7 @@ report.

                                                                                        -

                                                                                        To delete JMS ConnectionFactory in Flow interface, do these steps:

                                                                                        +

                                                                                        To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

                                                                                        1. Create Pipeline.
                                                                                        2. Create task.
                                                                                        3. @@ -6122,7 +6123,7 @@ A context root for each web module is defined in the application deployment desc

                                                                                        After the job runs, you can view the results, including the following job details:

                                                                                        -
                                                                                                    <p>To check Application State in Flow interface, do these steps:</p>
                                                                                        +
                                                                                                    <p>To check Application State in CloudBees CD interface, do these steps:</p>
                                                                                                     <ol>
                                                                                                         <li>Create Pipeline.</li>
                                                                                                         <li>Create task.</li>
                                                                                        @@ -6390,14 +6391,10 @@ A context root for each web module is defined in the application deployment desc
                                                                                         
                                                                                             

                                                                                        Release Notes

                                                                                        -

                                                                                        @PLUGIN_KEY@ 2.8.0

                                                                                        +

                                                                                        @PLUGIN_KEY@ 2.7.1

                                                                                          -
                                                                                        • Add checking connection while creating a configuration.
                                                                                        • - -
                                                                                        • Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved.
                                                                                        • - -
                                                                                        • Add logging while running "CreateConfiguration".
                                                                                        • +
                                                                                        • Rebranding from "CloudBees Flow" to "CloudBees CD".
                                                                                        diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f8584bd4..dbcc0ced 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -19,7 +19,7 @@ @PLUGIN_KEY@ @PLUGIN_VERSION@ - + WebSphere Application Server configurations.xml EC-WebSphere_help.xml diff --git a/src/main/resources/project/WebSphere/Discovery.pm b/src/main/resources/project/WebSphere/Discovery.pm index dd312dca..297b0b00 100644 --- a/src/main/resources/project/WebSphere/Discovery.pm +++ b/src/main/resources/project/WebSphere/Discovery.pm @@ -7,7 +7,7 @@ C - Discovery routines for WebSphere =head1 DESCRIPTION WebSphere discovery routines, used to discover various installation properties -for WebSphere instance, located at ElectricFlow resource. +for WebSphere instance, located at CloudBees CD resource. =head1 COPYRIGHT From 8ca5242cc3dc155e1ad9211a5571ec20acfe0456 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Mon, 1 Jun 2020 13:36:33 +0300 Subject: [PATCH 05/47] Cleanup old brand --- htdocs/images/CreateConfiguration/1.png | Bin 6926 -> 8207 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/images/CreateConfiguration/1.png b/htdocs/images/CreateConfiguration/1.png index f57133818f217a4798c79f68c39724e07ea50b45..df54ecb144451783454c9ed4472c2e49b7f871cc 100644 GIT binary patch literal 8207 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 LRhcr-yU+gzlr;w- literal 6926 zcmYjW2Rxf=)K71(s;#B86x9}0MQhip#-{eF6|GGYd(U3iETuJ?+M~6FiyASarADbO zQCkrq5i5w8U+BHx_vQEIea?B#dCoaG@5wp;UlOOUtIj~nK??u?7&J9h3;}?P8x-34 z@*k8tld5SFWx3#Os15{F4%}R&Ff<+-=H37R9n0DK0w5#nI%SjEM^i_YdXnzy6@Jke zi)Uy6fFn;+<*9MNBq2N8!xWX?J*Yjrxe(2j+$bIzC%4#jdElSblXn0%gBK0PhTSi| z_PRMVk7=nVCr-IR!F9d|9g}Y1Vwa{3(=4FzY4!7CN}hBUXxh8tLhp3pj|yv($I~Tg zYSjX1?r)rU&Icf#3@DJWhqJIjr`h4)K?Ty|L2?c@>u@^r5V_Qgsi8y&0KB3XqoO&d z#Cna%ZM&yUSA@^mn)ad%-?o(g_?r>uynVvxM2LvGEYlhH_ECU4_Ze}kJS$Kt>FOB? zxY55%!8dt^esP5<2I+sFTFW^-2lOiih)HZUyz z+}^G733ZWG1-P*w2THNFMnsGh@Qi;Yyc( zx#HeuJ{hudZo$eWwJI9e9z`HJ?wA^SX(Fy#aGH56?G2D#)z zmhyQ{i;2_KTXDsE46Wk z)96M(smI&doDK}CsoOM{klWLQ*m`M28Q+8)5J}-jMY_D-NIWYnK#4(DS4fFF z-vE1znyIyalq+VN41=#(G`5{aZS19vkl7miKBs_jeiN??q{IeQw;8Z%Z>QY)zy|ukP-n#})Y__jj-xdU7l^6}Y&AJdR}ey&sv{?FyKLu8QwbdK;O`&at|x!(TUV zyZyx61@c9j6MuXYw2rOd=VgLAO2WUT#Zd*1Iy#JBQ;+{B_MHuQmPWh9D!65Hh;zVF zXZ{rv0wn=;^{mDtAxCdm=ECzf7NvbF*P4Ji!Hc*;;>syz6bz4!R(ESHEH8EGT3G>?H?c{vXDr!yr6K8f)n0!D z#umoUjZPZgOXF`K1S}8D=VoL$PB#X*c;~yAi~}(rm~A&V-|-wTNpDN3DYno3%y zZj+|zjpw5(*XBQZgIX46*h7t^0A-)S-iE*|HWlL+$b0>Bzn{ z8$r>?>zuibSj!|Y1Qnp9H9!OLQU`Myl;Z;_S77x{DUR6WoK0sA!?89s zliP=(cuRbvCm}V)BO9``(&H=w~Ky)tfci)PBn0)UXI(Nj;-erUeIf5R|^Ur_nmUopJfU#@d&EaY6;@Shv30HqZ&(K zQ_<|e;tD^BT?XHOCOs1)0&iYoFw@bH@vSv|KZUOBT!EvII)P@nqog5Iopo80I;u|y z&h?3w@4-r9X;!sCrO%;HjPGZMbOUvN+?SA)8k;Km>T)Nlt1J2jFm@zP^Hj~7dkPqv z<@~`se0s97HJ?9yF)>N65$z%(LCc%Srj8ok+M?lAQM7^Of{M#Z`LzW2qe^(5_)Sj! z+>ac6l+sIf@dd_yyz>#w(w(RyfyGy#Q$KZUrz~To1}aD+hFoHXl<`tfM0~%rST0S& z>()%XfH>}Nc5fmKP(z}&SyO=ht02Xn0}4W#3blCG32Eg3fv43O3WwVShfSY2b?R1m ze?nC2Oji6_(9<kJu2)^bm$dumC>EUB6^>$&xl);6vsEn0xScGiIUs2F(Al&hp=F5{10poyEp%=il+*Rz-U zJNG+BzIteK8`F+^>WQ=$XCa(=$YE-)?I_a#4r8r|>W?ZCo%6J#bgctYvDa;B2`dOx zaEa)P&Y%p@nqiU9iHe;D>pLRngoW1ik!xVg+8=VguK35Q$)-RPku+emd z3f>z;Y41sac?Z(``L)^VzUyL$z7)qMX{gZD?;gZo9WhL~9z576)NTRW=S^{c#S+B> zy27fbyYE(`K9?qzLDR#XgUXIPTOp-ai=U1QHNT{84SK1a`G??|#nbSye~f}kC5r=4 zG#sya%O5A3;rM1Z zkR^%8b?Qqw66G&lX;r=H!w=p12DV)1mfH)Wco=ZtVi3oNllM0wnTeB5qV@Z=&~EYV zY#uW4T{8N8`;f=h=EmvK4ial==}2kKlzvo}Na-1nsjY-s_;vsIsszGD_{*o=SrkiX zo7zXKH5-WLoSV+ApC~w|#;>fd@ZpYO^?vUMm;(S1%Z1g#H?_wINg!PJImWJ&*VwsP zfgy`RJPbbH^|8GyPY$D~QHaV*yJpW?u>-v|G@(Ms2pJ*g#ORgO?>!kwVU02prOP|K zL7EA(W!3Kw%<^L@gUZ_7Logp}=s+MUzMt-sH&2dprQIhc$R~+>W?{xzWcW@oNnxWR za3eIy<{0Uhrbe0blqBU}?OhPEU#cDcaqZX0 z#75XwQq?y_Bn^Yx)md~)j#m?9$X=p=#)X9(QMk!e!(5#zDBhY*oH|hT4MQYtpNd`0 zK?gq#)5j_KW5~%~bC|}rb3AO1jr-DeIj8?O0~6FZ!?J+424n7%n;yS$a^{5me`r@a zQy`oAOrhs`i}Y^Rjk5HCX!_DF1LI%4hyQ;Vh*m_WKA5l4Dcy z=eZ{2|ABTg$AhyyCDYnKuYX~-Bk>dQY!6`Gzf5NPEq1IWU*@OG?iQ!@xm$(2F^s1! zK0A_Q$_i)K-^{pHGJ49UX;IBSF1vX>Y^kMm14!L-8{vg`5V?4;rgXfzSu%e;cq9g${2Ys5R#JUS2c#cd?km>Kcl^il-hUqSahm)B z0`K_tAUXbtydS@9(xnymI{45xKE$3IJGUp0F6Ka6_9;(X>3t3P-h~hxG^ZxgM&v(* z2>x_?;$0#j5uzADlT-62Nc2AmuvA?tw`c%h-n;y9`Yp1b^X(P4)Boc9fs!*)T27Dt zEe@r7U;NxLlQ#K)rT-g`I()!iOY!KCP45n`~idoK|$sV`-#EcK;;8myEnqgX% z;UrNV6O=|fY-KyREZTPD#rv&xP*FRU_GICL`QY+LkNb&j>0$G@KwzwZAD3}68j8w9Gkdo(x-ZFef z=soH{>DG_YmDQFfOJS_3o=MIo8w`Tsqw0y^2NMz9rs}F0X7rgV5c!DW>%o=VLBi&h zDQ2QDv)Ce*;9uLi;Nw8z^5djQS|)D!5-mo`ZNLzdL5t>xG;d$(a8yCl_`I)WuhcEu z9+JIiFPJ%~dimG&w!u%&j<>g*Dx3ZCQC?(Yaub-nR~Zw z6DQFUtfMtq+Q8PljwM!j(A~1sAgRAy%|P{%uLX5l{y^Qx9RNaQ@Ed^1* ziYq0h%R-6e9hGQ^u%qmrgf-*+fP#fjr8&Net_9koo+&P1?v7=GY2ey~2pE_+MN zLD+xB4|;FUM5fNhb@ZN5)LC|_xc?1KuH!J;B);l&-bAy#pL+R4%=j+ zthN=n$*oz6by0w3*QY;F$f)jWVO5S1UnncpwQdv=mH-;C7uk~t%J`P!D^2A&Vlaqn zv%<7A@%Lq`>wHQLejCSnu*+0dt@L9EDpRHE^Tr!8v+!Cw<=I(TBQ;lx*tjhB! znjdEELXfgZD!i*c;bdu8;nb&NB)laoZn6&T$z7KwqqlYbUGOpxo{NB6#N98iiSucW#|s^mc9rL4B12S(oH9xJH8)(cR&iS*TaKS_{F3u-J0GsqZ1$5s=>V<7^I zVxA++a8IfjjZ&>#j~yPC*00(dv#dP`1;)lSD8>bSC0_5AK@N-_>e7i5Zw_}1N zi)NLdoJiuX1iuO@EumhapMT%4{%dT?!AIqM7G4~?2@9P_RFuhBqT=r7qFzJ z?{WwG_%lzAXHL({k4DTrNwzfGWfqUxA20j92D5Q%SBYoW>0W#LC7b@kTj5TtnC74+ zW^D;mW&eW1JUxuvs$Bul#Fe!y{Hfi3%Ve^i!bgehj46|_)r!X88@+t@`Ha2%2hs-? ziqzH+1eX|m2NU*95xfRp%VNobzM5$ss$6-6*>fo?Cpd22;;UnK%io&Q&+*p2T1{&I(X_9@bb0i&Cp;1JzNRaGX#_GzvUXO7fz|C6O0$aN+dUg2=~bK#iPxo zAmaGcU+!Gx_wA6pdC;#5bVFwz`-QD zK9KQO^sPu+Bxs_E<+e{sra35-#Fd)YwfnWmd_7{o^9{z;QYfTV(oFQ*k^+0Q=uW`I zvx$sNc;1uY$vTe|g`JzyR)C9djDhP^)>lXAw};q^B5UGfVHzwvJH#>jr*zp69d|a|2Yu_o)9CQ|L>rd(E){aXX~1?m0~|YZ)QYT2f_8I+@PjL-h3g z-8a+>*jigTgPWRzgQYKVG>#T$3BFTXitYmH={0OFx4d zzn3th*XmiUU$4lIP5AZYMp^6e1bNg##%A#I3;kf z@YYe($bJy3>zLI|wyyC+pK)3i_hXo?v|LfSKAg!W)qXY<-Tn4QaHP4O|C+ZIAAK|! zS@-aZ7Ux9kTYT-WLgD;dOrCLZ4xO7gyV$>ksCR^inwB&a7js*#^(=SXc51ZF%W)f> zaC>B{pjy}i@~eo+VhnJ+8gwrovRp8_s3_o5SP~tGd!|_1m->@hG)tt?pQ<{^ zE#WK2j0LUPADOw)29{7k1LyE$d@T7WNddQD?H>XSBIm}nJnmQR5*qDaiOOFvlPUJ0 zw^`G6&SUH_Pmp$mbuR}_f6N*x~hq>0#AcykMzBv|yyZNzHP^b_AEJ3&id)bZZ zDs)!U;2=G9F2!4sx4+c+T5gQ_$%X|fa1yybHfDK3J3Z!iE=h7}j**!c*B{W2VLlb- zo28oG)u87geyD;QLdqyEIBQBu-)01NAD>uIbdl$eCC&5=53?*QgcTdGg}iJj z&*vp36Ho#tD4^!P`W*cz5SLsI=|9qWIQlesb+}X$0}j|v=B^r=Fht*Z6ZcAAveqig zf7UoZryo{s+2{qAwjQWaF Date: Mon, 1 Jun 2020 16:28:24 +0300 Subject: [PATCH 06/47] Change version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c94b855c..f89ae921 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { group = 'com.electriccloud' description = 'Plugins : EC-WebSphere' -version = '2.8.0' +version = '2.7.1' apply plugin: 'flow-gradle-plugin' apply plugin: 'license' From f88f9666a3b93e10b3cbcf0bdd56732dd8732db4 Mon Sep 17 00:00:00 2001 From: Andrii Pravorskyi Date: Wed, 17 Jun 2020 15:16:26 +0300 Subject: [PATCH 07/47] Docs: avoid framing text in "code" and "pre" tags --- help/procedures/CheckApp/postface.md | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/help/procedures/CheckApp/postface.md b/help/procedures/CheckApp/postface.md index bfd3432e..2a7c563d 100644 --- a/help/procedures/CheckApp/postface.md +++ b/help/procedures/CheckApp/postface.md @@ -1,25 +1,25 @@

                                                                                        Checking Application State

                                                                                        To check Application State, do these steps:

                                                                                        -
                                                                                          -
                                                                                        1. Create procedure.
                                                                                        2. -
                                                                                        3. Create step, choose Plugin, choose CheckApp from procedures picker.
                                                                                        4. -
                                                                                        5. Enter the following parameters:
                                                                                        6. -
                                                                                        -

                                                                                        After the job runs, you can view the results, including the following job details:

                                                                                        - +
                                                                                          +
                                                                                        1. Create procedure.
                                                                                        2. +
                                                                                        3. Create step, choose Plugin, choose CheckApp from procedures picker.
                                                                                        4. +
                                                                                        5. Enter the following parameters:
                                                                                        6. +
                                                                                        +

                                                                                        After the job runs, you can view the results, including the following job details:

                                                                                        + -

                                                                                        To check Application State in CloudBees CD interface, do these steps:

                                                                                        -
                                                                                          -
                                                                                        1. Create Pipeline.
                                                                                        2. -
                                                                                        3. Create task.
                                                                                        4. -
                                                                                        5. In task definition choose Plugin and choose following parameters:

                                                                                        6. -
                                                                                        7. Click on arrow.
                                                                                        8. -
                                                                                        9. Enter the following parameters:
                                                                                        10. -
                                                                                        -

                                                                                        After the pipeline runs, you can view the results, including the following step details:

                                                                                        - -

                                                                                        In the CheckApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                                                                                        - \ No newline at end of file +

                                                                                        To check Application State in CloudBees CD interface, do these steps:

                                                                                        +
                                                                                          +
                                                                                        1. Create Pipeline.
                                                                                        2. +
                                                                                        3. Create task.
                                                                                        4. +
                                                                                        5. In task definition choose Plugin and choose following parameters:

                                                                                        6. +
                                                                                        7. Click on arrow.
                                                                                        8. +
                                                                                        9. Enter the following parameters:
                                                                                        10. +
                                                                                        +

                                                                                        After the pipeline runs, you can view the results, including the following step details:

                                                                                        + +

                                                                                        In the CheckApp step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report.

                                                                                        + \ No newline at end of file From a5b662cfbc209e787f942c2e4eaa32b637abc05e Mon Sep 17 00:00:00 2001 From: Andrii Pravorskyi Date: Wed, 17 Jun 2020 15:19:26 +0300 Subject: [PATCH 08/47] Docs: rebranding --- .../CreateOrUpdateJMSQueue/postface.md | 2 +- .../CreateOrUpdateJMSTopic/postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../postface.md | 2 +- .../DeleteJMSActivationSpec/postface.md | 2 +- .../DeleteJMSConnectionFactory/postface.md | 2 +- help/procedures/DeleteJMSProvider/postface.md | 2 +- help/procedures/DeleteJMSQueue/postface.md | 2 +- help/procedures/DeleteJMSTopic/postface.md | 2 +- pages/EC-WebSphere_help.xml | 69 +++++++++---------- 12 files changed, 45 insertions(+), 46 deletions(-) diff --git a/help/procedures/CreateOrUpdateJMSQueue/postface.md b/help/procedures/CreateOrUpdateJMSQueue/postface.md index c65030b5..81f00038 100644 --- a/help/procedures/CreateOrUpdateJMSQueue/postface.md +++ b/help/procedures/CreateOrUpdateJMSQueue/postface.md @@ -1,5 +1,5 @@

                                                                                        Create or update JMS Queue

                                                                                        -

                                                                                        To create or update JMS Queue in Commander interface, do these steps:

                                                                                        +

                                                                                        To create or update JMS Queue in CloudBees CD interface, do these steps:

                                                                                        1. Create procedure.
                                                                                        2. Create step, choose Plugin, choose CreateOrUpdateJMSQueue from diff --git a/help/procedures/CreateOrUpdateJMSTopic/postface.md b/help/procedures/CreateOrUpdateJMSTopic/postface.md index 0000744f..4498f0fe 100644 --- a/help/procedures/CreateOrUpdateJMSTopic/postface.md +++ b/help/procedures/CreateOrUpdateJMSTopic/postface.md @@ -1,5 +1,5 @@

                                                                                          Create or update JMS Topic

                                                                                          -

                                                                                          To create or update JMS Topic in Commander interface, do these steps:

                                                                                          +

                                                                                          To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                                          1. Create procedure.
                                                                                          2. Create step, choose Plugin, choose CreateOrUpdateJMSTopic from diff --git a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md index 4a0b5e67..952c1390 100644 --- a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md @@ -1,5 +1,5 @@

                                                                                            Create or update SIB JMS Activation Spec

                                                                                            -

                                                                                            To create or update JMS Activation Spec in Commander interface, do these steps:

                                                                                            +

                                                                                            To create or update JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                            1. Create procedure.
                                                                                            2. Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from diff --git a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md index 73d13185..cb6327b4 100644 --- a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md @@ -1,5 +1,5 @@

                                                                                              Create or update SIB JMS Connection Factory

                                                                                              -

                                                                                              To create or update SIB JMS Connection Factory in Commander interface, do these steps:

                                                                                              +

                                                                                              To create or update SIB JMS Connection Factory in CloudBees CD interface, do these steps:

                                                                                              1. Create procedure.
                                                                                              2. Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from diff --git a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md index a72c9311..bac0950c 100644 --- a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md @@ -1,5 +1,5 @@

                                                                                                Create or update WMQ JMS Activation Spec

                                                                                                -

                                                                                                To create or update WMQ JMS Activation Spec in Commander interface, do these steps:

                                                                                                +

                                                                                                To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                                1. Create procedure.
                                                                                                2. Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from diff --git a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md index 24eee8ba..973bdb37 100644 --- a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md @@ -1,5 +1,5 @@

                                                                                                  Create or update WMQ JMS Connection Factory

                                                                                                  -

                                                                                                  To create or update WMQ JMS Connection Factory in Commander interface, do these steps:

                                                                                                  +

                                                                                                  To create or update WMQ JMS Connection Factory in CloudBees CD interface, do these steps:

                                                                                                  1. Create procedure.
                                                                                                  2. Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from diff --git a/help/procedures/DeleteJMSActivationSpec/postface.md b/help/procedures/DeleteJMSActivationSpec/postface.md index e51fcc8a..2848bea7 100644 --- a/help/procedures/DeleteJMSActivationSpec/postface.md +++ b/help/procedures/DeleteJMSActivationSpec/postface.md @@ -1,5 +1,5 @@

                                                                                                    Delete JMS Activation Spec

                                                                                                    -

                                                                                                    To delete JMS Activation Spec in Commander interface, do these steps:

                                                                                                    +

                                                                                                    To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                                    1. Create procedure.
                                                                                                    2. Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures diff --git a/help/procedures/DeleteJMSConnectionFactory/postface.md b/help/procedures/DeleteJMSConnectionFactory/postface.md index 6b3708a3..4a7bc221 100644 --- a/help/procedures/DeleteJMSConnectionFactory/postface.md +++ b/help/procedures/DeleteJMSConnectionFactory/postface.md @@ -1,5 +1,5 @@

                                                                                                      Delete JMS ConnectionFactory

                                                                                                      -

                                                                                                      To delete JMS ConnectionFactory in Commander interface, do these steps:

                                                                                                      +

                                                                                                      To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

                                                                                                      1. Create procedure.
                                                                                                      2. Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures diff --git a/help/procedures/DeleteJMSProvider/postface.md b/help/procedures/DeleteJMSProvider/postface.md index 17fe2786..a058d6da 100644 --- a/help/procedures/DeleteJMSProvider/postface.md +++ b/help/procedures/DeleteJMSProvider/postface.md @@ -1,5 +1,5 @@

                                                                                                        Delete JMS Provider

                                                                                                        -

                                                                                                        To delete JMS Provider in Commander interface, do these steps:

                                                                                                        +

                                                                                                        To delete JMS Provider in CloudBees CD interface, do these steps:

                                                                                                        1. Create procedure.
                                                                                                        2. Create step, choose Plugin, choose DeleteJMSProvider from procedures diff --git a/help/procedures/DeleteJMSQueue/postface.md b/help/procedures/DeleteJMSQueue/postface.md index 8c9d98bf..9e1a00ae 100644 --- a/help/procedures/DeleteJMSQueue/postface.md +++ b/help/procedures/DeleteJMSQueue/postface.md @@ -1,5 +1,5 @@

                                                                                                          Delete JMS Queue

                                                                                                          -

                                                                                                          To delete JMS Queue in Commander interface, do these steps:

                                                                                                          +

                                                                                                          To delete JMS Queue in CloudBees CD interface, do these steps:

                                                                                                          1. Create procedure.
                                                                                                          2. Create step, choose Plugin, choose DeleteJMSQueue from procedures diff --git a/help/procedures/DeleteJMSTopic/postface.md b/help/procedures/DeleteJMSTopic/postface.md index 165829bb..4d967e77 100644 --- a/help/procedures/DeleteJMSTopic/postface.md +++ b/help/procedures/DeleteJMSTopic/postface.md @@ -1,5 +1,5 @@

                                                                                                            Delete JMS Topic

                                                                                                            -

                                                                                                            To delete JMS Topic in Commander interface, do these steps:

                                                                                                            +

                                                                                                            To delete JMS Topic in CloudBees CD interface, do these steps:

                                                                                                            1. Create procedure.
                                                                                                            2. Create step, choose Plugin, choose DeleteJMSTopic from procedures diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 90c0f875..e809508c 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -14,7 +14,7 @@

                                                                                                              @PLUGIN_KEY@

                                                                                                              Plugin version @PLUGIN_VERSION@

                                                                                                              -

                                                                                                              Revised on May 29, 2020

                                                                                                              +

                                                                                                              Revised on June 17, 2020


                                                                                                              Contents

                                                                                                              @@ -4144,7 +4144,7 @@ report.

                                                                                                              Create or update JMS Queue

                                                                                                              -

                                                                                                              To create or update JMS Queue in Commander interface, do these steps:

                                                                                                              +

                                                                                                              To create or update JMS Queue in CloudBees CD interface, do these steps:

                                                                                                              1. Create procedure.
                                                                                                              2. Create step, choose Plugin, choose CreateOrUpdateJMSQueue from @@ -4364,7 +4364,7 @@ report.

                                                                                                                Create or update JMS Topic

                                                                                                                -

                                                                                                                To create or update JMS Topic in Commander interface, do these steps:

                                                                                                                +

                                                                                                                To create or update JMS Topic in CloudBees CD interface, do these steps:

                                                                                                                1. Create procedure.
                                                                                                                2. Create step, choose Plugin, choose CreateOrUpdateJMSTopic from @@ -4577,7 +4577,7 @@ report.

                                                                                                                  Create or update SIB JMS Activation Spec

                                                                                                                  -

                                                                                                                  To create or update JMS Activation Spec in Commander interface, do these steps:

                                                                                                                  +

                                                                                                                  To create or update JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                                                  1. Create procedure.
                                                                                                                  2. Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from @@ -4846,7 +4846,7 @@ report.

                                                                                                                    Delete JMS Activation Spec

                                                                                                                    -

                                                                                                                    To delete JMS Activation Spec in Commander interface, do these steps:

                                                                                                                    +

                                                                                                                    To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                                                                                                                    1. Create procedure.
                                                                                                                    2. Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures @@ -5071,7 +5071,7 @@ report.

                                                                                                                      Create or update WMQ JMS Connection Factory

                                                                                                                      -

                                                                                                                      To create or update WMQ JMS Connection Factory in Commander interface, do these steps:

                                                                                                                      +

                                                                                                                      To create or update WMQ JMS Connection Factory in CloudBees CD interface, do these steps:

                                                                                                                      1. Create procedure.
                                                                                                                      2. Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from @@ -5302,7 +5302,7 @@ report.

                                                                                                                        -
                                                                                                                      -

                                                                                                                      After the job runs, you can view the results, including the following job details:

                                                                                                                      - -
                                                                                                                                  <p>To check Application State in CloudBees CD interface, do these steps:</p>
                                                                                                                      -            <ol>
                                                                                                                      -                <li>Create Pipeline.</li>
                                                                                                                      -                <li>Create task.</li>
                                                                                                                      -                <li>In task definition choose Plugin and choose following parameters:<p><img src="../../plugins/EC-WebSphere/images/CheckApp/PipelinePicker.png" /></p></li>
                                                                                                                      -                <li>Click on arrow.</li>
                                                                                                                      -                <li>Enter the following parameters: </li><img src="../../plugins/EC-WebSphere/images/CheckApp/PipelineConfig.png" />
                                                                                                                      -            </ol>
                                                                                                                      -            <p>After the pipeline runs, you can view the results, including the following step details:</p>
                                                                                                                      -            <img src="../../plugins/EC-WebSphere/images/CheckApp/PipelineResult.png" />
                                                                                                                      -            <p>In the <b>CheckApp</b> step, click the Log icon
                                                                                                                      -            to see the diagnostic information. The output is similar to
                                                                                                                      -            the following diagnostic
                                                                                                                      -            report.</p>
                                                                                                                      -            <img src="../../plugins/EC-WebSphere/images/CheckApp/ProcedureLog.png" />
                                                                                                                      -
                                                                                                                      +
                                                                                                                        +
                                                                                                                      1. Create procedure.
                                                                                                                      2. +
                                                                                                                      3. Create step, choose Plugin, choose CheckApp from procedures picker.
                                                                                                                      4. +
                                                                                                                      5. Enter the following parameters:
                                                                                                                      6. +
                                                                                                                      +

                                                                                                                      After the job runs, you can view the results, including the following job details:

                                                                                                                      + +

                                                                                                                      To check Application State in CloudBees CD interface, do these steps:

                                                                                                                      +
                                                                                                                        +
                                                                                                                      1. Create Pipeline.
                                                                                                                      2. +
                                                                                                                      3. Create task.
                                                                                                                      4. +
                                                                                                                      5. In task definition choose Plugin and choose following parameters:

                                                                                                                      6. +
                                                                                                                      7. Click on arrow.
                                                                                                                      8. +
                                                                                                                      9. Enter the following parameters:
                                                                                                                      10. +
                                                                                                                      +

                                                                                                                      After the pipeline runs, you can view the results, including the following step details:

                                                                                                                      + +

                                                                                                                      In the CheckApp step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report.

                                                                                                                      +

                                                                                                                      From 40f872f45e12a0ad20d8d3330dacdcfce845d424 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Mon, 13 Jul 2020 19:13:17 +0300 Subject: [PATCH 09/47] EC-WebSphere Create Configuration violates FLOWPLUGIN-7900 --- build.gradle | 2 +- cgi-bin/websphereMonitor.cgi | 86 +++--- help/changelog.yaml | 6 +- .../ConfigurationManagementFactory.java | 42 +-- .../client/EditConfigPropertySheetEditor.java | 213 ++++++++++++++ .../websphere/client/JobUtilities.java | 47 +++ .../resources/project/WebSphere/WebSphere.pm | 2 +- .../project/WebSphereCreateConfigForm.xml | 52 +++- .../project/WebSphereEditConfigForm.xml | 51 +++- .../project/conf/attemptConnection.pl | 221 ++++++++++++++ src/main/resources/project/conf/createcfg.pl | 23 +- src/main/resources/project/conf/deletecfg.pl | 13 +- src/main/resources/project/manifest.xml | 10 +- src/main/resources/project/project.xml | 273 ++++++++++++++++++ 14 files changed, 942 insertions(+), 99 deletions(-) create mode 100644 src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java create mode 100644 src/main/java/ecplugins/websphere/client/JobUtilities.java create mode 100644 src/main/resources/project/conf/attemptConnection.pl diff --git a/build.gradle b/build.gradle index f89ae921..c94b855c 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { group = 'com.electriccloud' description = 'Plugins : EC-WebSphere' -version = '2.7.1' +version = '2.8.0' apply plugin: 'flow-gradle-plugin' apply plugin: 'license' diff --git a/cgi-bin/websphereMonitor.cgi b/cgi-bin/websphereMonitor.cgi index e9bfa81d..94f1feae 100644 --- a/cgi-bin/websphereMonitor.cgi +++ b/cgi-bin/websphereMonitor.cgi @@ -22,7 +22,6 @@ use constant { ERROR => 1, }; - my $gTimeout = 20; ################################ @@ -38,55 +37,57 @@ my $gTimeout = 20; sub main { # Get CGI args - my $cgi = new CGI; + my $cgi = CGI->new(); my $cgiArgs = $cgi->Vars; - + # Check for required args my $jobId = $cgiArgs->{jobId}; if (!defined $jobId || "$jobId" eq "") { reportError($cgi, "jobId is a required parameter"); } - + # Wait for job - my $ec = new ElectricCommander({abortOnError => 0}); + my $ec = ElectricCommander->new({abortOnError => 0}); + $ec->abortOnError(0); my $xpath = $ec->waitForJob($jobId, $gTimeout); my $errors = $ec->checkAllErrors($xpath); - + if ("$errors" ne "") { reportError($cgi, $errors); } - + my $status = $xpath->findvalue("//status"); if ("$status" ne "completed") { - + # Abort job and report failure abortJobAndReportError($cgi, $ec, $jobId); } - + my $outcome = $xpath->findvalue("//outcome"); if ("$outcome" ne "success") { - + # Report job errors reportJobErrors($cgi, $ec, $jobId); } - - # If the job was successful and the debug flag is not set, delete it - my $debug = $cgiArgs->{debug}; - if (!defined $debug || "$debug" ne "1") { - $ec->deleteJob($jobId); - } - + + # + # # If the job was successful and the debug flag is not set, delete it + # my $debug = $cgiArgs->{debug}; + # if (!defined $debug || "$debug" ne "1") { + # $ec->deleteJob($jobId); + # } + # Report the job's success reportSuccess($cgi); -} +} ## end sub main ################################ # abortJobAndReportError - Abort the job and report the timeout error. # # Arguments: -# cgi +# cgi # ec - ElectricCommander instance -# jobId - int identifier for the job +# jobId - int identifier for the job # # Returns: # - @@ -94,39 +95,39 @@ sub main { ################################ sub abortJobAndReportError($$$) { my ($cgi, $ec, $jobId) = @_; - + my $errMsg = "Aborting job after reaching timeout"; - + # Try to abort the job - my $xpath = $ec->abortJob($jobId); + my $xpath = $ec->abortJob($jobId); my $errors = $ec->checkAllErrors($xpath); if ("$errors" ne "") { reportError($cgi, $errMsg . "\n" . $errors); } - + # Wait for the job to finish aborting $xpath = $ec->waitForJob($jobId, $gTimeout); $errors = $ec->checkAllErrors($xpath); if ("$errors" ne "") { reportError($cgi, $errMsg . "\n" . $errors); } - + # Check to see if the job actually aborted my $status = $xpath->findvalue("//status"); if ("$status" ne "completed") { reportError($cgi, $errMsg . "\nJob still running after abort"); } - + reportError($cgi, $errMsg . "\nJob successfully aborted"); -} +} ## end sub abortJobAndReportError($$$) ################################ # reportJobErrors - Look for errors in the job to report. # # Arguments: -# cgi +# cgi # ec - ElectricCommander instance -# jobId - int identifier for the job +# jobId - int identifier for the job # # Returns: # - @@ -134,37 +135,42 @@ sub abortJobAndReportError($$$) { ################################ sub reportJobErrors($$$) { my ($cgi, $ec, $jobId) = @_; - + # Get job details - my $xpath = $ec->getJobDetails($jobId); + my $xpath = $ec->getJobDetails($jobId); my $errors = $ec->checkAllErrors($xpath); if ("$errors" ne "") { reportError($cgi, $errors); } - + # Look for configError first my $configError = $xpath->findvalue("//job/propertySheet/property[propertyName='configError']/value"); if (defined $configError && "$configError" ne "") { reportError($cgi, $configError) } - + # Find the first error message and report it my @errorMessages = $xpath->findnodes("//errorMessage"); if (@errorMessages > 0) { my $firstMessage = $errorMessages[0]->string_value(); reportError($cgi, $firstMessage); } - + # Report a generic error message if we couldn't find a specific one on the # job - reportError($cgi, "Configuration creation failed"); -} + if ($procedureName && $procedureName eq 'EditConfiguration') { + reportError($cgi, "Edit configuration failed"); + } + else { + reportError($cgi, "Configuration creation failed"); + } +} ## end sub reportJobErrors($$$) ################################ # reportError - Print the error message and exit. # # Arguments: -# cgi +# cgi # error - string to print # # Returns: @@ -174,7 +180,7 @@ sub reportJobErrors($$$) { ################################ sub reportError($$) { my ($cgi, $error) = @_; - + print $cgi->header("text/html"); print $error; exit ERROR; @@ -184,7 +190,7 @@ sub reportError($$) { # reportSuccess - Report success. # # Arguments: -# cgi +# cgi # # Returns: # - @@ -192,7 +198,7 @@ sub reportError($$) { ################################ sub reportSuccess($) { my ($cgi) = @_; - + print $cgi->header("text/html"); print "Success"; } diff --git a/help/changelog.yaml b/help/changelog.yaml index 4e5a8162..e96918fd 100644 --- a/help/changelog.yaml +++ b/help/changelog.yaml @@ -1,3 +1,7 @@ +3.8.0: + - Add checking connection while creating a configuration. + - Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved. + - Add logging while running "CreateConfiguration". 2.7.1: - Rebranding from "CloudBees Flow" to "CloudBees CD". 2.7.0: @@ -195,4 +199,4 @@ - The absolute path of executable files now requires the path and filename with an extension. 1.1.0: - RunCustomJob procedure has been added. - + diff --git a/src/main/java/ecplugins/websphere/client/ConfigurationManagementFactory.java b/src/main/java/ecplugins/websphere/client/ConfigurationManagementFactory.java index 29d9b8dc..c402925d 100644 --- a/src/main/java/ecplugins/websphere/client/ConfigurationManagementFactory.java +++ b/src/main/java/ecplugins/websphere/client/ConfigurationManagementFactory.java @@ -1,24 +1,9 @@ -/** - * Copyright 2015 Electric Cloud, Inc. - * - * 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. - */ // ConfigurationManagementFactory.java -- // // ConfigurationManagementFactory.java is part of ElectricCommander. // -// Copyright (c) 2005-2011 Electric Cloud, Inc. +// Copyright (c) 2005-2012 Electric Cloud, Inc. // All rights reserved. // @@ -26,13 +11,13 @@ import ecinternal.client.InternalComponentBaseFactory; import ecinternal.client.InternalFormBase; -import ecinternal.client.PropertySheetEditor; import com.electriccloud.commander.gwt.client.BrowserContext; import com.electriccloud.commander.gwt.client.Component; import com.electriccloud.commander.gwt.client.ComponentContext; import org.jetbrains.annotations.NotNull; +import ecplugins.websphere.client.EditConfigPropertySheetEditor; import static com.electriccloud.commander.gwt.client.util.CommanderUrlBuilder.createPageUrl; public class ConfigurationManagementFactory @@ -51,16 +36,21 @@ public class ConfigurationManagementFactory component = new CreateConfiguration(); } else if ("edit".equals(panel)) { - String configName = BrowserContext.getInstance() - .getGetParameter("configName"); - String propSheetPath = "/plugins/" + getPluginName() - + "/project/websphere_cfgs/" + configName; - String formXmlPath = "/plugins/" + getPluginName() - + "/project/ui_forms/WebSphereEditConfigForm"; + String configName = BrowserContext.getInstance().getGetParameter("configName"); + String projectName = "/plugins/" + getPluginName() + "/project"; + String propSheetPath = projectName + "/websphere_cfgs/" + configName; - component = new PropertySheetEditor("ecgc", - "Edit WebSphere Configuration", configName, propSheetPath, - formXmlPath, getPluginName()); + String formXmlPath = "/plugins/" + getPluginName() + "/project/ui_forms/WebSphereEditConfigForm"; + + component = new EditConfigPropertySheetEditor( + "ecgc", + "Edit WebSphere Configuration", + configName, + propSheetPath, + formXmlPath, + projectName, + getPluginName() + ); ((InternalFormBase) component).setDefaultRedirectToUrl( createPageUrl(getPluginName(), "configurations").buildString()); diff --git a/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java b/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java new file mode 100644 index 00000000..29cc2100 --- /dev/null +++ b/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java @@ -0,0 +1,213 @@ +// EditConfigPropertySheetEditor.java -- +// +// EditConfigPropertySheetEditor.java is part of ElectricCommander. +// +// Copyright (c) 2005-2017 Electric Cloud, Inc. +// All rights reserved. +// + +package ecplugins.websphere.client; + +import java.util.Collection; +import java.util.Map; + +import com.google.gwt.http.client.Request; +import com.google.gwt.http.client.RequestCallback; +import com.google.gwt.http.client.RequestException; +import com.google.gwt.http.client.Response; +import com.google.gwt.user.client.ui.Anchor; + +import com.electriccloud.commander.client.domain.Procedure; +import com.electriccloud.commander.client.requests.GetProcedureRequest; +import com.electriccloud.commander.client.requests.RunProcedureRequest; +import com.electriccloud.commander.client.responses.CommanderError; +import com.electriccloud.commander.client.responses.DefaultProcedureCallback; +import com.electriccloud.commander.client.responses.DefaultRunProcedureResponseCallback; +import com.electriccloud.commander.client.responses.RunProcedureResponse; +import com.electriccloud.commander.gwt.client.ui.CredentialEditor; +import com.electriccloud.commander.gwt.client.ui.FormBuilder; +import com.electriccloud.commander.gwt.client.ui.SimpleErrorBox; +import com.electriccloud.commander.gwt.client.util.CommanderUrlBuilder; + +import ecinternal.client.PropertySheetEditor; +import ecplugins.websphere.client.JobUtilities; + +import static com.electriccloud.commander.gwt.client.util.CommanderUrlBuilder.createUrl; + +public class EditConfigPropertySheetEditor + extends PropertySheetEditor +{ + + //~ Instance fields -------------------------------------------------------- + + private String m_pluginName; + private String m_configName; + + //~ Constructors ----------------------------------------------------------- + + public EditConfigPropertySheetEditor( + String idPrefix, + String mainTitle, + String secondaryTitle, + String propertySheetPath) + { + super(idPrefix, mainTitle, secondaryTitle, propertySheetPath); + } + + public EditConfigPropertySheetEditor( + String idPrefix, + String mainTitle, + String configName, + String propertySheetPath, + String formDefinitionXmlPath, + String formCredentialProject, + String pluginName) + { + super(idPrefix, mainTitle, configName, propertySheetPath, + formDefinitionXmlPath, formCredentialProject); + m_configName = configName; + m_pluginName = pluginName; + } + + //~ Methods ---------------------------------------------------------------- + + @Override public void clearStatus() + { + super.clearStatus(); + getFormTable().removeRow("config"); + } + + @Override protected void submit() + { + setStatus("Saving..."); + clearAllErrors(); + + GetProcedureRequest getProcedureRequest = getRequestFactory() + .createGetProcedureRequest(); + + getProcedureRequest.setProjectName(m_pluginName); + getProcedureRequest.setProcedureName("EditConfiguration"); + getProcedureRequest.setCallback(new DefaultProcedureCallback( + getCommanderErrorHandler()) { + @Override public void handleError(CommanderError error) + { + if (error.getCode() + .equals("NoSuchProcedure")) { + + // procedure doesn't exist, so, it is fine. + EditConfigPropertySheetEditor.super.submit(); + } + else { + addErrorMessage(error); + } + } + + @Override public void handleResponse(Procedure response) + { + FormBuilder fb = (FormBuilder) + getFormTable(); + Map params = fb.getValues(); + Collection credentialParams = + fb.getCredentialIds(); + RunProcedureRequest request = getRequestFactory() + .createRunProcedureRequest(); + if (!fb.validate()) { + clearStatus(); + + return; + } + request.setProjectName( + "/plugins/" + m_pluginName + "/project"); + request.setProcedureName("EditConfiguration"); + request.addActualParameter("config", m_configName); + + for (String paramName : params.keySet()) { + + if (credentialParams.contains(paramName)) { + CredentialEditor credential = fb.getCredential( + paramName); + + request.addCredentialParameter(paramName, + credential.getUsername(), + credential.getPassword()); + } + else { + request.addActualParameter(paramName, + params.get(paramName)); + } + } + + request.setCallback( + new DefaultRunProcedureResponseCallback(this) { + @Override public void handleResponse( + RunProcedureResponse response) + { + + if (getLog().isDebugEnabled()) { + getLog().debug( + "Commander runProcedure request returned job id: " + + response.getJobId()); + } + + waitForJob(response.getJobId()); + } + }); + doRequest(request); + } + }); + doRequest(getProcedureRequest); + } + + private void waitForJob(final String jobId) + { + RequestCallback requestCallback = new RequestCallback() { + @Override public void onError( + Request request, + Throwable exception) + { + addErrorMessage("CGI request failed: ", exception); + } + + @Override public void onResponseReceived( + Request request, + Response response) + { + String responseString = response.getText(); + + if (getLog().isDebugEnabled()) { + getLog().debug("CGI response received: " + responseString); + } + + if (responseString.startsWith("Success")) { + EditConfigPropertySheetEditor.super.submit(); + // super.submit(); + } + else { + SimpleErrorBox error = getUIFactory() + .createSimpleErrorBox( + "Error occurred during config edit: " + + responseString); + CommanderUrlBuilder urlBuilder = createUrl("jobDetails.php") + .setParameter("jobId", jobId); + + error.add(new Anchor("(See job for details)", + urlBuilder.buildString())); + addErrorMessage(error); + } + } + }; + + try { + if (getLog().isDebugEnabled()) { + getLog().debug("Calling second waitForJob"); + } + JobUtilities.waitForJob(jobId, requestCallback); + } + catch (RequestException e) { + if (getLog().isDebugEnabled()) { + getLog().debug("Second waitForJob failed"); + } + addErrorMessage("CGI request failed: ", e); + } + } +} diff --git a/src/main/java/ecplugins/websphere/client/JobUtilities.java b/src/main/java/ecplugins/websphere/client/JobUtilities.java new file mode 100644 index 00000000..252b33dc --- /dev/null +++ b/src/main/java/ecplugins/websphere/client/JobUtilities.java @@ -0,0 +1,47 @@ +// Utils.java -- +// +// Utils.java is part of ElectricCommander. +// +// Copyright (c) 2005-2017 Electric Cloud, Inc. +// All rights reserved. +// + +package ecplugins.websphere.client; + +import java.util.HashMap; +import java.util.Map; + +import com.google.gwt.http.client.RequestCallback; +import com.google.gwt.http.client.RequestException; + +import com.electriccloud.commander.gwt.client.BrowserContext; +import com.electriccloud.commander.gwt.client.requests.CgiRequestProxy; + +import static com.electriccloud.commander.gwt.client.ComponentBaseFactory.getPluginName; + +public class JobUtilities +{ + + //~ Methods ---------------------------------------------------------------- + + public static void waitForJob( + final String jobId, + RequestCallback callback) + throws RequestException + { + CgiRequestProxy cgiRequestProxy = new CgiRequestProxy( + getPluginName(), "websphereMonitor.cgi"); + Map cgiParams = new HashMap(); + + cgiParams.put("jobId", jobId); + + // Pass debug flag to CGI, which will use it to determine whether to + // clean up a successful job + if ("1".equals(BrowserContext.getInstance() + .getGetParameter("debug"))) { + cgiParams.put("debug", "1"); + } + + cgiRequestProxy.issueGetRequest(cgiParams, callback); + } +} diff --git a/src/main/resources/project/WebSphere/WebSphere.pm b/src/main/resources/project/WebSphere/WebSphere.pm index 46fd5669..09d37403 100644 --- a/src/main/resources/project/WebSphere/WebSphere.pm +++ b/src/main/resources/project/WebSphere/WebSphere.pm @@ -540,7 +540,7 @@ sub get_step_parameters { my $value = $self->get_param($name); my $name_in_list = $name; - # $name_in_list =~ s/ecp_weblogic_//; + # $name_in_list =~ s/ecp_websphere_//; if ($param->findvalue('type')->string_value eq 'credential') { my $cred = $self->ec->getFullCredential($value); my $username = $cred->findvalue('//userName')->string_value; diff --git a/src/main/resources/project/WebSphereCreateConfigForm.xml b/src/main/resources/project/WebSphereCreateConfigForm.xml index 6736e803..22699d0f 100644 --- a/src/main/resources/project/WebSphereCreateConfigForm.xml +++ b/src/main/resources/project/WebSphereCreateConfigForm.xml @@ -16,6 +16,7 @@ --> + entry @@ -24,14 +25,16 @@ 1 Identifier of the configuration to create. i.e: myconfig + entry wsadminabspath Absolute path to wsadmin script. - 1 + 1 + select @@ -44,22 +47,25 @@ + entry websphere_url Hostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer. - 1 + 1 + entry websphere_port Port of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server. - 0 + 0 + credential @@ -68,14 +74,46 @@ 0 Credentials used to connect to WebSphere instance. + + + checkbox + + test_connection + 1 + 0 + 0 + Check if connection should be established during config creation to validate credentials. + + + + entry + + test_connection_res + + A resource which is used for the testing connection. + 0 + test_connection + ${test_connection} == 1 + + debug - Debug level. + Debug level, higher debug level - more debug messages. Warning: on debug level 10 and more passwords will be revealed in a procedure logs. 0 select - - - + + + + diff --git a/src/main/resources/project/WebSphereEditConfigForm.xml b/src/main/resources/project/WebSphereEditConfigForm.xml index 1c3707a7..04d38d50 100644 --- a/src/main/resources/project/WebSphereEditConfigForm.xml +++ b/src/main/resources/project/WebSphereEditConfigForm.xml @@ -16,14 +16,16 @@ --> + entry wsadminabspath Absolute path to wsadmin script. - 1 + 1 + select @@ -36,7 +38,8 @@ - + + entry websphere_url @@ -44,16 +47,18 @@ Hostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer. - 1 + 1 + entry websphere_port Port of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server. - 0 + 0 + credential @@ -62,14 +67,46 @@ 0 Credentials used to connect to WebSphere instance. + + + checkbox + + test_connection + 1 + 0 + 0 + Check if connection should be established during config creation to validate credentials. + + + + entry + + test_connection_res + + A resource which is used for the testing connection. + 0 + test_connection + ${test_connection} == 1 + + debug Debug level. 0 select - - - + + + + diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl new file mode 100644 index 00000000..648dd236 --- /dev/null +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -0,0 +1,221 @@ +use strict; +use warnings; + +use ElectricCommander; +use ElectricCommander::PropDB; +use ElectricCommander::PropMod; + +use Data::Dumper; + +#***************************************************************************** +use constant { + SUCCESS => 0, + ERROR => 1, +}; + +use constant { + LEVEL_ERROR => -1, + LEVEL_INFO => 0, + LEVEL_DEBUG => 1, + LEVEL_TRACE => 2, +}; + +#***************************************************************************** +my $ec = ElectricCommander->new(); +# $ec->abortOnError(0); + +my $projName = '$[/myProject/projectName]'; +my $pluginName = '@PLUGIN_NAME@'; +my $pluginKey = '@PLUGIN_KEY@'; + +my $websphere_url = '$[websphere_url]'; +my $wlst_path = '$[wlst_path]'; +my $java_home = '$[java_home]'; +my $java_vendor = '$[java_vendor]'; +my $mw_home = '$[mw_home]'; +my $credential = '$[credential]'; +my $enable_named_sessions = '$[enable_named_sessions]'; +my $debug_level = '$[debug_level]'; + +ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::Plugin::Core'); +ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::WebSphere'); + +my $wl = EC::WebSphere->new( + project_name => $projName, + plugin_name => $pluginName, + plugin_key => $pluginKey +); + +my $cred_xpath = $ec->getFullCredential($credential); +my $username = $cred_xpath->findvalue("//userName"); +my $password = $cred_xpath->findvalue("//password"); + +$wl->logger->level($debug_level); +$wl->debug_level($debug_level + 1); + +# $wl->logger->debug(Dumper(['#001', ''.$username, ''.$password])); +# $wl->logger->debug(Dumper(['#002', $projName, $pluginName, $pluginKey])); +# $wl->logger->debug(Dumper(['#003', $websphere_url, $wlst_path, $java_home, $java_vendor, $mw_home, $credential, $enable_named_sessions])); + +#***************************************************************************** +sub genFileName { + my ($key, $ext) = @_; + + return File::Spec->catfile($ENV{COMMANDER_WORKSPACE}, sprintf('%s-%06s.%s', $key, int(rand(1_000_000)), $ext || 'txt')); +} + +#***************************************************************************** +sub isWin { + return ($^O eq 'MSWin32') ? 1 : 0; +} + +#***************************************************************************** +sub escArgs { + my (@args) = @_; + + for my $arg (@args) { + next unless (defined($arg)); + next unless ($arg =~ m/[\s'"]/s); + + my $esca = (isWin) ? q{"} : q{'}; + + $arg =~ s/$esca/\\$esca/gs; + $arg = qq{$esca$arg$esca}; + } + + return @args; +} + +#***************************************************************************** +sub hidePwd { + my (@args) = @_; + + for my $arg (@args) { + next unless (defined($arg)); + $arg =~ s/-password.+?\s/-password *** /s; + } + + return @args; +} + +#***************************************************************************** +sub readOut { + my ($fileName) = @_; + + my $msg = ''; + if (open(my $file, $fileName)) { + local $/ = undef; + $msg = <$file>; + close($file); + } + else { + $msg = "Can't open file ($fileName) : $!"; + } + + return $msg; +} + +#***************************************************************************** +sub runCommand { + my (@args) = escArgs(@_); + + printf("Run Command: %s\n", join(' ', hidePwd(@args))); + + if (isWin) { + print("MSWin32 detected\n"); + $ENV{NOPAUSE} = 1; + } + + my $fileOut = genFileName('out'); + my $fileErr = genFileName('err'); + + local $! = undef; + + system(join(' ', @args, "1>$fileOut", "2>$fileErr")); + + my $ret = $?; + my $errmsg = $!; + my $code = $ret >> 8; + + my $stdout = readOut($fileOut); + my $stderr = readOut($fileErr); + + if ($ret == -1) { + $code = 1; + } + elsif ($ret & 0x7f) { + $code = 1; + my $err = sprintf("Command died with signal %d, %s coredump\n", ($ret & 0x7f), ($ret & 0x80) ? 'with' : 'without'); + if ($errmsg) { + $errmsg .= "\n$err"; + } + else { + $errmsg .= $err; + } + } + + return ($code, $stdout, $stderr, $errmsg); +} ## end sub runCommand + +#***************************************************************************** +sub checkConnection { + if ($java_home) { + $ENV{JAVA_HOME} = $java_home; + $wl->out(LEVEL_INFO, "JAVA_HOME was set to '$java_home'"); + } + + if ($java_vendor) { + $ENV{JAVA_VENDOR} = $java_vendor; + $wl->out(LEVEL_INFO, "JAVA_VENDOR was set to '$java_vendor'"); + } + + if ($mw_home) { + $ENV{MW_HOME} = $mw_home; + $wl->out(LEVEL_INFO, "MW_HOME was set to '$mw_home'"); + } + + my $script = $ENV{COMMANDER_WORKSPACE} . '/do_ls'; + + open FH, '>', $script; + print FH "connect('$username','$password','$websphere_url'); ls(); disconnect()\n"; + close FH; + + return runCommand($wlst_path, $script); +} ## end sub checkConnection + +#***************************************************************************** +my ($code, $stdout, $stderr, $errmsg) = eval {checkConnection();}; + +my $evalError = $@; +if ($evalError) { + if ($errmsg) { + $errmsg .= "\n$evalError"; + } + else { + $errmsg = $evalError; + } + + $code ||= 1; +} + +$wl->out(LEVEL_INFO, 'STDOUT: ', $stdout) if ($stdout); +$wl->out(LEVEL_INFO, 'STDERR: ', $stderr) if ($stderr); +$wl->out(LEVEL_INFO, 'ERRMSG: ', $errmsg) if ($errmsg); +$wl->out(LEVEL_INFO, 'EXIT_CODE: ', $code); + +if ($code) { + $errmsg ||= $stderr || $stdout; + $errmsg =~ s/^(.+?)WLSTException:\s+//s; + $errmsg =~ s/^(.+?)(?:nested exception is:.*)$/$1/s; + $errmsg =~ s/^(.+?)(?:Use dumpStack.*)$/$1/s; + + $wl->configurationErrorWithSuggestions($errmsg); + + exit(ERROR); +} +else { + $wl->logger->info("Connection succeeded"); + exit(SUCCESS); +} + +#***************************************************************************** diff --git a/src/main/resources/project/conf/createcfg.pl b/src/main/resources/project/conf/createcfg.pl index 894091b0..878f3113 100644 --- a/src/main/resources/project/conf/createcfg.pl +++ b/src/main/resources/project/conf/createcfg.pl @@ -22,8 +22,8 @@ use ElectricCommander::PropDB; use constant { - SUCCESS => 0, - ERROR => 1, + SUCCESS => 0, + ERROR => 1, }; my $opts; @@ -40,12 +40,12 @@ $ec->abortOnError(0); # load option list from procedure parameters -my $x = $ec->getJobDetails($ENV{COMMANDER_JOBID}); +my $x = $ec->getJobDetails($ENV{COMMANDER_JOBID}); my $nodeset = $x->find("//actualParameter"); foreach my $node ($nodeset->get_nodelist) { my $parm = $node->findvalue("actualParameterName"); - my $val = $node->findvalue("value"); - $opts->{$parm}="$val"; + my $val = $node->findvalue("value"); + $opts->{$parm} = "$val"; } if (!defined $opts->{config} || "$opts->{config}" eq '') { @@ -54,7 +54,7 @@ } # check to see if a config with this name already exists before we do anything else -my $xpath = $ec->getProperty("/myProject/websphere_cfgs/$opts->{config}"); +my $xpath = $ec->getProperty("/myProject/websphere_cfgs/$opts->{config}"); my $property = $xpath->findvalue("//response/property/propertyName"); if (defined $property && "$property" ne "") { @@ -64,13 +64,16 @@ exit ERROR; } -my $cfg = new ElectricCommander::PropDB($ec,"/myProject/websphere_cfgs"); +my $cfg = new ElectricCommander::PropDB($ec, "/myProject/websphere_cfgs"); # add all the options as properties -foreach my $key (keys % {$opts}) { - if ($key eq 'config') { +foreach my $key (keys %{$opts}) { + if ($key eq 'config') { next; } - $cfg->setCol("$opts->{config}",$key,"$opts->{$key}"); + $cfg->setCol("$opts->{config}", $key, "$opts->{$key}"); } + +print "Configuration \"$opts->{config}\" created.\n"; + exit SUCCESS; diff --git a/src/main/resources/project/conf/deletecfg.pl b/src/main/resources/project/conf/deletecfg.pl index cc896084..1dbc80b3 100644 --- a/src/main/resources/project/conf/deletecfg.pl +++ b/src/main/resources/project/conf/deletecfg.pl @@ -22,14 +22,14 @@ use ElectricCommander::PropDB; use constant { - SUCCESS => 0, - ERROR => 1, + SUCCESS => 0, + ERROR => 1, }; my $opts; my $PLUGIN_NAME = 'EC-WebSphere'; -my $projName = "@PLUGIN_KEY@-@PLUGIN_VERSION@"; +my $projName = "@PLUGIN_KEY@-@PLUGIN_VERSION@"; if (!defined $PLUGIN_NAME) { print "PLUGIN_NAME must be defined\n"; @@ -48,9 +48,9 @@ exit ERROR; } -# check to see if a config with this name already exists before +# check to see if a config with this name already exists before # we do anything else -my $xpath = $ec->getProperty("/myProject/websphere_cfgs/$opts->{config}"); +my $xpath = $ec->getProperty("/myProject/websphere_cfgs/$opts->{config}"); my $property = $xpath->findvalue("//response/property/propertyName"); if (!defined $property || "$property" eq '') { @@ -62,4 +62,7 @@ $ec->deleteProperty("/myProject/websphere_cfgs/$opts->{config}"); $ec->deleteCredential($projName, $opts->{config}); + +print "Configuration \"$opts->{config}\" deleted.\n"; + exit SUCCESS; diff --git a/src/main/resources/project/manifest.xml b/src/main/resources/project/manifest.xml index 61d96634..abb7e10b 100644 --- a/src/main/resources/project/manifest.xml +++ b/src/main/resources/project/manifest.xml @@ -373,6 +373,14 @@ //procedure[procedureName="CreateConfiguration"]/step[stepName="CreateAndAttachCredential"]/command conf/createAndAttachCredential.pl + + conf/attemptConnection.pl + //procedure[procedureName="CreateConfiguration"]/step[stepName="AttemptConnection"]/command + + + conf/attemptConnection.pl + //procedure[procedureName="EditConfiguration"]/step[stepName="AttemptConnection"]/command + //procedure[procedureName="DeleteConfiguration"]/step[stepName="DeleteConfiguration"]/command conf/deletecfg.pl @@ -828,7 +836,7 @@ server/Cluster/createClusterMembers.pl - + diff --git a/src/main/resources/project/project.xml b/src/main/resources/project/project.xml index b70dfab5..2344023a 100644 --- a/src/main/resources/project/project.xml +++ b/src/main/resources/project/project.xml @@ -509,6 +509,26 @@ + + test_connection + + + formType + 1 + standard + + + + + test_connection_res + + + formType + 1 + standard + + + @@ -563,6 +583,58 @@ 0 checkbox + + test_connection + + Check if connection should be established during config creation to validate credentials. + 0 + checkbox + + + test_connection_res + + A resource which is used for the testing connection. + 0 + entry + + + AttemptConnection + 0 + 0 + + $[test_connection] + + abortJob + 0 + + 0 + $[/myProject/postp_loader] + 0 + $[test_connection_res] + 0 + ec-perl + + minutes + + + CreateConfiguration + @PLUGIN_KEY@-@PLUGIN_VERSION@ + + + ec_customEditorData + + + formType + 1 + command + + + + + + credential + + CreateConfiguration 0 @@ -637,6 +709,207 @@ + + EditConfiguration + Edit a WebSphere configuration + websphere-createcfg-$[jobId] + + + @PLUGIN_KEY@-@PLUGIN_VERSION@ + + + ec_customEditorData + + + parameters + + + wsadminabspath + + + formType + 1 + standard + + + + + conntype + + + formType + 1 + standard + + + + + websphere_url + + + formType + 1 + standard + + + + + websphere_port + + + formType + 1 + standard + + + + + credential + + + formType + 1 + standard + + + + + debug + + + formType + 1 + standard + + + + + test_connection + + + formType + 1 + standard + + + + + test_connection_res + + + formType + 1 + standard + + + + + + + + + + config + + Configuration Name. + 1 + entry + + + wsadminabspath + + wsadmin absolute path + 1 + entry + + + conntype + + Specifies type of connection to use to connect to the application server that you want to administer. + 1 + entry + + + websphere_url + + Hostname of the WebSphere Application Server to administer using wsadmin tool. + 1 + entry + + + websphere_port + + Port of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server. + 0 + entry + + + credential + + + 0 + credential + + + debug + + Enable debugging. + 0 + checkbox + + + test_connection + + Check if connection should be established during config edition to validate credentials. + 0 + checkbox + + + test_connection_res + + A resource which is used for the testing connection. + 0 + entry + + + AttemptConnection + 0 + 0 + + $[test_connection] + + abortJob + 0 + + 0 + $[/myProject/postp_loader] + 0 + $[test_connection_res] + 0 + ec-perl + + minutes + + + EditConfiguration + @PLUGIN_KEY@-@PLUGIN_VERSION@ + + + ec_customEditorData + + + formType + 1 + command + + + + + + credential + + + DeleteConfiguration Delete an WebSphere configuration From ac48d8d4221fa5d437e9d65294bca3e90d89843f Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Wed, 15 Jul 2020 19:33:25 +0300 Subject: [PATCH 10/47] Implement attemptConnection --- pages/EC-WebSphere_help.xml | 29 ++++++- .../resources/project/WebSphere/WebSphere.pm | 69 ++++++++++++++- .../project/conf/attemptConnection.pl | 86 +++++++++++-------- 3 files changed, 144 insertions(+), 40 deletions(-) diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index e809508c..87b3f66a 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -14,7 +14,7 @@

                                                                                                                      @PLUGIN_KEY@

                                                                                                                      Plugin version @PLUGIN_VERSION@

                                                                                                                      -

                                                                                                                      Revised on June 17, 2020

                                                                                                                      +

                                                                                                                      Revised on July 15, 2020


                                                                                                                      Contents

                                                                                                                      @@ -207,10 +207,24 @@ Each configuration is given a unique name that is entered in designated paramete
                            + + + + + + + + + + + + + + - + @@ -6390,6 +6404,17 @@ report.

                            Release Notes

                            +

                            @PLUGIN_KEY@ 3.8.0

                            +
                              + +
                            • Add checking connection while creating a configuration.
                            • + +
                            • Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved.
                            • + +
                            • Add logging while running "CreateConfiguration".
                            • + +
                            +

                            @PLUGIN_KEY@ 2.7.1

                              diff --git a/src/main/resources/project/WebSphere/WebSphere.pm b/src/main/resources/project/WebSphere/WebSphere.pm index 09d37403..c4b097f2 100644 --- a/src/main/resources/project/WebSphere/WebSphere.pm +++ b/src/main/resources/project/WebSphere/WebSphere.pm @@ -1398,7 +1398,74 @@ sub procedure_result_cb_start_node { } } -## internal package, required for logging +#***************************************************************************** +sub configurationErrorWithSuggestions { + my ($self, $errmsg) = @_; + + my $suggestions = q{Reasons could be due to one or more of the following. Please ensure they are correct and try again.: +1. WebSphere Host & WebSphere Connector Port - Is your URL complete and reachable? +2. WSAdmin Absolute Path - Is your Path to the Script correct? +3 Connection Type - Is the appropriate connector configured properly? +4. Test Resource - Is your Test resource correctly wired with CloudBees CD? Is your Test Resource correctly setup with WebSphere? +5. Credentials - Are your credentials correct? Are you able to use these credentials to log in to WebSphere using its console? +}; + + $self->ec->setProperty('/myJob/configError', $errmsg . "\n\n" . $suggestions); + $self->ec->setProperty('/myJobStep/summary', $errmsg . "\n\n" . $suggestions); + + $self->logErrorDiag("Create Configuration failed.\n\n$errmsg"); + $self->logInfoDiag($suggestions); + + return; +} + +#***************************************************************************** +sub logInfoDiag { + my ($self, @params) = @_; + + return $self->printDiagMessage('INFO', @params); +} + +#***************************************************************************** +sub logErrorDiag { + my ($self, @params) = @_; + + return $self->printDiagMessage('ERROR', @params); +} + +#***************************************************************************** +sub logWarningDiag { + my ($self, @params) = @_; + + return $self->printDiagMessage('WARNING', @params); +} + +#***************************************************************************** +sub printDiagMessage { + my ($self, @params) = @_; + + my $level = shift @params; + + if (!$level || !@params) { + return 0; + } + + $level = uc $level; + if ($level !~ m/^(?:ERROR|WARNING|INFO)$/s) { + return 0; + } + + # \n[OUT][%s]: %s :[%s][OUT]\n + my $begin = "\n[OUT][$level]: "; + my $end = " :[$level][OUT]\n"; + + my $msg = join '', @params; + $msg = $begin . $msg . $end; + + return $self->logger->info($msg); +} + +## internal package, required for logging #################################### package EC::Plugin::Logger; use strict; diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl index 648dd236..2106052a 100644 --- a/src/main/resources/project/conf/attemptConnection.pl +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -28,19 +28,17 @@ my $pluginName = '@PLUGIN_NAME@'; my $pluginKey = '@PLUGIN_KEY@'; -my $websphere_url = '$[websphere_url]'; -my $wlst_path = '$[wlst_path]'; -my $java_home = '$[java_home]'; -my $java_vendor = '$[java_vendor]'; -my $mw_home = '$[mw_home]'; -my $credential = '$[credential]'; -my $enable_named_sessions = '$[enable_named_sessions]'; -my $debug_level = '$[debug_level]'; +my $wsadminabspath = '$[wsadminabspath]'; +my $websphere_url = '$[websphere_url]'; +my $websphere_port = '$[websphere_port]'; +my $conntype = '$[conntype]'; +my $credential = '$[credential]'; +my $debug_level = '$[debug]'; ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::Plugin::Core'); ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::WebSphere'); -my $wl = EC::WebSphere->new( +my $ws = EC::WebSphere->new( project_name => $projName, plugin_name => $pluginName, plugin_key => $pluginKey @@ -50,12 +48,12 @@ my $username = $cred_xpath->findvalue("//userName"); my $password = $cred_xpath->findvalue("//password"); -$wl->logger->level($debug_level); -$wl->debug_level($debug_level + 1); +$ws->logger->level($debug_level); +$ws->debug_level($debug_level + 1); -# $wl->logger->debug(Dumper(['#001', ''.$username, ''.$password])); -# $wl->logger->debug(Dumper(['#002', $projName, $pluginName, $pluginKey])); -# $wl->logger->debug(Dumper(['#003', $websphere_url, $wlst_path, $java_home, $java_vendor, $mw_home, $credential, $enable_named_sessions])); +# $ws->logger->debug(Dumper(['#001', ''.$username, ''.$password])); +# $ws->logger->debug(Dumper(['#002', $projName, $pluginName, $pluginKey])); +# $ws->logger->debug(Dumper(['#003', $wsadminabspath, $websphere_url, $websphere_port, $conntype, $credential])); #***************************************************************************** sub genFileName { @@ -159,28 +157,37 @@ sub runCommand { #***************************************************************************** sub checkConnection { - if ($java_home) { - $ENV{JAVA_HOME} = $java_home; - $wl->out(LEVEL_INFO, "JAVA_HOME was set to '$java_home'"); + + #~ ./wsadmin.sh -lang jython -host 127.0.0.1 -port 8879 -conntype SOAP -user wsadmin -password changeme -c 'AdminApp.list()' + + my @args = ( + '-lang', + 'jython', + '-c', + 'AdminApp.list()', + ); + + if ($conntype) { + push(@args, '-conntype', $conntype); } - if ($java_vendor) { - $ENV{JAVA_VENDOR} = $java_vendor; - $wl->out(LEVEL_INFO, "JAVA_VENDOR was set to '$java_vendor'"); + if ($websphere_url) { + push(@args, ($conntype eq 'IPC') ? '-ipchost' : '-host', $websphere_url); } - if ($mw_home) { - $ENV{MW_HOME} = $mw_home; - $wl->out(LEVEL_INFO, "MW_HOME was set to '$mw_home'"); + if ($websphere_port) { + push(@args, '-port', $websphere_port); } - my $script = $ENV{COMMANDER_WORKSPACE} . '/do_ls'; + if ($username) { + push(@args, '-user', $username); + } - open FH, '>', $script; - print FH "connect('$username','$password','$websphere_url'); ls(); disconnect()\n"; - close FH; + if ($password) { + push(@args, '-password', $password); + } - return runCommand($wlst_path, $script); + return runCommand($wsadminabspath, @args); } ## end sub checkConnection #***************************************************************************** @@ -198,23 +205,28 @@ sub checkConnection { $code ||= 1; } -$wl->out(LEVEL_INFO, 'STDOUT: ', $stdout) if ($stdout); -$wl->out(LEVEL_INFO, 'STDERR: ', $stderr) if ($stderr); -$wl->out(LEVEL_INFO, 'ERRMSG: ', $errmsg) if ($errmsg); -$wl->out(LEVEL_INFO, 'EXIT_CODE: ', $code); +if ($stderr) { + $ws->out(LEVEL_INFO, 'STDERR: ', $stderr); + + if (isWin() && ($log =~ m/[\w\d]{8}E:/ms)) { + $ws->logger->debug("Detected an error on windows. Changing code to 1."); + code = 1; + } +} + +$ws->out(LEVEL_INFO, 'STDOUT: ', $stdout) if ($stdout); +$ws->out(LEVEL_INFO, 'ERRMSG: ', $errmsg) if ($errmsg); +$ws->out(LEVEL_INFO, 'EXIT_CODE: ', $code); if ($code) { $errmsg ||= $stderr || $stdout; - $errmsg =~ s/^(.+?)WLSTException:\s+//s; - $errmsg =~ s/^(.+?)(?:nested exception is:.*)$/$1/s; - $errmsg =~ s/^(.+?)(?:Use dumpStack.*)$/$1/s; - $wl->configurationErrorWithSuggestions($errmsg); + $ws->configurationErrorWithSuggestions($errmsg); exit(ERROR); } else { - $wl->logger->info("Connection succeeded"); + $ws->logger->info("Connection succeeded"); exit(SUCCESS); } From 6398d37e6e975b032d465dc4d4221181a0b35b11 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 16 Jul 2020 12:57:04 +0300 Subject: [PATCH 11/47] Test & fix --- .../resources/project/WebSphere/WebSphere.pm | 67 ----------- .../project/conf/attemptConnection.pl | 113 +++++++++++++----- 2 files changed, 82 insertions(+), 98 deletions(-) diff --git a/src/main/resources/project/WebSphere/WebSphere.pm b/src/main/resources/project/WebSphere/WebSphere.pm index c4b097f2..21b980bf 100644 --- a/src/main/resources/project/WebSphere/WebSphere.pm +++ b/src/main/resources/project/WebSphere/WebSphere.pm @@ -1398,73 +1398,6 @@ sub procedure_result_cb_start_node { } } -#***************************************************************************** -sub configurationErrorWithSuggestions { - my ($self, $errmsg) = @_; - - my $suggestions = q{Reasons could be due to one or more of the following. Please ensure they are correct and try again.: -1. WebSphere Host & WebSphere Connector Port - Is your URL complete and reachable? -2. WSAdmin Absolute Path - Is your Path to the Script correct? -3 Connection Type - Is the appropriate connector configured properly? -4. Test Resource - Is your Test resource correctly wired with CloudBees CD? Is your Test Resource correctly setup with WebSphere? -5. Credentials - Are your credentials correct? Are you able to use these credentials to log in to WebSphere using its console? -}; - - $self->ec->setProperty('/myJob/configError', $errmsg . "\n\n" . $suggestions); - $self->ec->setProperty('/myJobStep/summary', $errmsg . "\n\n" . $suggestions); - - $self->logErrorDiag("Create Configuration failed.\n\n$errmsg"); - $self->logInfoDiag($suggestions); - - return; -} - -#***************************************************************************** -sub logInfoDiag { - my ($self, @params) = @_; - - return $self->printDiagMessage('INFO', @params); -} - -#***************************************************************************** -sub logErrorDiag { - my ($self, @params) = @_; - - return $self->printDiagMessage('ERROR', @params); -} - -#***************************************************************************** -sub logWarningDiag { - my ($self, @params) = @_; - - return $self->printDiagMessage('WARNING', @params); -} - -#***************************************************************************** -sub printDiagMessage { - my ($self, @params) = @_; - - my $level = shift @params; - - if (!$level || !@params) { - return 0; - } - - $level = uc $level; - if ($level !~ m/^(?:ERROR|WARNING|INFO)$/s) { - return 0; - } - - # \n[OUT][%s]: %s :[%s][OUT]\n - my $begin = "\n[OUT][$level]: "; - my $end = " :[$level][OUT]\n"; - - my $msg = join '', @params; - $msg = $begin . $msg . $end; - - return $self->logger->info($msg); -} - ## internal package, required for logging #################################### package EC::Plugin::Logger; diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl index 2106052a..74f59748 100644 --- a/src/main/resources/project/conf/attemptConnection.pl +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -2,8 +2,8 @@ use warnings; use ElectricCommander; -use ElectricCommander::PropDB; -use ElectricCommander::PropMod; +use ElectricCommander::PropMod qw(/myProject/modules); +use WebSphere::WebSphere; use Data::Dumper; @@ -24,10 +24,6 @@ my $ec = ElectricCommander->new(); # $ec->abortOnError(0); -my $projName = '$[/myProject/projectName]'; -my $pluginName = '@PLUGIN_NAME@'; -my $pluginKey = '@PLUGIN_KEY@'; - my $wsadminabspath = '$[wsadminabspath]'; my $websphere_url = '$[websphere_url]'; my $websphere_port = '$[websphere_port]'; @@ -35,25 +31,80 @@ my $credential = '$[credential]'; my $debug_level = '$[debug]'; -ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::Plugin::Core'); -ElectricCommander::PropMod::loadPerlCodeFromProperty($ec, '/myProject/EC::WebSphere'); - -my $ws = EC::WebSphere->new( - project_name => $projName, - plugin_name => $pluginName, - plugin_key => $pluginKey -); - my $cred_xpath = $ec->getFullCredential($credential); my $username = $cred_xpath->findvalue("//userName"); my $password = $cred_xpath->findvalue("//password"); -$ws->logger->level($debug_level); -$ws->debug_level($debug_level + 1); +# print(Dumper(['#001', ''.$username, ''.$password])); +# print(Dumper(['#002', $projName, $pluginName, $pluginKey])); +# print(Dumper(['#003', $wsadminabspath, $websphere_url, $websphere_port, $conntype, $credential])); + +#***************************************************************************** +sub configurationErrorWithSuggestions { + my ($errmsg) = @_; + + my $suggestions = q{Reasons could be due to one or more of the following. Please ensure they are correct and try again.: +1. WebSphere Host & WebSphere Connector Port - Is your URL complete and reachable? +2. WSAdmin Absolute Path - Is your Path to the Script correct? +3 Connection Type - Is the appropriate connector configured properly? +4. Test Resource - Is your Test resource correctly wired with CloudBees CD? Is your Test Resource correctly setup with WebSphere? +5. Credentials - Are your credentials correct? Are you able to use these credentials to log in to WebSphere using its console? +}; + + $ec->setProperty('/myJob/configError', $errmsg . "\n\n" . $suggestions); + $ec->setProperty('/myJobStep/summary', $errmsg . "\n\n" . $suggestions); + + logErrorDiag("Create Configuration failed.\n\n$errmsg"); + logInfoDiag($suggestions); + + return; +} + +#***************************************************************************** +sub logInfoDiag { + my (@params) = @_; + + return printDiagMessage('INFO', @params); +} + +#***************************************************************************** +sub logErrorDiag { + my (@params) = @_; + + return printDiagMessage('ERROR', @params); +} + +#***************************************************************************** +sub logWarningDiag { + my (@params) = @_; + + return printDiagMessage('WARNING', @params); +} + +#***************************************************************************** +sub printDiagMessage { + my (@params) = @_; + + my $level = shift @params; + + if (!$level || !@params) { + return 0; + } + + $level = uc $level; + if ($level !~ m/^(?:ERROR|WARNING|INFO)$/s) { + return 0; + } + + # \n[OUT][%s]: %s :[%s][OUT]\n + my $begin = "\n[OUT][$level]: "; + my $end = " :[$level][OUT]\n"; -# $ws->logger->debug(Dumper(['#001', ''.$username, ''.$password])); -# $ws->logger->debug(Dumper(['#002', $projName, $pluginName, $pluginKey])); -# $ws->logger->debug(Dumper(['#003', $wsadminabspath, $websphere_url, $websphere_port, $conntype, $credential])); + my $msg = join '', @params; + $msg = $begin . $msg . $end; + + return print($msg); +} ## end sub printDiagMessage #***************************************************************************** sub genFileName { @@ -73,7 +124,7 @@ sub escArgs { for my $arg (@args) { next unless (defined($arg)); - next unless ($arg =~ m/[\s'"]/s); + next if ($arg =~ m/['"]/s); my $esca = (isWin) ? q{"} : q{'}; @@ -164,7 +215,7 @@ sub checkConnection { '-lang', 'jython', '-c', - 'AdminApp.list()', + "'AdminApp.list()'", ); if ($conntype) { @@ -206,27 +257,27 @@ sub checkConnection { } if ($stderr) { - $ws->out(LEVEL_INFO, 'STDERR: ', $stderr); + print('STDERR: ', $stderr); - if (isWin() && ($log =~ m/[\w\d]{8}E:/ms)) { - $ws->logger->debug("Detected an error on windows. Changing code to 1."); - code = 1; + if (isWin() && ($stderr =~ m/[\w\d]{8}E:/ms)) { + print("Detected an error on windows. Changing code to 1.\n"); + $code = 1; } } -$ws->out(LEVEL_INFO, 'STDOUT: ', $stdout) if ($stdout); -$ws->out(LEVEL_INFO, 'ERRMSG: ', $errmsg) if ($errmsg); -$ws->out(LEVEL_INFO, 'EXIT_CODE: ', $code); +print('STDOUT: ', $stdout) if ($stdout); +print('ERRMSG: ', $errmsg) if ($errmsg); +print('EXIT_CODE: ', $code); if ($code) { $errmsg ||= $stderr || $stdout; - $ws->configurationErrorWithSuggestions($errmsg); + configurationErrorWithSuggestions($errmsg); exit(ERROR); } else { - $ws->logger->info("Connection succeeded"); + print("Connection succeeded"); exit(SUCCESS); } From e783b2768314fea38d34eb2e2d604efc4df328c4 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 16 Jul 2020 16:32:24 +0300 Subject: [PATCH 12/47] Fix attemptConnection --- cgi-bin/websphereMonitor.cgi | 11 +++++---- .../project/conf/attemptConnection.pl | 23 ++++++++----------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/cgi-bin/websphereMonitor.cgi b/cgi-bin/websphereMonitor.cgi index 94f1feae..b5759853 100644 --- a/cgi-bin/websphereMonitor.cgi +++ b/cgi-bin/websphereMonitor.cgi @@ -74,7 +74,7 @@ sub main { # # If the job was successful and the debug flag is not set, delete it # my $debug = $cgiArgs->{debug}; # if (!defined $debug || "$debug" ne "1") { - # $ec->deleteJob($jobId); + # $ec->deleteJob($jobId); # } # Report the job's success @@ -101,7 +101,7 @@ sub abortJobAndReportError($$$) { # Try to abort the job my $xpath = $ec->abortJob($jobId); my $errors = $ec->checkAllErrors($xpath); - if ("$errors" ne "") { + if ("$errors" ne '') { reportError($cgi, $errMsg . "\n" . $errors); } @@ -137,8 +137,9 @@ sub reportJobErrors($$$) { my ($cgi, $ec, $jobId) = @_; # Get job details - my $xpath = $ec->getJobDetails($jobId); - my $errors = $ec->checkAllErrors($xpath); + my $xpath = $ec->getJobDetails($jobId); + my $procedureName = eval {$xpath->findvalue('//job/procedureName')->string_value();}; + my $errors = $ec->checkAllErrors($xpath); if ("$errors" ne "") { reportError($cgi, $errors); } @@ -158,7 +159,7 @@ sub reportJobErrors($$$) { # Report a generic error message if we couldn't find a specific one on the # job - if ($procedureName && $procedureName eq 'EditConfiguration') { + if ($procedureName && ($procedureName eq 'EditConfiguration')) { reportError($cgi, "Edit configuration failed"); } else { diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl index 74f59748..4381b390 100644 --- a/src/main/resources/project/conf/attemptConnection.pl +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -137,14 +137,11 @@ sub escArgs { #***************************************************************************** sub hidePwd { - my (@args) = @_; + my ($str) = @_; - for my $arg (@args) { - next unless (defined($arg)); - $arg =~ s/-password.+?\s/-password *** /s; - } + $str =~ s/['"]?-password["']?\s+\S+(?:\s+|$)/-password ******** /gs; - return @args; + return $str; } #***************************************************************************** @@ -168,7 +165,7 @@ sub readOut { sub runCommand { my (@args) = escArgs(@_); - printf("Run Command: %s\n", join(' ', hidePwd(@args))); + printf("Run Command: %s\n", hidePwd(join(' ', @args))); if (isWin) { print("MSWin32 detected\n"); @@ -209,7 +206,7 @@ sub runCommand { #***************************************************************************** sub checkConnection { - #~ ./wsadmin.sh -lang jython -host 127.0.0.1 -port 8879 -conntype SOAP -user wsadmin -password changeme -c 'AdminApp.list()' + #~ ./wsadmin.sh -lang jython -host 127.0.0.1 -port 8879 -conntype SOAP -user wsadmin -password **** -c 'AdminApp.list()' my @args = ( '-lang', @@ -257,7 +254,7 @@ sub checkConnection { } if ($stderr) { - print('STDERR: ', $stderr); + print("STDERR: $stderr\n"); if (isWin() && ($stderr =~ m/[\w\d]{8}E:/ms)) { print("Detected an error on windows. Changing code to 1.\n"); @@ -265,9 +262,9 @@ sub checkConnection { } } -print('STDOUT: ', $stdout) if ($stdout); -print('ERRMSG: ', $errmsg) if ($errmsg); -print('EXIT_CODE: ', $code); +print("STDOUT: $stdout\n") if ($stdout); +print("ERRMSG: $errmsg\n") if ($errmsg); +print("EXIT_CODE: $code\n"); if ($code) { $errmsg ||= $stderr || $stdout; @@ -277,7 +274,7 @@ sub checkConnection { exit(ERROR); } else { - print("Connection succeeded"); + print("Connection succeeded\n"); exit(SUCCESS); } From 5aee97eb0b9391b0a3bfce6523f0485cc482cf62 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 16 Jul 2020 17:21:21 +0300 Subject: [PATCH 13/47] Adapt scpecs tests --- gradle/wrapper/gradle-wrapper.properties | 6 +++--- specs/build.gradle | 3 ++- .../spec/CreateConfigurationsSuite.groovy | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8af87cca..6403b727 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jul 14 01:00:21 EEST 2016 +#Thu Jul 16 16:57:44 EEST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/specs/build.gradle b/specs/build.gradle index 7c780eb0..f7fc30e3 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -41,7 +41,8 @@ test { def server = findProperty('server') ?: findProperty('COMMANDER_SERVER') ?: findProperty('commanderServer') ?: 'localhost' systemProperties['COMMANDER_SERVER'] = server - systemProperties["COMMANDER_SECURE"] = '1' + def secure = findProperty('secure') ?: findProperty('COMMANDER_SECURE') ?: findProperty('commanderSecure') ?: 1 + systemProperties["COMMANDER_SECURE"] = secure testLogging { showStandardStreams = true diff --git a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy index d35667b3..655b32ed 100644 --- a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy +++ b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy @@ -16,11 +16,16 @@ import com.electriccloud.plugin.spec.PluginTestHelper */ @Stepwise class CreateConfigurationsSute extends PluginTestHelper { + @Shared + String resourceName + def doSetupSpec() { + resourceName = createWebSphereResource() } def doCleanupSpec() { } + String conntype def "Creation SOAP configuration for testing - Positive" () { conntype = "SOAP" @@ -28,13 +33,15 @@ class CreateConfigurationsSute extends PluginTestHelper { when: 'Creation Runs' def wasResourceName = System.getenv('WAS_HOST'); createWorkspace(wasResourceName) - def inputData =[ + def inputData = [ username : System.getenv('WAS_USERNAME') ?: 'wsadmin', password : System.getenv('WAS_PASSWORD') ?: 'changeme', websphere_url : System.getenv('WAS_HOST'), websphere_port : System.getenv('WAS_PORT') ?: '', wsadminabspath : System.getenv('WSADMIN_PATH') ?: '', conntype: conntype, + test_connection: 1, + test_connection_res: resourceName, debug: 1 ] println "Log: inputData:: $inputData" @@ -57,6 +64,8 @@ class CreateConfigurationsSute extends PluginTestHelper { websphere_port : System.getenv('WAS_PORT') ?: '', wsadminabspath : System.getenv('WSADMIN_PATH') ?: '', conntype: conntype, + test_connection: 1, + test_connection_res: resourceName, debug: 1 ] println "Log: inputData:: $inputData" @@ -79,6 +88,8 @@ class CreateConfigurationsSute extends PluginTestHelper { websphere_port : System.getenv('WAS_PORT') ?: '', wsadminabspath : System.getenv('WSADMIN_PATH') ?: '', conntype: conntype, + test_connection: 1, + test_connection_res: resourceName, debug: 1 ] println "Log: inputData:: $inputData" @@ -101,6 +112,8 @@ class CreateConfigurationsSute extends PluginTestHelper { websphere_port : System.getenv('WAS_PORT') ?: '', wsadminabspath : System.getenv('WSADMIN_PATH') ?: '', conntype: conntype, + test_connection: 1, + test_connection_res: resourceName, debug: 1 ] println "Log: inputData:: $inputData" @@ -123,6 +136,8 @@ class CreateConfigurationsSute extends PluginTestHelper { websphere_port : System.getenv('WAS_PORT') ?: '', wsadminabspath : System.getenv('WSADMIN_PATH') ?: '', conntype: conntype, + test_connection: 1, + test_connection_res: resourceName, debug: 1 ] println "Log: inputData:: $inputData" From 6818391143f9aa39841bb1d1daa3d3a9cb9f0a38 Mon Sep 17 00:00:00 2001 From: Valentyn Solomko Date: Thu, 16 Jul 2020 17:54:04 +0300 Subject: [PATCH 14/47] Update help --- .../images/CreateConfiguration/EditConfig.png | Bin 61913 -> 45473 bytes pages/EC-WebSphere_help.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/images/CreateConfiguration/EditConfig.png b/htdocs/images/CreateConfiguration/EditConfig.png index efb55b390368eeeb649ae1da2eec5feb78589a45..35f1b5589422e7eae8fbb09466f786d9741069af 100644 GIT binary patch literal 45473 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
                              wfXjlH8Hz{J^zY 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 SMXwS+{HlrdWrFdohyMXr1(4zZ literal 61913 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 A&Hw-a diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 87b3f66a..1fff6a58 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -14,7 +14,7 @@

                              @PLUGIN_KEY@

                              Plugin version @PLUGIN_VERSION@

                              -

                              Revised on July 15, 2020

                              +

                              Revised on July 16, 2020


                              Contents

                              From 45b6944dcfd06e8f462facdbe150e9d3465725a1 Mon Sep 17 00:00:00 2001 From: Polina Shubina <925043@gmail.com> Date: Mon, 21 Sep 2020 19:06:10 +0300 Subject: [PATCH 15/47] adoc --- help/changelog.yaml | 179 +- help/help.adoc | 4773 ++++++++++++ help/overview.md | 25 +- help/procedures/CheckApp/postface.md | 66 +- help/procedures/CheckNodeStatus/token.txt | 2 +- help/procedures/CheckPageStatus/postface.md | 35 +- help/procedures/CheckServerStatus/postface.md | 4 +- .../procedures/ConfigEJBContainer/postface.md | 36 +- help/procedures/ConfigureSession/postface.md | 36 +- help/procedures/ConfigureSession/preface.md | 2 +- .../CreateApplicationServer/postface.md | 31 +- .../CreateApplicationServer/token.txt | 2 +- .../postface.md | 31 +- .../CreateApplicationServerTemplate/token.txt | 2 +- help/procedures/CreateCluster/postface.md | 31 +- help/procedures/CreateCluster/token.txt | 2 +- .../CreateClusterMembers/postface.md | 31 +- .../procedures/CreateClusterMembers/token.txt | 2 +- .../procedures/CreateConfiguration/preface.md | 6 +- help/procedures/CreateDatasource/postface.md | 34 +- .../CreateEndToEndMailProvider/postface.md | 36 +- .../CreateFirstClusterMember/postface.md | 31 +- .../CreateFirstClusterMember/token.txt | 2 +- .../procedures/CreateJDBCProvider/postface.md | 37 +- help/procedures/CreateJMSProvider/postface.md | 17 +- help/procedures/CreateMailSession/postface.md | 36 +- .../CreateOrUpdateJMSQueue/postface.md | 76 +- .../CreateOrUpdateJMSTopic/postface.md | 76 +- .../postface.md | 76 +- .../postface.md | 76 +- .../postface.md | 76 +- .../postface.md | 76 +- .../DeleteApplicationServer/postface.md | 31 +- .../DeleteApplicationServer/token.txt | 2 +- .../postface.md | 31 +- .../DeleteApplicationServerTemplate/token.txt | 2 +- help/procedures/DeleteCluster/postface.md | 31 +- help/procedures/DeleteCluster/token.txt | 2 +- help/procedures/DeleteDatasource/postface.md | 33 +- .../procedures/DeleteJDBCProvider/postface.md | 36 +- .../DeleteJMSActivationSpec/postface.md | 86 +- .../DeleteJMSConnectionFactory/postface.md | 76 +- help/procedures/DeleteJMSProvider/postface.md | 76 +- help/procedures/DeleteJMSQueue/postface.md | 76 +- help/procedures/DeleteJMSTopic/postface.md | 76 +- help/procedures/DeployApp/postface.md | 40 +- .../DeployEnterpriseApp/postface.md | 36 +- help/procedures/DeployOSGiApp/postface.md | 36 +- .../ExportApplicationServer/postface.md | 31 +- .../ExportApplicationServer/token.txt | 2 +- .../ImportApplicationServer/postface.md | 31 +- .../ImportApplicationServer/token.txt | 2 +- .../procedures/ListClusterMembers/postface.md | 31 +- help/procedures/ListClusterMembers/token.txt | 2 +- help/procedures/MapSharedLibrary/postface.md | 34 +- .../ModifyApplicationClassLoader/postface.md | 34 +- help/procedures/PublishWSDL/postface.md | 17 +- .../RemoveClusterMembers/postface.md | 31 +- .../procedures/RemoveClusterMembers/token.txt | 2 +- help/procedures/RunCustomJob/postface.md | 5 +- help/procedures/StartApp/postface.md | 36 +- .../StartApplicationServers/postface.md | 31 +- .../StartApplicationServers/token.txt | 2 +- help/procedures/StartCluster/postface.md | 31 +- help/procedures/StartCluster/token.txt | 2 +- .../StartDeploymentManager/postface.md | 31 +- .../StartDeploymentManager/token.txt | 2 +- help/procedures/StartNode/postface.md | 31 +- help/procedures/StartNode/token.txt | 2 +- help/procedures/StopApp/postface.md | 36 +- .../StopApplicationServers/postface.md | 31 +- .../StopApplicationServers/token.txt | 2 +- help/procedures/StopCluster/postface.md | 31 +- help/procedures/StopCluster/token.txt | 2 +- .../StopDeploymentManager/postface.md | 31 +- .../StopDeploymentManager/token.txt | 2 +- help/procedures/StopNode/postface.md | 31 +- help/procedures/StopNode/token.txt | 2 +- help/procedures/SyncNodes/token.txt | 2 +- help/procedures/UndeployApp/postface.md | 35 +- help/procedures/UpdateApp/postface.md | 36 +- .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../checknodestatusparameters.png} | Bin .../checkpagestatus1.png} | Bin .../checkpagestatus2.png} | Bin .../checkpagestatus3.png} | Bin .../checkpagestatus4.png} | Bin .../checkpagestatus5.png} | Bin .../checkpagestatus6.png} | Bin .../parameterstoenter.png} | Bin .../parameterstoenterblank.png} | Bin .../1.png | Bin .../11.png | Bin .../12.png | Bin .../13.png | Bin .../2.png | Bin .../22.png | Bin .../cssparameters.png} | Bin htdocs/images/{Cleanup => cleanup}/1.png | Bin htdocs/images/{Cleanup => cleanup}/2.png | Bin htdocs/images/{Clone => clone}/1.png | Bin .../images/{Config => config}/parameters.png | Bin .../ec-websphereconfigejbcontainer1.png} | Bin .../ec-websphereconfigejbcontainer2.png} | Bin .../ec-websphereconfigejbcontainer3.png} | Bin .../ec-websphereconfigejbcontainer4.png} | Bin .../ec-websphereconfiguresession2.png} | Bin .../ec-websphereconfiguresession3.png} | Bin .../ec-websphereconfiguresession4.png} | Bin htdocs/images/{Create => create}/1.png | Bin htdocs/images/{Create => create}/2.png | Bin htdocs/images/{Create => create}/3.png | Bin htdocs/images/{Create => create}/4.png | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../ec-webspherecreatecluster1.png} | Bin .../ec-webspherecreatecluster2.png} | Bin .../ec-webspherecreatecluster3.png} | Bin .../ec-webspherecreatecluster4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../1.png | Bin .../2.png | Bin .../22.png | Bin .../3.png | Bin .../33.png | Bin .../4.png | Bin .../44.png | Bin .../5.png | Bin .../55.png | Bin .../editconfig.png} | Bin .../newconfig.png} | Bin .../ec-webspherecreatedatasource1.png} | Bin .../ec-webspherecreatedatasource2.png} | Bin .../ec-webspherecreatedatasource3.png} | Bin .../ec-webspherecreatedatasource4.png} | Bin ...-webspherecreateendtoendmailprovider1.png} | Bin ...-webspherecreateendtoendmailprovider2.png} | Bin ...-webspherecreateendtoendmailprovider3.png} | Bin ...-webspherecreateendtoendmailprovider4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../ec-webspherecreatejdbcprovider1.png} | Bin .../ec-webspherecreatejdbcprovider2.png} | Bin .../ec-webspherecreatejdbcprovider3.png} | Bin .../ec-webspherecreatejdbcprovider4.png} | Bin .../ec-webspherecreatejmsprovider1.png} | Bin .../ec-webspherecreatejmsprovider2.png} | Bin .../ec-webspherecreatemailsession1.png} | Bin .../ec-webspherecreatemailsession2.png} | Bin .../ec-webspherecreatemailsession3.png} | Bin .../ec-webspherecreatemailsession4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../1.png | Bin .../2.png | Bin .../3.png | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../ec-webspheredeletecluster1.png} | Bin .../ec-webspheredeletecluster2.png} | Bin .../ec-webspheredeletecluster3.png} | Bin .../ec-webspheredeletecluster4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../ec-webspheredeletedatasource1.png} | Bin .../ec-webspheredeletedatasource2.png} | Bin .../ec-webspheredeletedatasource3.png} | Bin .../ec-webspheredeletedatasource4.png} | Bin .../ec-webspheredeletejdbcprovider1.png} | Bin .../ec-webspheredeletejdbcprovider2.png} | Bin .../ec-webspheredeletejdbcprovider3.png} | Bin .../ec-webspheredeletejdbcprovider4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../procedureconfig.png} | Bin .../procedurelog.png} | Bin .../procedureresult.png} | Bin htdocs/images/{DeployApp => deployapp}/1.png | Bin .../deployapp1.png} | Bin .../deployapp2.png} | Bin .../deployapp3.png} | Bin .../deployapp4.png} | Bin .../ec-webspheredeployenterpriseapp1.png} | Bin .../ec-webspheredeployenterpriseapp2.png} | Bin .../ec-webspheredeployenterpriseapp3.png} | Bin .../ec-webspheredeployenterpriseapp4.png} | Bin .../ec-webspheredeployosgi1.png} | Bin .../ec-webspheredeployosgi2.png} | Bin .../ec-webspheredeployosgi3.png} | Bin .../ec-webspheredeployosgi4.png} | Bin htdocs/images/{Export => export}/1.png | Bin htdocs/images/{Export => export}/2.png | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../1.png | Bin .../2.png | Bin .../3.png | Bin htdocs/images/{Import => import}/1.png | Bin htdocs/images/{Import => import}/2.png | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../ec-webspheremapsharedlibrary2.png} | Bin .../ec-webspheremapsharedlibrary3.png} | Bin .../ec-webspheremapsharedlibrary4.png} | Bin ...ebspheremodifyapplicationclassloader2.png} | Bin ...ebspheremodifyapplicationclassloader3.png} | Bin ...ebspheremodifyapplicationclassloader4.png} | Bin htdocs/images/{PowerOff => poweroff}/1.png | Bin htdocs/images/{PowerOff => poweroff}/2.png | Bin htdocs/images/{PowerOn => poweron}/1.png | Bin htdocs/images/{PowerOn => poweron}/2.png | Bin .../ec-webspherepublishwsdl1.png} | Bin .../ec-webspherepublishwsdl2.png} | Bin .../images/{RegisterVM => registervm}/1.png | Bin .../images/{RegisterVM => registervm}/2.png | Bin htdocs/images/{Relocate => relocate}/1.png | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin htdocs/images/{Revert => revert}/1.png | Bin htdocs/images/{Revert => revert}/2.png | Bin .../{RunCustomJob => runcustomjob}/1.png | Bin .../{RunCustomJob => runcustomjob}/11.png | Bin .../{RunCustomJob => runcustomjob}/2.png | Bin .../{RunCustomJob => runcustomjob}/22.png | Bin .../{RunCustomJob => runcustomjob}/3.png | Bin .../runcustomjob1.png} | Bin .../runcustomjob2.png} | Bin .../runcustomjob3.png} | Bin .../runcustomjob4.png} | Bin .../runcustomjob5.png} | Bin .../runcustomjob6.png} | Bin htdocs/images/{Shutdown => shutdown}/1.png | Bin htdocs/images/{Shutdown => shutdown}/2.png | Bin htdocs/images/{Snapshot => snapshot}/1.png | Bin htdocs/images/{Snapshot => snapshot}/2.png | Bin htdocs/images/{StartApp => startapp}/1.png | Bin .../startApp1.png => startapp/startapp1.png} | Bin .../startApp2.png => startapp/startapp2.png} | Bin .../startApp3.png => startapp/startapp3.png} | Bin .../startApp4.png => startapp/startapp4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../images/{StartServer => startserver}/1.png | Bin .../{StartServer => startserver}/11.png | Bin .../images/{StartServer => startserver}/2.png | Bin .../{StartServer => startserver}/22.png | Bin .../images/{StartServer => startserver}/3.png | Bin .../images/{StartServer => startserver}/4.png | Bin .../jobdetail.png | Bin .../{StartServer => startserver}/loginfo.png | Bin .../parameters.png | Bin .../pickStep.png => startserver/pickstep.png} | Bin htdocs/images/{StopApp => stopapp}/1.png | Bin .../stopApp1.png => stopapp/stopapp1.png} | Bin .../stopApp2.png => stopapp/stopapp2.png} | Bin .../stopApp3.png => stopapp/stopapp3.png} | Bin .../stopApp4.png => stopapp/stopapp4.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../pipelineconfig.png} | Bin .../pipelinelog.png} | Bin .../pipelinepicker.png} | Bin .../pipelineresult.png} | Bin .../images/{StopServer => stopserver}/1.png | Bin .../images/{StopServer => stopserver}/11.png | Bin .../images/{StopServer => stopserver}/12.png | Bin .../images/{StopServer => stopserver}/22.png | Bin .../{StopServer => stopserver}/parameters.png | Bin .../{StopServer => stopserver}/step.png | Bin htdocs/images/{Suspend => suspend}/1.png | Bin htdocs/images/{Suspend => suspend}/2.png | Bin .../syncnodesparameters.png} | Bin .../images/{UndeployApp => undeployapp}/1.png | Bin .../undeployapp1.png} | Bin .../undeployapp2.png} | Bin .../undeployapp3.png} | Bin .../undeployapp4.png} | Bin .../ec-websphereupdateapp1.png} | Bin .../ec-websphereupdateapp2.png} | Bin .../ec-websphereupdateapp3.png} | Bin .../ec-websphereupdateapp4.png} | Bin pages/EC-WebSphere_help.xml | 6824 +---------------- src/main/resources/META-INF/plugin.xml | 1 + .../project/parameterForms/CheckApp.xml | 4 +- .../parameterForms/CheckNodeStatus.xml | 4 +- .../parameterForms/CheckPageStatus.xml | 2 +- .../parameterForms/CheckServerStatus.xml | 4 +- .../parameterForms/Cluster/CreateCluster.xml | 4 +- .../Cluster/CreateClusterMembers.xml | 4 +- .../Cluster/CreateFirstClusterMember.xml | 4 +- .../parameterForms/Cluster/DeleteCluster.xml | 4 +- .../Cluster/ListClusterMembers.xml | 4 +- .../Cluster/RemoveClusterMembers.xml | 4 +- .../parameterForms/Cluster/StartCluster.xml | 4 +- .../parameterForms/Cluster/StopCluster.xml | 4 +- .../parameterForms/ConfigureEJBContainer.xml | 4 +- .../ConfigureSessionManagement.xml | 4 +- .../parameterForms/CreateDatasource.xml | 4 +- .../CreateEndToEndMailProvider.xml | 4 +- .../parameterForms/CreateJDBCProvider.xml | 4 +- .../parameterForms/CreateJMSProvider.xml | 4 +- .../parameterForms/CreateMailSession.xml | 4 +- .../parameterForms/DeleteDatasource.xml | 4 +- .../parameterForms/DeleteJDBCProvider.xml | 4 +- .../project/parameterForms/DeployApp.xml | 4 +- .../parameterForms/DeployEnterpriseApp.xml | 4 +- .../project/parameterForms/DeployOSGi.xml | 4 +- .../JMS/CreateOrUpdateJMSQueue.xml | 4 +- .../JMS/CreateOrUpdateJMSTopic.xml | 4 +- .../CreateOrUpdateSIBJMSActivationSpec.xml | 4 +- .../CreateOrUpdateSIBJMSConnectionFactory.xml | 4 +- .../CreateOrUpdateWMQJMSActivationSpec.xml | 4 +- .../CreateOrUpdateWMQJMSConnectionFactory.xml | 4 +- .../JMS/DeleteJMSActivationSpec.xml | 4 +- .../JMS/DeleteJMSConnectionFactory.xml | 4 +- .../parameterForms/JMS/DeleteJMSProvider.xml | 4 +- .../parameterForms/JMS/DeleteJMSQueue.xml | 4 +- .../parameterForms/JMS/DeleteJMSTopic.xml | 4 +- .../Management/StartDeploymentManager.xml | 4 +- .../parameterForms/Management/StartNode.xml | 4 +- .../Management/StopDeploymentManager.xml | 4 +- .../parameterForms/Management/StopNode.xml | 4 +- .../parameterForms/MapSharedLibrary.xml | 4 +- .../ModifyApplicationClassLoader.xml | 4 +- .../project/parameterForms/PublishWSDL.xml | 4 +- .../project/parameterForms/RunCustomJob.xml | 4 +- .../Server/CreateApplicationServer.xml | 4 +- .../CreateApplicationServerTemplate.xml | 4 +- .../Server/DeleteApplicationServer.xml | 4 +- .../DeleteApplicationServerTemplate.xml | 4 +- .../Server/ExportApplicationServer.xml | 4 +- .../Server/ImportApplicationServer.xml | 4 +- .../Server/StartApplicationServers.xml | 4 +- .../Server/StopApplicationServers.xml | 4 +- .../project/parameterForms/StartApp.xml | 4 +- .../project/parameterForms/StartServer.xml | 2 +- .../project/parameterForms/StopApp.xml | 4 +- .../project/parameterForms/StopServer.xml | 4 +- .../project/parameterForms/SyncNodes.xml | 4 +- .../project/parameterForms/UndeployApp.xml | 4 +- .../project/parameterForms/UpdateApp.xml | 4 +- 463 files changed, 6420 insertions(+), 7879 deletions(-) create mode 100644 help/help.adoc rename htdocs/images/{CheckApp/PipelineConfig.png => checkapp/pipelineconfig.png} (100%) rename htdocs/images/{CheckApp/PipelinePicker.png => checkapp/pipelinepicker.png} (100%) rename htdocs/images/{CheckApp/PipelineResult.png => checkapp/pipelineresult.png} (100%) rename htdocs/images/{CheckApp/ProcedureConfig.png => checkapp/procedureconfig.png} (100%) rename htdocs/images/{CheckApp/ProcedureLog.png => checkapp/procedurelog.png} (100%) rename htdocs/images/{CheckApp/ProcedureResult.png => checkapp/procedureresult.png} (100%) rename htdocs/images/{CheckNodeStatus/CheckNodeStatusParameters.png => checknodestatus/checknodestatusparameters.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus1.png => checkpagestatus/checkpagestatus1.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus2.png => checkpagestatus/checkpagestatus2.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus3.png => checkpagestatus/checkpagestatus3.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus4.png => checkpagestatus/checkpagestatus4.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus5.png => checkpagestatus/checkpagestatus5.png} (100%) rename htdocs/images/{CheckPageStatus/checkPageStatus6.png => checkpagestatus/checkpagestatus6.png} (100%) rename htdocs/images/{CheckPageStatus/parametersToEnter.png => checkpagestatus/parameterstoenter.png} (100%) rename htdocs/images/{CheckPageStatus/parametersToEnterBlank.png => checkpagestatus/parameterstoenterblank.png} (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/1.png (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/11.png (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/12.png (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/13.png (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/2.png (100%) rename htdocs/images/{CheckServerStatus => checkserverstatus}/22.png (100%) rename htdocs/images/{CheckServerStatus/CSSparameters.png => checkserverstatus/cssparameters.png} (100%) rename htdocs/images/{Cleanup => cleanup}/1.png (100%) rename htdocs/images/{Cleanup => cleanup}/2.png (100%) rename htdocs/images/{Clone => clone}/1.png (100%) rename htdocs/images/{Config => config}/parameters.png (100%) rename htdocs/images/{ConfigEJBContainer/EC-WebSphereConfigEJBContainer1.png => configejbcontainer/ec-websphereconfigejbcontainer1.png} (100%) rename htdocs/images/{ConfigEJBContainer/EC-WebSphereConfigEJBContainer2.png => configejbcontainer/ec-websphereconfigejbcontainer2.png} (100%) rename htdocs/images/{ConfigEJBContainer/EC-WebSphereConfigEJBContainer3.png => configejbcontainer/ec-websphereconfigejbcontainer3.png} (100%) rename htdocs/images/{ConfigEJBContainer/EC-WebSphereConfigEJBContainer4.png => configejbcontainer/ec-websphereconfigejbcontainer4.png} (100%) rename htdocs/images/{ConfigureSession/EC-WebSphereConfigureSession2.png => configuresession/ec-websphereconfiguresession2.png} (100%) rename htdocs/images/{ConfigureSession/EC-WebSphereConfigureSession3.png => configuresession/ec-websphereconfiguresession3.png} (100%) rename htdocs/images/{ConfigureSession/EC-WebSphereConfigureSession4.png => configuresession/ec-websphereconfiguresession4.png} (100%) rename htdocs/images/{Create => create}/1.png (100%) rename htdocs/images/{Create => create}/2.png (100%) rename htdocs/images/{Create => create}/3.png (100%) rename htdocs/images/{Create => create}/4.png (100%) rename htdocs/images/{CreateApplicationServer/PipelineConfig.png => createapplicationserver/pipelineconfig.png} (100%) rename htdocs/images/{CreateApplicationServer/PipelineLog.png => createapplicationserver/pipelinelog.png} (100%) rename htdocs/images/{CreateApplicationServer/PipelinePicker.png => createapplicationserver/pipelinepicker.png} (100%) rename htdocs/images/{CreateApplicationServer/PipelineResult.png => createapplicationserver/pipelineresult.png} (100%) rename htdocs/images/{CreateApplicationServerTemplate/PipelineConfig.png => createapplicationservertemplate/pipelineconfig.png} (100%) rename htdocs/images/{CreateApplicationServerTemplate/PipelineLog.png => createapplicationservertemplate/pipelinelog.png} (100%) rename htdocs/images/{CreateApplicationServerTemplate/PipelinePicker.png => createapplicationservertemplate/pipelinepicker.png} (100%) rename htdocs/images/{CreateApplicationServerTemplate/PipelineResult.png => createapplicationservertemplate/pipelineresult.png} (100%) rename htdocs/images/{CreateCluster/EC-WebSphereCreateCluster1.png => createcluster/ec-webspherecreatecluster1.png} (100%) rename htdocs/images/{CreateCluster/EC-WebSphereCreateCluster2.png => createcluster/ec-webspherecreatecluster2.png} (100%) rename htdocs/images/{CreateCluster/EC-WebSphereCreateCluster3.png => createcluster/ec-webspherecreatecluster3.png} (100%) rename htdocs/images/{CreateCluster/EC-WebSphereCreateCluster4.png => createcluster/ec-webspherecreatecluster4.png} (100%) rename htdocs/images/{CreateCluster/PipelineConfig.png => createcluster/pipelineconfig.png} (100%) rename htdocs/images/{CreateCluster/PipelineLog.png => createcluster/pipelinelog.png} (100%) rename htdocs/images/{CreateCluster/PipelinePicker.png => createcluster/pipelinepicker.png} (100%) rename htdocs/images/{CreateCluster/PipelineResult.png => createcluster/pipelineresult.png} (100%) rename htdocs/images/{CreateClusterMembers/PipelineConfig.png => createclustermembers/pipelineconfig.png} (100%) rename htdocs/images/{CreateClusterMembers/PipelineLog.png => createclustermembers/pipelinelog.png} (100%) rename htdocs/images/{CreateClusterMembers/PipelinePicker.png => createclustermembers/pipelinepicker.png} (100%) rename htdocs/images/{CreateClusterMembers/PipelineResult.png => createclustermembers/pipelineresult.png} (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/1.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/2.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/22.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/3.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/33.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/4.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/44.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/5.png (100%) rename htdocs/images/{CreateConfiguration => createconfiguration}/55.png (100%) rename htdocs/images/{CreateConfiguration/EditConfig.png => createconfiguration/editconfig.png} (100%) rename htdocs/images/{CreateConfiguration/NewConfig.png => createconfiguration/newconfig.png} (100%) rename htdocs/images/{CreateDatasource/EC-WebSphereCreateDatasource1.png => createdatasource/ec-webspherecreatedatasource1.png} (100%) rename htdocs/images/{CreateDatasource/EC-WebSphereCreateDatasource2.png => createdatasource/ec-webspherecreatedatasource2.png} (100%) rename htdocs/images/{CreateDatasource/EC-WebSphereCreateDatasource3.png => createdatasource/ec-webspherecreatedatasource3.png} (100%) rename htdocs/images/{CreateDatasource/EC-WebSphereCreateDatasource4.png => createdatasource/ec-webspherecreatedatasource4.png} (100%) rename htdocs/images/{CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider1.png => createendtoendmailprovider/ec-webspherecreateendtoendmailprovider1.png} (100%) rename htdocs/images/{CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider2.png => createendtoendmailprovider/ec-webspherecreateendtoendmailprovider2.png} (100%) rename htdocs/images/{CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider3.png => createendtoendmailprovider/ec-webspherecreateendtoendmailprovider3.png} (100%) rename htdocs/images/{CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider4.png => createendtoendmailprovider/ec-webspherecreateendtoendmailprovider4.png} (100%) rename htdocs/images/{CreateFirstClusterMember/PipelineConfig.png => createfirstclustermember/pipelineconfig.png} (100%) rename htdocs/images/{CreateFirstClusterMember/PipelineLog.png => createfirstclustermember/pipelinelog.png} (100%) rename htdocs/images/{CreateFirstClusterMember/PipelinePicker.png => createfirstclustermember/pipelinepicker.png} (100%) rename htdocs/images/{CreateFirstClusterMember/PipelineResult.png => createfirstclustermember/pipelineresult.png} (100%) rename htdocs/images/{CreateJDBCProvider/EC-WebSphereCreateJDBCProvider1.png => createjdbcprovider/ec-webspherecreatejdbcprovider1.png} (100%) rename htdocs/images/{CreateJDBCProvider/EC-WebSphereCreateJDBCProvider2.png => createjdbcprovider/ec-webspherecreatejdbcprovider2.png} (100%) rename htdocs/images/{CreateJDBCProvider/EC-WebSphereCreateJDBCProvider3.png => createjdbcprovider/ec-webspherecreatejdbcprovider3.png} (100%) rename htdocs/images/{CreateJDBCProvider/EC-WebSphereCreateJDBCProvider4.png => createjdbcprovider/ec-webspherecreatejdbcprovider4.png} (100%) rename htdocs/images/{CreateJMSProvider/EC-WebSphereCreateJMSProvider1.png => createjmsprovider/ec-webspherecreatejmsprovider1.png} (100%) rename htdocs/images/{CreateJMSProvider/EC-WebSphereCreateJMSProvider2.png => createjmsprovider/ec-webspherecreatejmsprovider2.png} (100%) rename htdocs/images/{CreateMailSession/EC-WebSphereCreateMailSession1.png => createmailsession/ec-webspherecreatemailsession1.png} (100%) rename htdocs/images/{CreateMailSession/EC-WebSphereCreateMailSession2.png => createmailsession/ec-webspherecreatemailsession2.png} (100%) rename htdocs/images/{CreateMailSession/EC-WebSphereCreateMailSession3.png => createmailsession/ec-webspherecreatemailsession3.png} (100%) rename htdocs/images/{CreateMailSession/EC-WebSphereCreateMailSession4.png => createmailsession/ec-webspherecreatemailsession4.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/PipelineConfig.png => createorupdatejmsqueue/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/PipelinePicker.png => createorupdatejmsqueue/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/PipelineResult.png => createorupdatejmsqueue/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/ProcedureConfig.png => createorupdatejmsqueue/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/ProcedureLog.png => createorupdatejmsqueue/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateJMSQueue/ProcedureResult.png => createorupdatejmsqueue/procedureresult.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/PipelineConfig.png => createorupdatejmstopic/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/PipelinePicker.png => createorupdatejmstopic/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/PipelineResult.png => createorupdatejmstopic/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/ProcedureConfig.png => createorupdatejmstopic/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/ProcedureLog.png => createorupdatejmstopic/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateJMSTopic/ProcedureResult.png => createorupdatejmstopic/procedureresult.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/PipelineConfig.png => createorupdatesibjmsactivationspec/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/PipelinePicker.png => createorupdatesibjmsactivationspec/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/PipelineResult.png => createorupdatesibjmsactivationspec/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/ProcedureConfig.png => createorupdatesibjmsactivationspec/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/ProcedureLog.png => createorupdatesibjmsactivationspec/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSActivationSpec/ProcedureResult.png => createorupdatesibjmsactivationspec/procedureresult.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/PipelineConfig.png => createorupdatesibjmsconnectionfactory/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/PipelinePicker.png => createorupdatesibjmsconnectionfactory/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/PipelineResult.png => createorupdatesibjmsconnectionfactory/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/ProcedureConfig.png => createorupdatesibjmsconnectionfactory/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/ProcedureLog.png => createorupdatesibjmsconnectionfactory/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateSIBJMSConnectionFactory/ProcedureResult.png => createorupdatesibjmsconnectionfactory/procedureresult.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/PipelineConfig.png => createorupdatewmqjmsactivationspec/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/PipelinePicker.png => createorupdatewmqjmsactivationspec/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/PipelineResult.png => createorupdatewmqjmsactivationspec/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/ProcedureConfig.png => createorupdatewmqjmsactivationspec/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/ProcedureLog.png => createorupdatewmqjmsactivationspec/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSActivationSpec/ProcedureResult.png => createorupdatewmqjmsactivationspec/procedureresult.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/PipelineConfig.png => createorupdatewmqjmsconnectionfactory/pipelineconfig.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/PipelinePicker.png => createorupdatewmqjmsconnectionfactory/pipelinepicker.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/PipelineResult.png => createorupdatewmqjmsconnectionfactory/pipelineresult.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/ProcedureConfig.png => createorupdatewmqjmsconnectionfactory/procedureconfig.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/ProcedureLog.png => createorupdatewmqjmsconnectionfactory/procedurelog.png} (100%) rename htdocs/images/{CreateOrUpdateWMQJMSConnectionFactory/ProcedureResult.png => createorupdatewmqjmsconnectionfactory/procedureresult.png} (100%) rename htdocs/images/{CreateResourceFromVM => createresourcefromvm}/1.png (100%) rename htdocs/images/{CreateResourceFromVM => createresourcefromvm}/2.png (100%) rename htdocs/images/{CreateResourceFromVM => createresourcefromvm}/3.png (100%) rename htdocs/images/{DeleteApplicationServer/PipelineConfig.png => deleteapplicationserver/pipelineconfig.png} (100%) rename htdocs/images/{DeleteApplicationServer/PipelineLog.png => deleteapplicationserver/pipelinelog.png} (100%) rename htdocs/images/{DeleteApplicationServer/PipelinePicker.png => deleteapplicationserver/pipelinepicker.png} (100%) rename htdocs/images/{DeleteApplicationServer/PipelineResult.png => deleteapplicationserver/pipelineresult.png} (100%) rename htdocs/images/{DeleteApplicationServerTemplate/PipelineConfig.png => deleteapplicationservertemplate/pipelineconfig.png} (100%) rename htdocs/images/{DeleteApplicationServerTemplate/PipelineLog.png => deleteapplicationservertemplate/pipelinelog.png} (100%) rename htdocs/images/{DeleteApplicationServerTemplate/PipelinePicker.png => deleteapplicationservertemplate/pipelinepicker.png} (100%) rename htdocs/images/{DeleteApplicationServerTemplate/PipelineResult.png => deleteapplicationservertemplate/pipelineresult.png} (100%) rename htdocs/images/{DeleteCluster/EC-WebSphereDeleteCluster1.png => deletecluster/ec-webspheredeletecluster1.png} (100%) rename htdocs/images/{DeleteCluster/EC-WebSphereDeleteCluster2.png => deletecluster/ec-webspheredeletecluster2.png} (100%) rename htdocs/images/{DeleteCluster/EC-WebSphereDeleteCluster3.png => deletecluster/ec-webspheredeletecluster3.png} (100%) rename htdocs/images/{DeleteCluster/EC-WebSphereDeleteCluster4.png => deletecluster/ec-webspheredeletecluster4.png} (100%) rename htdocs/images/{DeleteCluster/PipelineConfig.png => deletecluster/pipelineconfig.png} (100%) rename htdocs/images/{DeleteCluster/PipelineLog.png => deletecluster/pipelinelog.png} (100%) rename htdocs/images/{DeleteCluster/PipelinePicker.png => deletecluster/pipelinepicker.png} (100%) rename htdocs/images/{DeleteCluster/PipelineResult.png => deletecluster/pipelineresult.png} (100%) rename htdocs/images/{DeleteDatasource/EC-WebSphereDeleteDatasource1.png => deletedatasource/ec-webspheredeletedatasource1.png} (100%) rename htdocs/images/{DeleteDatasource/EC-WebSphereDeleteDatasource2.png => deletedatasource/ec-webspheredeletedatasource2.png} (100%) rename htdocs/images/{DeleteDatasource/EC-WebSphereDeleteDatasource3.png => deletedatasource/ec-webspheredeletedatasource3.png} (100%) rename htdocs/images/{DeleteDatasource/EC-WebSphereDeleteDatasource4.png => deletedatasource/ec-webspheredeletedatasource4.png} (100%) rename htdocs/images/{DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider1.png => deletejdbcprovider/ec-webspheredeletejdbcprovider1.png} (100%) rename htdocs/images/{DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider2.png => deletejdbcprovider/ec-webspheredeletejdbcprovider2.png} (100%) rename htdocs/images/{DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider3.png => deletejdbcprovider/ec-webspheredeletejdbcprovider3.png} (100%) rename htdocs/images/{DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider4.png => deletejdbcprovider/ec-webspheredeletejdbcprovider4.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/PipelineConfig.png => deletejmsactivationspec/pipelineconfig.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/PipelineLog.png => deletejmsactivationspec/pipelinelog.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/PipelinePicker.png => deletejmsactivationspec/pipelinepicker.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/PipelineResult.png => deletejmsactivationspec/pipelineresult.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/ProcedureConfig.png => deletejmsactivationspec/procedureconfig.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/ProcedureLog.png => deletejmsactivationspec/procedurelog.png} (100%) rename htdocs/images/{DeleteJMSActivationSpec/ProcedureResult.png => deletejmsactivationspec/procedureresult.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/PipelineConfig.png => deletejmsconnectionfactory/pipelineconfig.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/PipelinePicker.png => deletejmsconnectionfactory/pipelinepicker.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/PipelineResult.png => deletejmsconnectionfactory/pipelineresult.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/ProcedureConfig.png => deletejmsconnectionfactory/procedureconfig.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/ProcedureLog.png => deletejmsconnectionfactory/procedurelog.png} (100%) rename htdocs/images/{DeleteJMSConnectionFactory/ProcedureResult.png => deletejmsconnectionfactory/procedureresult.png} (100%) rename htdocs/images/{DeleteJMSProvider/PipelineConfig.png => deletejmsprovider/pipelineconfig.png} (100%) rename htdocs/images/{DeleteJMSProvider/PipelinePicker.png => deletejmsprovider/pipelinepicker.png} (100%) rename htdocs/images/{DeleteJMSProvider/PipelineResult.png => deletejmsprovider/pipelineresult.png} (100%) rename htdocs/images/{DeleteJMSProvider/ProcedureConfig.png => deletejmsprovider/procedureconfig.png} (100%) rename htdocs/images/{DeleteJMSProvider/ProcedureLog.png => deletejmsprovider/procedurelog.png} (100%) rename htdocs/images/{DeleteJMSProvider/ProcedureResult.png => deletejmsprovider/procedureresult.png} (100%) rename htdocs/images/{DeleteJMSQueue/PipelineConfig.png => deletejmsqueue/pipelineconfig.png} (100%) rename htdocs/images/{DeleteJMSQueue/PipelinePicker.png => deletejmsqueue/pipelinepicker.png} (100%) rename htdocs/images/{DeleteJMSQueue/PipelineResult.png => deletejmsqueue/pipelineresult.png} (100%) rename htdocs/images/{DeleteJMSQueue/ProcedureConfig.png => deletejmsqueue/procedureconfig.png} (100%) rename htdocs/images/{DeleteJMSQueue/ProcedureLog.png => deletejmsqueue/procedurelog.png} (100%) rename htdocs/images/{DeleteJMSQueue/ProcedureResult.png => deletejmsqueue/procedureresult.png} (100%) rename htdocs/images/{DeleteJMSTopic/PipelineConfig.png => deletejmstopic/pipelineconfig.png} (100%) rename htdocs/images/{DeleteJMSTopic/PipelinePicker.png => deletejmstopic/pipelinepicker.png} (100%) rename htdocs/images/{DeleteJMSTopic/PipelineResult.png => deletejmstopic/pipelineresult.png} (100%) rename htdocs/images/{DeleteJMSTopic/ProcedureConfig.png => deletejmstopic/procedureconfig.png} (100%) rename htdocs/images/{DeleteJMSTopic/ProcedureLog.png => deletejmstopic/procedurelog.png} (100%) rename htdocs/images/{DeleteJMSTopic/ProcedureResult.png => deletejmstopic/procedureresult.png} (100%) rename htdocs/images/{DeployApp => deployapp}/1.png (100%) rename htdocs/images/{DeployApp/deployApp1.png => deployapp/deployapp1.png} (100%) rename htdocs/images/{DeployApp/deployApp2.png => deployapp/deployapp2.png} (100%) rename htdocs/images/{DeployApp/deployApp3.png => deployapp/deployapp3.png} (100%) rename htdocs/images/{DeployApp/deployApp4.png => deployapp/deployapp4.png} (100%) rename htdocs/images/{DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp1.png => deployenterpriseapp/ec-webspheredeployenterpriseapp1.png} (100%) rename htdocs/images/{DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp2.png => deployenterpriseapp/ec-webspheredeployenterpriseapp2.png} (100%) rename htdocs/images/{DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp3.png => deployenterpriseapp/ec-webspheredeployenterpriseapp3.png} (100%) rename htdocs/images/{DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp4.png => deployenterpriseapp/ec-webspheredeployenterpriseapp4.png} (100%) rename htdocs/images/{DeployOSGi/EC-WebSphereDeployOSGi1.png => deployosgi/ec-webspheredeployosgi1.png} (100%) rename htdocs/images/{DeployOSGi/EC-WebSphereDeployOSGi2.png => deployosgi/ec-webspheredeployosgi2.png} (100%) rename htdocs/images/{DeployOSGi/EC-WebSphereDeployOSGi3.png => deployosgi/ec-webspheredeployosgi3.png} (100%) rename htdocs/images/{DeployOSGi/EC-WebSphereDeployOSGi4.png => deployosgi/ec-webspheredeployosgi4.png} (100%) rename htdocs/images/{Export => export}/1.png (100%) rename htdocs/images/{Export => export}/2.png (100%) rename htdocs/images/{ExportApplicationServer/PipelineConfig.png => exportapplicationserver/pipelineconfig.png} (100%) rename htdocs/images/{ExportApplicationServer/PipelineLog.png => exportapplicationserver/pipelinelog.png} (100%) rename htdocs/images/{ExportApplicationServer/PipelinePicker.png => exportapplicationserver/pipelinepicker.png} (100%) rename htdocs/images/{ExportApplicationServer/PipelineResult.png => exportapplicationserver/pipelineresult.png} (100%) rename htdocs/images/{GetVMConfiguration => getvmconfiguration}/1.png (100%) rename htdocs/images/{GetVMConfiguration => getvmconfiguration}/2.png (100%) rename htdocs/images/{GetVMConfiguration => getvmconfiguration}/3.png (100%) rename htdocs/images/{Import => import}/1.png (100%) rename htdocs/images/{Import => import}/2.png (100%) rename htdocs/images/{ImportApplicationServer/PipelineConfig.png => importapplicationserver/pipelineconfig.png} (100%) rename htdocs/images/{ImportApplicationServer/PipelineLog.png => importapplicationserver/pipelinelog.png} (100%) rename htdocs/images/{ImportApplicationServer/PipelinePicker.png => importapplicationserver/pipelinepicker.png} (100%) rename htdocs/images/{ImportApplicationServer/PipelineResult.png => importapplicationserver/pipelineresult.png} (100%) rename htdocs/images/{ListClusterMembers/PipelineConfig.png => listclustermembers/pipelineconfig.png} (100%) rename htdocs/images/{ListClusterMembers/PipelineLog.png => listclustermembers/pipelinelog.png} (100%) rename htdocs/images/{ListClusterMembers/PipelinePicker.png => listclustermembers/pipelinepicker.png} (100%) rename htdocs/images/{ListClusterMembers/PipelineResult.png => listclustermembers/pipelineresult.png} (100%) rename htdocs/images/{MapSharedLibrary/EC-WebSphereMapSharedLibrary2.png => mapsharedlibrary/ec-webspheremapsharedlibrary2.png} (100%) rename htdocs/images/{MapSharedLibrary/EC-WebSphereMapSharedLibrary3.png => mapsharedlibrary/ec-webspheremapsharedlibrary3.png} (100%) rename htdocs/images/{MapSharedLibrary/EC-WebSphereMapSharedLibrary4.png => mapsharedlibrary/ec-webspheremapsharedlibrary4.png} (100%) rename htdocs/images/{ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader2.png => modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader2.png} (100%) rename htdocs/images/{ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader3.png => modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader3.png} (100%) rename htdocs/images/{ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader4.png => modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader4.png} (100%) rename htdocs/images/{PowerOff => poweroff}/1.png (100%) rename htdocs/images/{PowerOff => poweroff}/2.png (100%) rename htdocs/images/{PowerOn => poweron}/1.png (100%) rename htdocs/images/{PowerOn => poweron}/2.png (100%) rename htdocs/images/{PublishWSDL/EC-WebSpherePublishWSDL1.png => publishwsdl/ec-webspherepublishwsdl1.png} (100%) rename htdocs/images/{PublishWSDL/EC-WebSpherePublishWSDL2.png => publishwsdl/ec-webspherepublishwsdl2.png} (100%) rename htdocs/images/{RegisterVM => registervm}/1.png (100%) rename htdocs/images/{RegisterVM => registervm}/2.png (100%) rename htdocs/images/{Relocate => relocate}/1.png (100%) rename htdocs/images/{RemoveClusterMembers/PipelineConfig.png => removeclustermembers/pipelineconfig.png} (100%) rename htdocs/images/{RemoveClusterMembers/PipelineLog.png => removeclustermembers/pipelinelog.png} (100%) rename htdocs/images/{RemoveClusterMembers/PipelinePicker.png => removeclustermembers/pipelinepicker.png} (100%) rename htdocs/images/{RemoveClusterMembers/PipelineResult.png => removeclustermembers/pipelineresult.png} (100%) rename htdocs/images/{Revert => revert}/1.png (100%) rename htdocs/images/{Revert => revert}/2.png (100%) rename htdocs/images/{RunCustomJob => runcustomjob}/1.png (100%) rename htdocs/images/{RunCustomJob => runcustomjob}/11.png (100%) rename htdocs/images/{RunCustomJob => runcustomjob}/2.png (100%) rename htdocs/images/{RunCustomJob => runcustomjob}/22.png (100%) rename htdocs/images/{RunCustomJob => runcustomjob}/3.png (100%) rename htdocs/images/{RunCustomJob/runCustomJob1.png => runcustomjob/runcustomjob1.png} (100%) rename htdocs/images/{RunCustomJob/runCustomJob2.png => runcustomjob/runcustomjob2.png} (100%) rename htdocs/images/{RunCustomJob/runCustomJob3.png => runcustomjob/runcustomjob3.png} (100%) rename htdocs/images/{RunCustomJob/runCustomJob4.png => runcustomjob/runcustomjob4.png} (100%) rename htdocs/images/{RunCustomJob/runCustomJob5.png => runcustomjob/runcustomjob5.png} (100%) rename htdocs/images/{RunCustomJob/runCustomJob6.png => runcustomjob/runcustomjob6.png} (100%) rename htdocs/images/{Shutdown => shutdown}/1.png (100%) rename htdocs/images/{Shutdown => shutdown}/2.png (100%) rename htdocs/images/{Snapshot => snapshot}/1.png (100%) rename htdocs/images/{Snapshot => snapshot}/2.png (100%) rename htdocs/images/{StartApp => startapp}/1.png (100%) rename htdocs/images/{StartApp/startApp1.png => startapp/startapp1.png} (100%) rename htdocs/images/{StartApp/startApp2.png => startapp/startapp2.png} (100%) rename htdocs/images/{StartApp/startApp3.png => startapp/startapp3.png} (100%) rename htdocs/images/{StartApp/startApp4.png => startapp/startapp4.png} (100%) rename htdocs/images/{StartApplicationServers/PipelineConfig.png => startapplicationservers/pipelineconfig.png} (100%) rename htdocs/images/{StartApplicationServers/PipelineLog.png => startapplicationservers/pipelinelog.png} (100%) rename htdocs/images/{StartApplicationServers/PipelinePicker.png => startapplicationservers/pipelinepicker.png} (100%) rename htdocs/images/{StartApplicationServers/PipelineResult.png => startapplicationservers/pipelineresult.png} (100%) rename htdocs/images/{StartCluster/PipelineConfig.png => startcluster/pipelineconfig.png} (100%) rename htdocs/images/{StartCluster/PipelineLog.png => startcluster/pipelinelog.png} (100%) rename htdocs/images/{StartCluster/PipelinePicker.png => startcluster/pipelinepicker.png} (100%) rename htdocs/images/{StartCluster/PipelineResult.png => startcluster/pipelineresult.png} (100%) rename htdocs/images/{StartDeploymentManager/PipelineConfig.png => startdeploymentmanager/pipelineconfig.png} (100%) rename htdocs/images/{StartDeploymentManager/PipelineLog.png => startdeploymentmanager/pipelinelog.png} (100%) rename htdocs/images/{StartDeploymentManager/PipelinePicker.png => startdeploymentmanager/pipelinepicker.png} (100%) rename htdocs/images/{StartDeploymentManager/PipelineResult.png => startdeploymentmanager/pipelineresult.png} (100%) rename htdocs/images/{StartNode/PipelineConfig.png => startnode/pipelineconfig.png} (100%) rename htdocs/images/{StartNode/PipelineLog.png => startnode/pipelinelog.png} (100%) rename htdocs/images/{StartNode/PipelinePicker.png => startnode/pipelinepicker.png} (100%) rename htdocs/images/{StartNode/PipelineResult.png => startnode/pipelineresult.png} (100%) rename htdocs/images/{StartServer => startserver}/1.png (100%) rename htdocs/images/{StartServer => startserver}/11.png (100%) rename htdocs/images/{StartServer => startserver}/2.png (100%) rename htdocs/images/{StartServer => startserver}/22.png (100%) rename htdocs/images/{StartServer => startserver}/3.png (100%) rename htdocs/images/{StartServer => startserver}/4.png (100%) rename htdocs/images/{StartServer => startserver}/jobdetail.png (100%) rename htdocs/images/{StartServer => startserver}/loginfo.png (100%) rename htdocs/images/{StartServer => startserver}/parameters.png (100%) rename htdocs/images/{StartServer/pickStep.png => startserver/pickstep.png} (100%) rename htdocs/images/{StopApp => stopapp}/1.png (100%) rename htdocs/images/{StopApp/stopApp1.png => stopapp/stopapp1.png} (100%) rename htdocs/images/{StopApp/stopApp2.png => stopapp/stopapp2.png} (100%) rename htdocs/images/{StopApp/stopApp3.png => stopapp/stopapp3.png} (100%) rename htdocs/images/{StopApp/stopApp4.png => stopapp/stopapp4.png} (100%) rename htdocs/images/{StopApplicationServers/PipelineConfig.png => stopapplicationservers/pipelineconfig.png} (100%) rename htdocs/images/{StopApplicationServers/PipelineLog.png => stopapplicationservers/pipelinelog.png} (100%) rename htdocs/images/{StopApplicationServers/PipelinePicker.png => stopapplicationservers/pipelinepicker.png} (100%) rename htdocs/images/{StopApplicationServers/PipelineResult.png => stopapplicationservers/pipelineresult.png} (100%) rename htdocs/images/{StopCluster/PipelineConfig.png => stopcluster/pipelineconfig.png} (100%) rename htdocs/images/{StopCluster/PipelineLog.png => stopcluster/pipelinelog.png} (100%) rename htdocs/images/{StopCluster/PipelinePicker.png => stopcluster/pipelinepicker.png} (100%) rename htdocs/images/{StopCluster/PipelineResult.png => stopcluster/pipelineresult.png} (100%) rename htdocs/images/{StopDeploymentManager/PipelineConfig.png => stopdeploymentmanager/pipelineconfig.png} (100%) rename htdocs/images/{StopDeploymentManager/PipelineLog.png => stopdeploymentmanager/pipelinelog.png} (100%) rename htdocs/images/{StopDeploymentManager/PipelinePicker.png => stopdeploymentmanager/pipelinepicker.png} (100%) rename htdocs/images/{StopDeploymentManager/PipelineResult.png => stopdeploymentmanager/pipelineresult.png} (100%) rename htdocs/images/{StopNode/PipelineConfig.png => stopnode/pipelineconfig.png} (100%) rename htdocs/images/{StopNode/PipelineLog.png => stopnode/pipelinelog.png} (100%) rename htdocs/images/{StopNode/PipelinePicker.png => stopnode/pipelinepicker.png} (100%) rename htdocs/images/{StopNode/PipelineResult.png => stopnode/pipelineresult.png} (100%) rename htdocs/images/{StopServer => stopserver}/1.png (100%) rename htdocs/images/{StopServer => stopserver}/11.png (100%) rename htdocs/images/{StopServer => stopserver}/12.png (100%) rename htdocs/images/{StopServer => stopserver}/22.png (100%) rename htdocs/images/{StopServer => stopserver}/parameters.png (100%) rename htdocs/images/{StopServer => stopserver}/step.png (100%) rename htdocs/images/{Suspend => suspend}/1.png (100%) rename htdocs/images/{Suspend => suspend}/2.png (100%) rename htdocs/images/{SyncNodes/SyncNodesParameters.png => syncnodes/syncnodesparameters.png} (100%) rename htdocs/images/{UndeployApp => undeployapp}/1.png (100%) rename htdocs/images/{UndeployApp/undeployApp1.png => undeployapp/undeployapp1.png} (100%) rename htdocs/images/{UndeployApp/undeployApp2.png => undeployapp/undeployapp2.png} (100%) rename htdocs/images/{UndeployApp/undeployApp3.png => undeployapp/undeployapp3.png} (100%) rename htdocs/images/{UndeployApp/undeployApp4.png => undeployapp/undeployapp4.png} (100%) rename htdocs/images/{UpdateApp/EC-WebSphereUpdateApp1.png => updateapp/ec-websphereupdateapp1.png} (100%) rename htdocs/images/{UpdateApp/EC-WebSphereUpdateApp2.png => updateapp/ec-websphereupdateapp2.png} (100%) rename htdocs/images/{UpdateApp/EC-WebSphereUpdateApp3.png => updateapp/ec-websphereupdateapp3.png} (100%) rename htdocs/images/{UpdateApp/EC-WebSphereUpdateApp4.png => updateapp/ec-websphereupdateapp4.png} (100%) diff --git a/help/changelog.yaml b/help/changelog.yaml index e96918fd..91263f87 100644 --- a/help/changelog.yaml +++ b/help/changelog.yaml @@ -1,3 +1,5 @@ +3.8.1: + - The documentation has been migrated to the main documentation site. 3.8.0: - Add checking connection while creating a configuration. - Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved. @@ -15,55 +17,55 @@ 2.6.0: - | Following new procedures have been added to support management of clusters: - + + * link:#CreateFirstClusterMember[CreateFirstClusterMember] + * link:#CreateClusterMembers[CreateClusterMembers] + The Interface for the Following procedures have been Improved (for moving WSADMIN path to configuration, decoupling Application deployment from Start, Ability to sync nodes etc.,) - + + * link:#StartCluster[StartCluster] + * link:#StopCluster[StopCluster] + * link:#CreateCluster[CreateCluster] + * link:#DeleteCluster[DeleteCluster] + * link:#ListClusterMembers[ListClusterMembers] + * link:#ListClusterMembers[RemoveClusterMembers] + Error Reporting has been improved by leveraging postp to capture granular error messages in Diagnostics. 2.5.0: - | Following New procedures have been added to support application server management: - -
                            • Following New procedures have been added to support start and stop of Node and Deployment Manager:
                            • - -
                            • WSAdmin Absolute path has been changed from non-required to required in plugin configuration.
                            • + + * link:#CreateApplicationServer[CreateApplicationServer] + * link:#DeleteApplicationServer[DeleteApplicationServer] + * link:#CreateApplicationServerTemplate[CreateApplicationServerTemplate] + * link:#DeleteApplicationServerTemplate[DeleteApplicationServerTemplate] + * link:#ExportApplicationServer[ExportApplicationServer] + * link:#ImportApplicationServer[ImportApplicationServer] + * link:#StartApplicationServers[StartApplicationServers] + * link:#StopApplicationServers[StopApplicationServers] + + Following New procedures have been added to support start and stop of Node and Deployment Manager: + + * link:#StartDeploymentManager[StartDeploymentManager] + * link:#StopDeploymentManager[StopDeploymentManager] + * link:#StartNode[StartNode] + * link:#StopNode[StopNode] + + WSAdmin Absolute path has been changed from non-required to required in plugin configuration. 2.4.1: - Configured the plugin to allow the ElectricFlow UI to create configs inline of procedure form. 2.4.0: - | Following New procedures have been added to support the entire set of IBM JMS functionality: - + + * link:#CreateOrUpdateSIBJMSActivationSpec[CreateOrUpdateSIBJMSActivationSpec] + * link:#CreateOrUpdateWMQJMSActivationSpec[CreateOrUpdateWMQJMSActivationSpec] + * link:#CreateOrUpdateSIBJMSConnectionFactory[CreateOrUpdateSIBJMSConnectionFactory] + * link:#CreateOrUpdateWMQJMSConnectionFactory[CreateOrUpdateWMQJMSConnectionFactory] + * link:#DeleteJMSActivationSpec[DeleteJMSActivationSpec] + * link:#DeleteJMSConnectionFactory[DeleteJMSConnectionFactory] + * link:#DeleteJMSProvider[DeleteJMSProvider] + 2.3.1: - Help links have been updated for DeleteJMSTopic and DeleteJMSQueue procedures. - Configured the plugin to allow the ElectricFlow UI to render the plugin procedure parameters entirely using the configured form XMLs. @@ -71,56 +73,45 @@ 2.3.0: - | Following New procedures have been added: - - -
                            • - Fixed non-ascii characters in plugin forms. -
                            • -
                            • - Following procedures have been extended to support Websphere 9.0: - -
                            • -
                            • The Debug Level checkbox has been changed to a dropdown. The level will be defaulted to INFO if no value is chosen.
                            • -
                            • - WSAdmin Absolute Path has been added to configuration and made as an optional parameter for all the following procedures: - -
                            • -
                            • - DeployEnterpriseApp -
                                -
                              • - Fixed an issue when application was not started on all servers during deployment if server name and node name are the same. -
                              • -
                              -
                            • -
                            • - CreateJDBCProvider -
                                -
                              • - Fixed an error with attached credentials when in some cases it was not possible to create new JDBC provider. -
                              • -
                              -
                            • -
                            • - CheckApp -
                                -
                              • Procedure has been improved and now it could check for different application states.
                              • -
                              + + * link:#DeleteJMSQueue[DeleteJMSQueue] + * link:#DeleteJMSTopic[DeleteJMSTopic] + * link:#CreateOrUpdateJMSQueue[CreateOrUpdateJMSQueue] + * link:#CreateOrUpdateJMSTopic[CreateOrUpdateJMSTopic] + + Fixed non-ascii characters in plugin forms. + + + Following procedures have been extended to support Websphere 9.0: + + * link:#StartApp[StartApp] + * link:#StopApp[StopApp] + * link:#StopCluster[StopCluster] + + + The Debug Level checkbox has been changed to a dropdown. The level will be defaulted to INFO if no value is chosen. + + WSAdmin Absolute Path has been added to configuration and made as an optional parameter for all the following procedures: + + * link:#CreateJMSProvider[CreateJMSProvider] + * link:#RunCustomJob[RunCustomJob] + * link:#DeployEnterpriseApp[DeployEnterpriseApp] + * link:#CreateJDBCProvider[CreateJDBCProvider] + * link:#CheckApp[CheckApp] + + link:#DeployEnterpriseApp[DeployEnterpriseApp] + + + Fixed an issue when application was not started on all servers during deployment if server name and node name are the same. + + link:#CreateJDBCProvider[CreateJDBCProvider] + + Fixed an error with attached credentials when in some cases it was not possible to create new JDBC provider. + + link:#CheckApp[CheckApp] + + Procedure has been improved and now it could check for different application states. + 2.2.4: - Documentation has been improved. - Cluster Scope field has been added to CreateJDBCProvider procedure. @@ -133,10 +124,10 @@ - Added new procedures - SyncNodes, CheckNodeStatus. - | Added following optional parameters to DeployEnterpriseApplication procedure: -
                                -
                              • "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default.
                              • -
                              • "Start application": Start the deployed application after deploying the application. Enabled by default.
                              • -
                              + + * "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default. + * "Start application": Start the deployed application after deploying the application. Enabled by default. + - Changed default value for "Distribute application" from unchecked to checked. (Deploy Enterprise Application procedure). 2.2.1: - Added new procedures - StartCluster, StopCluster, MapSharedLibrary, ModifyApplicationClassLoader. @@ -172,7 +163,7 @@ 2.0.5: - Fix minor bugs. 2.0.4: - - Add four new procedures: CreateDatasources, DeleteDatasources, CreateJDBCProviders, and DeleteJDBCProviders. + - 'Add four new procedures: CreateDatasources, DeleteDatasources, CreateJDBCProviders, and DeleteJDBCProviders.' - Fix minor bugs. 2.0.3: - Change the procedure names in the step picker section. diff --git a/help/help.adoc b/help/help.adoc new file mode 100644 index 00000000..ea828340 --- /dev/null +++ b/help/help.adoc @@ -0,0 +1,4773 @@ +Plugin version @PLUGIN_VERSION@ + +Revised on September 21, 2020 + + + + + +== Overview + +== {CD} Integration to WebSphere + +You can use this plugin to interact with an IBM +WebSphere Server. You can start and stop the server. +You can also manage applications within the server (start, +deploy, undeploy, stop or custom task) using the provided +WebSphere scripts in the *bin* directory under +the installation home directory (wsadmin, startServer, +stopServer). You can run Jython scripts that are +provided by the user or defined when a procedure is +created. + +== Integrated Version + +The plugin was tested on following WebSphere versions: + +* WAS and WASND 9.0 on Linux and Windows +* WAS and WASND 8.5.5 on Linux and Windows +* WAS and WASND 8.5.0 on Linux and Windows +* WAS and WASND 8.0 on Linux and Windows +* WAS 7.0 on Linux and Windows. + Beginning Release 2.4 we do not certify this plugin on the 7.0 version of WAS considering that this version is not actively supported by IBM since April 2018. + Please refer to this https://www-01.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/3/897/ENUS916-143/index.html&lang=en&request_locale=en[IBM Link] + + + + + + + + + + + +== Plugin Configurations +Plugin configurations are sets of parameters that apply +across some or all of the plugin procedures. They +reduce repetition of common values, create +predefined parameter sets for end users, and +securely store credentials where needed. Each configuration +is given a unique name that is entered in designated +parameters on procedures that use them. + + +=== Creating Plugin Configurations +To create plugin configurations in {CD}, do these steps: + +* Go to **Administration** >**Plugins** to open the Plugin Manager. +* Find the @PLUGIN_NAME@ row. +* Click *Configure* to open the + Configurations page. +* Click *Create Configuration* as per the description of parameters below. + + +*Note: After you perform the setup below it is important to make sure that the {CD} agent machine on which WebSphere runs is registered as a resource that can be pinged.* + +image::cloudbees-common::cd-plugins/ec-websphere/config/parameters.png[image] + +Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. +They reduce repetition of common values, create predefined parameter sets for end users, +and securely store credentials where needed. +Each configuration is given a unique name that is entered in designated parameters on procedures that use them. + + +=== Configuration Procedure Parameters +[cols=",",options="header",] +|=== +|Parameter |Description + +|Configuration Name | Identifier of the configuration to create. i.e: myconfig + + +|WSAdmin Absolute Path | Absolute path to wsadmin script. + + +|Connection Type | Specifies type of connection to use to connect to the application server that you want to administer. + + +|WebSphere Host | Hostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer. + + +|WebSphere Connector Port | Port of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server. + + +|Login as | Credentials used to connect to WebSphere instance. + + +|Test Connection? | Check if connection should be established during config creation to validate credentials. + + +|Test Connection Resource | A resource which is used for the testing connection. + + +|Debug Level | Debug level, higher debug level - more debug messages. Warning: on debug level 10 and more passwords will be revealed in a procedure logs. + + +|=== + + + + + +[[procedures]] +== Plugin Procedures + + + +[[CreateEndToEndMailProvider]] +=== CreateEndToEndMailProvider + + +Creates a mail provider along with protocol provider and mail session. + + +This procedure creates mail provider with a protocol provider, a mail session and a custom property in the specified scope. + + +==== CreateEndToEndMailProvider Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Scope | Specifies the scope in which the mail provider supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster' + + +| Mail Provider Name | Specifies the name to be given to the new mail provider . + + +| Mail Provider Description | Specifies the mail provider description. + + +| Isolate this mail provider? | Specifies that this mail provider will be loaded in its own class loader. This allows the application server to load different versions or implementations of the same mail provider in the same Java Virtual Machine. Give each version or implementation of the mail provider a unique class path in following (Mail provider classpath) field that is appropriate for that version or implementation. + + +| Mail Provider Classpath | Specifies the class path to a Java archive (JAR) file that contains the implementation classes for this mail provider. + + +| Custom Property Name | Specifies the name of custom property to create. + + +| Custom Property Value | Specifies the value to associate with this custom property of the resource. + + +| Protocol Provider Name | Specifies the name to be given to the new protocol provider . + + +| Protocol Provider Class Name | Specifies the implementation class of this protocol provider. + + +| Protocol Provider Type | Specifies the type of protocol provider. Valid options are STORE(for incoming protocol provider) or TRANSPORT(for outgoing protocol provider). + + +| Mail Session Name | Specifies the administrative name of the JavaMail session object. + + +| Mail Session JNDI Name | Specifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts. + + +| Category | Optional string to use while classifying or grouping the resources. + + +| Enable Debug Mode? | Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file. + + +| Mail Session Description | Specifies optional description for mail session. + + +| Incoming Mail Server | Specifies the host name server that is accessed when receiving mail. + + +| Incoming Mail Server Port | Specifies the port of the server that is accessed when receiving mail. + + +| Incoming Mail Server Credentials | Specifies the credential for the mail account when the incoming mail server requires authentication. + + +| Outgoing Mail Server | Specifies the host name of server that is accessed when sending mail. + + +| Outgoing Mail Server Port | Specifies the port of the server that is accessed when sending mail. + + +| Outgoing Mail Server Credential | Specifies the user of the mail account when the outgoing mail server requires authentication. + + +| Enable Strict Internet Address Parsing? | Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822. + + +|=== + + + + +=== CreateEndToEndMailProvider + +To create a new mail provider along with protocol provider and mail session, do these steps: + +* Go to the CreateEndToEndMailProvider procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +OSGi application is deployed successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider3.png[image] + +In the *CreateEndToEndMailProvider* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider4.png[image] + + + +[[CreateMailSession]] +=== CreateMailSession + + +Creates a new JavaMail session using the wsadmin tool. + + +This procedure creates a JavaMail session object for default mail provider at specified scope. + + +==== CreateMailSession Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Scope | Specifies the scope in which the mail session supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster' + + +| Mail Session Name | Specifies the administrative name of the JavaMail session object. + + +| Mail Session Description | Specifies optional description for mail session. + + +| Mail Session JNDI Name | Specifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts. + + +| Category | Optional string to use while classifying or grouping the resources. + + +| Enable Debug Mode? | Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file. + + +| Outgoing Mail Server | Specifies the host name of server that is accessed when sending mail. + + +| Outgoing Mail Server Port | Specifies the port of the server that is accessed when sending mail. + + +| Outgoing Mail Server Protocol | Specifies the protocol to use when sending mail. + + +| Outgoing Mail Server Credential | Specifies the user of the mail account when the outgoing mail server requires authentication. + + +| Return E-mail Address | Represents the Internet email address that, by default, displays in the received message in the From or the Reply-To address. The recipient's reply will come to this address. + + +| Incoming Mail Server | Specifies the host name server that is accessed when receiving mail. + + +| Incoming Mail Server Port | Specifies the port of the server that is accessed when receiving mail. + + +| Incoming Mail Server Protocol | Specifies the protocol to use when receiving mail. + + +| Incoming Mail Server Credentials | Specifies the credential for the mail account when the incoming mail server requires authentication. + + +| Enable Strict Internet Address Parsing? | Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822. + + +|=== + + + + +=== Create Mail Session + +To create a mail session for default mail provider, do these steps: + +* Go to the CreateMailSession procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createmailsession/ec-webspherecreatemailsession2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +mail session is created successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/createmailsession/ec-webspherecreatemailsession3.png[image] + +In the *CreateMailSession* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/createmailsession/ec-webspherecreatemailsession4.png[image] + + + +[[PublishWSDL]] +=== PublishWSDL + + +Publishes WSDL files in each web services-enabled module to the file system location + + +This procedure publishes WSDL files in each web services-enabled module to the file system location. + + +==== PublishWSDL Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the application of which to publish the WSDL file. i.e: 'webapp'. + + +| Location to publish WSDL file | Filename and absolute path on the filesystem where published WSDL files should get stored.For example, 'C:/webservices/sampleWSDL.zip' + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. + + +| SOAP address prefixes | Give SOAP address prefix in format "{{module {{binding partial-url}}}}" to customize the WSDL SOAP address for each module.. i.e: '{ {AddressBookJ2WB.war {{http http://localhost:9080}}} {StockQuote.jar {{http https://localhost:9443}}} }'. + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Publish WSDL + +To publish WSDL files, do these steps: + +* Go to the PublishWSDL procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/publishwsdl/ec-webspherepublishwsdl2.png[image] + + + +[[CreateApplicationServer]] +=== CreateApplicationServer + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure creates an Application Server identical to an existing Application Server or an Application Server definition which is part of a template. In addition it will synchronize nodes if checked. + + + +==== CreateApplicationServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Node Name | Name of the node where application server is to be created. + + +| Server Name | Name of application server to be created. + + +| Generate Unique Ports? | + By default ports generated during server creation will be created uniquely. + If not checked ports in template will be used as is for server creation. + + + +| Source Type | + Type of source which should be used for server creation. Select Template or Application Server. + In case of template, application server template will be used for server creation, in case of Application Server, + template will be created from existing application server and new server will be created from this template then. + After successful creation template will be deleted. + + + +| Source Template Name | + This parameter is applicable only when the source is a Template. + Name of server template to be the source for a new server. + + + +| Source Template Location | + The configuration Id that represents the location of a template. + This parameter is applicable only when the source is a Template. + + + +| Source Server Name | + Name of application server to be the source for a new server in format nodename:servername. + + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Create Application Server + +To Create Application Server in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationserver/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationserver/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationserver/pipelineresult.png[image] + +In the *CreateApplicationServer* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationserver/pipelinelog.png[image] + + + +[[DeleteApplicationServer]] +=== DeleteApplicationServer + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure deletes an existing Application Server. In addition it will synchronize nodes if checked. + + + +==== DeleteApplicationServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Node Name | Name of the node where application server to be deleted. + + +| Server Name | Name of application server to be deleted. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Delete Application Server + +To Delete Application Server in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationserver/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationserver/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationserver/pipelineresult.png[image] + +In the *DeleteApplicationServer* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationserver/pipelinelog.png[image] + + + +[[CreateApplicationServerTemplate]] +=== CreateApplicationServerTemplate + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure creates a template of an existing Application Server. + + + +==== CreateApplicationServerTemplate Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Node Name | Name of the node where application server is located. + + +| Application Server Name | Name of the application server the template will be based out of. + + +| Template Name | Application server template name to be created. + + +| Template Location | + Specifies a configuration Id that represents the location to place the template. + + + +| Template Description | Description of application server template. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Create Application Server Template + +To Create Application Server Template in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationservertemplate/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationservertemplate/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationservertemplate/pipelineresult.png[image] + +In the *CreateApplicationServerTemplate* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createapplicationservertemplate/pipelinelog.png[image] + + + +[[DeleteApplicationServerTemplate]] +=== DeleteApplicationServerTemplate + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure deletes an existing Application Server Template. + + + +==== DeleteApplicationServerTemplate Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Template Name | Application server template name to be deleted. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Delete Application Server Template + +To Delete Application Server Template in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationservertemplate/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationservertemplate/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationservertemplate/pipelineresult.png[image] + +In the *DeleteApplicationServerTemplate* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deleteapplicationservertemplate/pipelinelog.png[image] + + + +[[CreateCluster]] +=== CreateCluster + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Creates a new Application Server cluster. + + +This procedure creates a cluster, adds members to it, and can deploy an application in it using a Jython script. + + +==== CreateCluster Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of the new cluster. + + +| Prefer Local? | Specifies whether enterprise bean requests are routed to the node on which + the client resides whenever such a routing is possible. + + +| Create First Cluster Member? | If not checked, empty cluster will be created + + +| First Cluster Member Creation Policy | + Controls how 1st cluster member is to be created + Existing - use existing server as template + Convert - convert existing server to 1st cluster member + Template - use app server template to create 1st cluster member + + + +| Source Template Name | + Name of server template to be the source for first cluster member. + + + +| Source Server Name | + Name of application server to be the source for a new server in format nodename:servername. + + + +| First Cluster Member Node | Node name where first cluster member will be created. + + +| First Cluster Member Name | Name of the server that will be created as a first cluster member. + + +| First Cluster Member Weight | Weight of first cluster member. + + +| Generate Unique Ports for First Cluster Member? | + By default ports generated during for first cluster member creation will be created uniquely. + If not checked ports in template will be used as is for server creation. + + + +| Server Resources Promotion Policy | + Specifies how resources such as data sources are initially created in the cluster. + Create settings at the cluster scope if the settings can be used across the entire cluster. + Otherwise, create settings at the cluster member (server) level. + Creating settings at the cluster scope reduces the amount of configuration that you maintain. + Default is Cluster. + + + +| Add Cluster Members? | If checked, additional cluster members will be added right after cluster creation. + + +| Gen Unique Ports for Cluster Members? | + By default ports generated during cluster members creation will be created uniquely. + If not checked ports in template will be used as is for server creation. + + + +| Weight of Each Cluster Member | + Weight of each cluster member from list. + + + +| Cluster Members List | + List of cluster members to be created in format NodeName:server1, NodeName2:server2. + + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Create Cluster + +To Create Cluster in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createcluster/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createcluster/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createcluster/pipelineresult.png[image] + +In the *CreateCluster* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createcluster/pipelinelog.png[image] + + + +[[DeleteCluster]] +=== DeleteCluster + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Deletes an existing cluster using the wsadmin tool + + +This procedure delete the specified cluster. + + +==== DeleteCluster Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | The name of the cluster to delete. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Delete Cluster + +To Delete Cluster in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletecluster/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletecluster/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletecluster/pipelineresult.png[image] + +In the *DeleteCluster* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletecluster/pipelinelog.png[image] + + + +[[ExportApplicationServer]] +=== ExportApplicationServer + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure exports the definition of an Application Server in an environment to an archive (with extension .car) in the filesystem, that can in turn be used import into another environment and create an identical server. + + + +==== ExportApplicationServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Node Name | Name of application server node. + + +| Application Server Name | Name of the application server to be exported. + + +| Archive | Specifies the fully qualified path of the exported configuration archive. + + +|=== + + + + +=== Export Application Server + +To Export Application Server in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/exportapplicationserver/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/exportapplicationserver/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/exportapplicationserver/pipelineresult.png[image] + +In the *ExportApplicationServer* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/exportapplicationserver/pipelinelog.png[image] + + + +[[ImportApplicationServer]] +=== ImportApplicationServer + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure imports an Application Server from an Archive and creates an identical server in the environment the Archive is imported into. + + + +==== ImportApplicationServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Node Name | Name of the Node in which the Application Server is to be Imported. + + +| Application Server Name | Name of the Application Server to be created based on the server in the Imported Archive. + + +| Archive | Specifies the fully qualified path of the configuration archive. + + +| Node Name in Archive | + Specifies the node name of the server defined in the configuration archive. + Not required if there is only one Node in the Archive to be imported. + If there are multiple nodes in the Archive, mention the node name of the Server to be imported. + + + +| Server Name in Archive | + Specifies the name of the server defined in the configuration archive. + Not required if there is only one Server in the Archive to be imported. + If there are multiple servers in the Archive, mention the name of the Server to be imported. + + + +| Core Group | Specifies the core group name to which the server should belong. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Import Application Server + +To Import Application Server in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/importapplicationserver/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/importapplicationserver/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/importapplicationserver/pipelineresult.png[image] + +In the *ImportApplicationServer* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/importapplicationserver/pipelinelog.png[image] + + + +[[ListClusterMembers]] +=== ListClusterMembers + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Lists all the members of cluster using wsadmin tool. + + +This procedure lists down all the members (application servers) of the cluster using a Jython script. + + +==== ListClusterMembers Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of the cluster of which members to list down. + + +| Output Property Path | Property where cluster members list is to be stored. + + +|=== + + + + +=== List Cluster Members + +To List Cluster Members in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/listclustermembers/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/listclustermembers/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/listclustermembers/pipelineresult.png[image] + +In the *ListClusterMembers* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/listclustermembers/pipelinelog.png[image] + + + +[[RemoveClusterMembers]] +=== RemoveClusterMembers + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Removes list of application servers from existing cluster + + +This procedure removes specified application servers from the cluster using a Jython script. + + +==== RemoveClusterMembers Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of cluster from which to remove/delete the members. + + +| List of Cluster Members | + List of cluster members in the form Node01:server1, Node02:server2 to remove/delete from cluster. + Important note: server will be not only removed from cluster, but also deleted. + + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Remove Cluster Members + +To Remove Cluster Members in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/removeclustermembers/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/removeclustermembers/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/removeclustermembers/pipelineresult.png[image] + +In the *RemoveClusterMembers* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/removeclustermembers/pipelinelog.png[image] + + + +[[SyncNodes]] +=== SyncNodes + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Synchronizes active nodes. + + +Synchronizes Cell's Deployment Manager config repository with nodes of the cell. By default, WebSphere nodes are configured for auto-sync. +This procedure should be used for manual nodes synchronization. +For example: New custom property for node was added, and configuration was saved. +Next, to make it available on each server it should be propagated to all servers of the node by nodes synchronization. + + +==== SyncNodes Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +|=== + + + + + + +[[ConfigEJBContainer]] +=== ConfigEJBContainer + + +Configures EJB container using the wsadmin tool + + +This procedure configures EJB container properites using a Jython script. + + +==== ConfigEJBContainer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Cell Name | Name of cell to which EJB container belongs to. + + +| Node Name | Name of node to which EJB container belongs to. + + +| Server Name | Name of application server to which EJB container belongs to. + + +| Passivation Directory | Specifies the directory into which the container saves the persistent state of passivated stateful session beans. This directory must already exist. It is not automatically created.Default is ${USER_INSTALL_ROOT}/temp. + + +| Cache Size | Number of buckets in the active instance list within the EJB container.Input value range - greater than 0. The container selects the next largest prime number equal to or greater than the specified value.Default is 2053 + + +| Cleanup Interval | Interval (in milliseconds)at which the container attempts to remove unused items from the cache.Default is 3000. Allowed range is 0 to 2147483647 + + +| Inactive Pool Cleanup Interval | Specifies the interval at which the container examines the pools of available bean instances to determine if some instances can be deleted to reduce memory usage. + + +| Enable stateful session bean fail over using memory-to-memory replication? | Specifies that failover is enabled for all stateful session beans installed in this EJB container.Replication domains must already exist to failover feature to work. + + +| Replication domain | Specifies the replication domain in which HTTP sessions are replicated. + + +| Replication Mode | The mode specifies whether data is only sent (client), only received (server), or both. Select client if sessions need to be replicated. Select server if sessions need to be stored. Select both client and server if sessions need to be replicated and stored. The default is both. + + +|=== + + + + +=== Configure EJB Container + +To Configure EJB Container, do these steps: + +* Go to the ConfigEJBContainer procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/configejbcontainer/ec-websphereconfigejbcontainer2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +EJB container is configured successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/configejbcontainer/ec-websphereconfigejbcontainer3.png[image] + +In the *ConfigEJBContainer* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/configejbcontainer/ec-websphereconfigejbcontainer4.png[image] + + + +[[CreateFirstClusterMember]] +=== CreateFirstClusterMember + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Creates the First Cluster Member of an existing cluster. + + + +==== CreateFirstClusterMember Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of the new cluster. + + +| First Cluster Member Name | + Server Name of first cluster member. + + + +| First Cluster Member Node | + Node Name of first cluster member. + + + +| First Cluster Member Weight | + Weight of first cluster member. + + + +| Generate Unique Ports for First Cluster Member? | + By default the port generated for first cluster member will be created uniquely. + If this option is not checked, ports in template will be used as is. + + + +| Server Resources Promotion Policy | + Specifies how resources such as data sources are initially created in the cluster. + Create settings at the cluster scope if the settings can be used across the entire cluster. + Otherwise, create settings at the cluster member (server) level. + Creating settings at the cluster scope reduces the amount of configuration that you maintain. + Default is Cluster. + + + +| First Cluster Member Creation Policy | + Controls how first cluster member is created. The values mean the following. + Existing - Use existing server + Template - Use app server template to create first cluster member + + + +| Source Template Name | + Name of server template to be the source for first cluster member. + + + +| Source Server Name | + Name of application server to be the source for a new server in format nodename:servername. + + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Create First Cluster Member + +To Create First Cluster Member in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createfirstclustermember/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createfirstclustermember/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createfirstclustermember/pipelineresult.png[image] + +In the *CreateFirstClusterMember* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createfirstclustermember/pipelinelog.png[image] + + + +[[CreateClusterMembers]] +=== CreateClusterMembers + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Creates members under an existing cluster. + + + +==== CreateClusterMembers Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | A name of the cluster where servers is to be created. + + +| Gen Unique Ports? | Generate unique ports number if checked. + + +| Cluster Member Weight | Weight of each cluster member + + +| List of Cluster Members | List of cluster members. + + +| Sync Nodes? | + The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. + + + +|=== + + + + +=== Create Cluster Members + +To Create Cluster Members in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createclustermembers/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createclustermembers/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createclustermembers/pipelineresult.png[image] + +In the *CreateClusterMembers* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createclustermembers/pipelinelog.png[image] + + + +[[StartApplicationServers]] +=== StartApplicationServers + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure starts one or more Application Servers that can be spread across nodes. + + + +==== StartApplicationServers Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Server List | + List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, + Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to start all servers within Node4. + + + +| Wait time | Not Required. Time to wait until all servers are started. If not specified wait time will be treated as 0. + + +|=== + + + + +=== Start Application Servers + +To Start Application Servers in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startapplicationservers/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startapplicationservers/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/startapplicationservers/pipelineresult.png[image] + +In the *StartApplicationServers* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/startapplicationservers/pipelinelog.png[image] + + + +[[StopApplicationServers]] +=== StopApplicationServers + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure stops one or more Application Servers that can be spread across nodes. + + + +==== StopApplicationServers Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Server List | + List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, + Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to stop all servers within Node4. + + + +| Wait time | Not Required. Time to wait until all servers are stopped. If not specified wait time will be treated as 0. + + +|=== + + + + +=== Stop Application Servers + +To Stop Application Servers in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopapplicationservers/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopapplicationservers/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/stopapplicationservers/pipelineresult.png[image] + +In the *StopApplicationServers* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/stopapplicationservers/pipelinelog.png[image] + + + +[[StartCluster]] +=== StartCluster + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Starts cluster using wsadmin tool. + + +This procedure starts a cluster. + + +==== StartCluster Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of the cluster to be started. + + +| Timeout | + Specifies the waiting time before cluster start times out and returns an error. + + + +|=== + + + + +=== Start Cluster + +To Start Cluster in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startcluster/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startcluster/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/startcluster/pipelineresult.png[image] + +In the *StartCluster* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/startcluster/pipelinelog.png[image] + + + +[[StopCluster]] +=== StopCluster + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Stops cluster using wsadmin tool. + + +This procedure stops a cluster. + + +==== StopCluster Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Cluster Name | Name of the cluster to be stopped. + + +| Timeout | + Specifies the waiting time before cluster stop times out and returns an error. + + + +| Perform Ripple Start? | If checked, all servers within cluster will be stopped one-by-one and then started. + + +|=== + + + + +=== Stop Cluster + +To Stop Cluster in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopcluster/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopcluster/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/stopcluster/pipelineresult.png[image] + +In the *StopCluster* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/stopcluster/pipelinelog.png[image] + + + +[[StartDeploymentManager]] +=== StartDeploymentManager + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure starts the Deployment Manager in a WAS network deployment. + + + +==== StartDeploymentManager Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| StartManager Location | Absolute Physical path in Filesystem to location of startManager script i.e., /path/to/startManager.sh or startManager.bat + + +| Deployment Manager Profile | + Profile name of the DeploymentManager which needs to be started. + If this is not provided StartManager will start the DeploymentManager which has the default profile. + + + +| Log File Location | Absolute Physical path in Filesystem to location of startManager.sh logs i.e., /path/to/startServer.log + + +| Timeout | Specifies the waiting time before deployment manager start times out and returns an error. + + +| Additional Parameters | + This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. + + + +|=== + + + + +=== Start Deployment Manager + +To Start Deployment Manager in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startdeploymentmanager/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startdeploymentmanager/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/startdeploymentmanager/pipelineresult.png[image] + +In the *StartDeploymentManager* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/startdeploymentmanager/pipelinelog.png[image] + + + +[[StopDeploymentManager]] +=== StopDeploymentManager + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Stops Deployment Manager + + + +==== StopDeploymentManager Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| StopManager Location | Absolute Physical path in Filesystem to location of stopManager script i.e., /path/to/stopManager.sh or stopManager.bat + + +| Deployment Manager Profile | + Profile name of the DeploymentManager which needs to be stopped. + If this is not provided StopManager will stop the DeploymentManager which has the default profile. + + + +| Log File Location | Absolute Physical path in Filesystem to location of stopManager.sh logs i.e., /path/to/stopServer.log + + +| Timeout | Specifies the waiting time before deployment manager stop times out and returns an error. + + +| Additional Parameters | + This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. + + + +|=== + + + + +=== Stop Deployment Manager + +To Stop Deployment Manager in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopdeploymentmanager/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopdeploymentmanager/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/stopdeploymentmanager/pipelineresult.png[image] + +In the *StopDeploymentManager* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/stopdeploymentmanager/pipelinelog.png[image] + + + +[[StartNode]] +=== StartNode + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure starts a WAS node and optionally starts all Application Servers in that Node. + + + +==== StartNode Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| StartNode Location | Absolute Physical path in Filesystem to location of startNode script i.e., /path/to/startNode.sh or startNode.bat + + +| Node Profile | + Profile name of the Node which needs to be started. + If this is not provided StartNode will start the Node which has the default profile. + + + +| Log File Location | Absolute Physical path in Filesystem to location of startNode.sh logs i.e., /path/to/startServer.log + + +| Timeout | Specifies the waiting time before node start times out and returns an error. + + +| Start all Application Servers? | Start all application servers within node after nodeagent is started. + + +| Node Name to start Servers | Name of the node where application servers needs to be started. + + +| Additional Parameters | + This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. + + + +|=== + + + + +=== Start Node + +To Start Node in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startnode/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startnode/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/startnode/pipelineresult.png[image] + +In the *StartNode* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/startnode/pipelinelog.png[image] + + + +[[StopNode]] +=== StopNode + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +This procedure stops a WAS node and stops the Application Servers in that Node based on the Stop Node policy. + + + +==== StopNode Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| StopNode Location | Absolute Physical path in Filesystem to location of stopNode script i.e., /path/to/stopNode.sh or stopNode.bat + + +| Node Profile | + Profile name of the Node which needs to be stopped. + If this is not provided StopNode will stop the Node which has the default profile. + + + +| Log File Location | Absolute Physical path in Filesystem to location of stopNode.sh logs i.e., /path/to/stopServer.log + + +| Timeout | Specifies the waiting time before node stop times out and returns an error. + + +| Node Stop Policy | Policy that will be used for node stopping. It could be one of: Just Stop node agent, stop Spplication Servers, Save Node State. + + +| Additional Parameters | + This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. + + + +|=== + + + + +=== Stop Node + +To Stop Node in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopnode/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopnode/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/stopnode/pipelineresult.png[image] + +In the *StopNode* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/stopnode/pipelinelog.png[image] + + + +[[StartServer]] +=== StartServer + + +Starts a WebSphere instance + + +This procedure starts a WebSphere instance or an application server using startServer.sh. + + +==== StartServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| StartServer Absolute Path | Absolute path of the start server script, including filename and extension. i.e: 'startServer.bat' or '/path/to/startServer.sh' or 'C:\Program Files\IBM\WebSphere\AppServer\bin\startServer.bat'. + + +| Instance name | The name of the instance of the server to be started. i.e: 'server01'. + + +| Additional Commands | Additional commands to be entered for the startup of the server. + + +|=== + + + + + + +[[StopServer]] +=== StopServer + + +Stops a WebSphere instance + + +This procedure stops a WebSphere instance or an application server using stopServer.sh + + +==== StopServer Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Script Location | Absolute path of the stop server script, including filename and extension. i.e: 'C:/Program Files/IBM/WebSphere/AppServer/bin/stopServer.bat', 'stopServer.bat', '/path/to/stopServer.sh' + + +| Instance Name | Server instance name of the server to be stopped. i.e: 'server01'. + + +| Additional Commands | Additional commands to be entered for stop the server. + + +|=== + + + + + + +[[RunCustomJob]] +=== RunCustomJob + + +Runs a task using wsadmin + + +This procedure runs a task using wsadmin and the Jython code files. + + +==== RunCustomJob Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. + + +| Script File Absolute Path | Path of a Jython script that will be run using wsadmin. i.e: '/path/to/scriptFile.jython' or 'c:/dir/scriptFile.jython'. + + +| Script File Source | Indicates either if a script file route or an embedded script file will be provided. + + +| Script File | Content of the script file to run if Embedded File is chosen in the Script File Source. + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Running Custom Jobs + +For a complete example, go to the Examples and Use Cases section. + + + +[[ConfigureSession]] +=== ConfigureSession + + +Configures the session management properties for the deployed application. + + +This procedure configures the session management related properties for deployed application. For more information on each of the parameter, please refer to the http://www-01.ibm.com/support/knowledgecenter/SSCKBL_8.5.5/com.ibm.websphere.nd.doc/ae/uprs_rsession_manager.html[WebSphere Knowledge Center Page]. + + +==== ConfigureSession Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. /path/to/wsadmin.sh or wsadmin.bat. + + +| Application Name | Name of the web application to configure. + + +| Enable SSL Tracking | Specifies that session tracking uses Secure Sockets Layer (SSL) information as a session ID. Enabling SSL tracking takes precedence over cookie-based session tracking and URL rewriting. + + +| Enable Cookies | Specifies whether to enable cookies. + + +| Enable URL Rewriting | Specifies whether the session management facility uses rewritten URLs to carry the session IDs. If URL rewriting is enabled, the session management facility recognizes session IDs that arrive in the URL if the encodeURL method is called in the servlet. + + +| Enable Protocol Switching | This option is only applicable when Enable URL rewriting is selected. This option specifies that the session ID is added to a URL when the URL requires a switch from HTTP to HTTPS or from HTTPS to HTTP. If rewriting is enabled, the session ID is required to go between HTTP and HTTPS. + + +| Max in-memory session count | Specifies the maximum number of sessions to maintain in memory. + + +| Allow Overflow | Specifies whether the number of sessions in memory can exceed the value specified by the Max in-memory session count property. This option is valid only in non-distributed sessions mode.. + + +| Enable Serialized Session | If selected, concurrent session access in a given server is not permitted. + + +| Maximum Wait Time | Specifies the maximum amount of time in seconds a servlet request waits on an HTTP session before continuing execution. The default is 5 seconds. Under normal conditions, a servlet request waiting for access to an HTTP session gets notified by the request that currently owns the given HTTP session when the request finishes. + + +| Access Session On Timeout | Specifies whether the servlet is started normally or aborted in the event of a timeout. If you specify true, the servlet is started normally. If you specify false, the servlet execution aborts and error logs are generated. + + +| Invalid Timeout | Specifies how long(in minutes) a session can go unused before it is no longer valid. + + +| Session Persistence Mode | Specifies whether to enable session persistence mode. + + +|=== + + + + +=== Configure Session Management for application + +To Configure Session Management for application, do these steps: + +* Go to the ConfigureSession procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/configuresession/ec-websphereconfiguresession2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +the cluster was created successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/configuresession/ec-websphereconfiguresession3.png[image] + +In the *ConfigureSession* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/configuresession/ec-websphereconfiguresession4.png[image] + + + +[[MapSharedLibrary]] +=== MapSharedLibrary + + +Maps shared library. + + +This procedure maps shared library to already deployed application. + + +==== MapSharedLibrary Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Library Name | Shared Library Name. + + +| Application Name | Name of application to which shared library will be mapped. + + +|=== + + + + +=== Map Shared Library to Application + +To map shared library to application, do these steps: + +* Go to the MapSharedLibrary procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/mapsharedlibrary/ec-webspheremapsharedlibrary2.png[image] + +After the job runs, you can view the results, including the following job details: + +image::cloudbees-common::cd-plugins/ec-websphere/mapsharedlibrary/ec-webspheremapsharedlibrary3.png[image] + +In the *MapSharedLibrary* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/mapsharedlibrary/ec-webspheremapsharedlibrary4.png[image] + + + +[[ModifyApplicationClassLoader]] +=== ModifyApplicationClassLoader + + +Modify Application ClassLoader. + + +This procedure modifies ClassLoader of the deployed Application. + + +==== ModifyApplicationClassLoader Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Load Order | The class-loader delegation mode, also known as the class loader order, determines whether a class loader delegates the loading of classes to the parent class loader. + + +| ClassLoader Isolation Policy | Application class loaders load EJB modules, dependency JAR files, embedded resource adapters, and application-scoped shared libraries. Depending on the application class-loader policy, an application class loader can be shared by multiple applications (Single) or unique for each application (Multiple). The application class-loader policy controls the isolation of applications that are running in the system. When set to Single, applications are not isolated. When set to Multiple, applications are isolated from each other. + + +| Application Name | Name of the existing web application, which ClassLoader should be modified. + + +|=== + + + + +=== Modify Application's ClassLoader + +To modify Application's ClassLoader do the following steps: + +* Go to the ModifyApplicationClassLoader procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader2.png[image] + +After the job runs, you can view the results, including the following job details: + +image::cloudbees-common::cd-plugins/ec-websphere/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader3.png[image] + +In the *ModifyApplicationClassLoader* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader4.png[image] + + + +[[StartApp]] +=== StartApp + + +Start an application using wsadmin + + +This procedure starts an application using wsadmin. If the application is already running, a warning will be thrown. + + +==== StartApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the application to start. i.e: 'webapp'. + + +| Cluster Name | Name of the cluster on which application is deployed. Not required in WebSphere Base Edition. + + +| Server Name | Name of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition. + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Starting Applications + +To start an application, do these steps: + +* Go to the StartApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/startapp/startapp2.png[image] + +After the job runs, you can view the results, including the following job details, +which show that application was started +successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/startapp/startapp3.png[image] + +In the *StartApp* step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/startapp/startapp4.png[image] + + + +[[StopApp]] +=== StopApp + + +Stop an application using wsadmin + + +This procedure stops an application using wsadmin. If the application is already stopped, a warning will be thrown. + + +==== StopApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the application to stop. i.e: 'webapp'. + + +| Cluster Name | Name of the cluster on which application is deployed. Not required in WebSphere Base Edition. + + +| Server Name | Name of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition. + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Stopping Applications + +To stop an application, do these steps: + +* Go to the StopApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +the application was stoped +successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp3.png[image] + +In the *StopApp* step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp4.png[image] + + + +[[CreateJDBCProvider]] +=== CreateJDBCProvider + + +Creates a JDBC Provider using the wsadmin tool + + +This procedure creates a JDBC provider using a Jython script. + + +==== CreateJDBCProvider Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| JDBC Provider Name | Name of the JDBC Provider. + + +| JDBC Provider Description | A description for the JDBC Provider. + + +| Cell Scope | Parent object where the JDBC Provider will be created. This determines the visibility scope of the JDBC Provider. When the Cell Scope is provided, if the node and server scopes are not provided, then the scope will be the 'cell'; if the node is provided and the server not, then the scope will be the 'node'; if the server is provided and the node not, then the scope will be the 'server'. At least the Cell, the Node or the Server scope must be provided. i.e: 'wsaspluginNode01Cell'. + + +| Cluster Scope | When the Cluster Scope is provided, then the scope will be the cluster. i.e: 'cluster1'. + + +| Node Scope | When the Node Scope is provided, if the cell and server scopes are not provided, then the scope will be the 'node'; if the cell is provided and the server not, then the scope will be the 'node'; if the server is provided and the cell not, then the scope will be the 'server'. i.e: 'wsaspluginNode01'. + + +| Server Scope | When the Server Scope is provided, then the scope will be the Node and the server always, even if the Node and the Cell Scopes are not provided. i.e: 'server1'. + + +| Implementation Class Name | Java class name of the JDBC provider implementation. + + +| Driver Class Path | A path for the resource provider classes. + + +|=== + + + + +=== Creating a JDBC Providers + +To create a JDBC provider, do these steps: + +* Go to the CreateJDBCProvider procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createjdbcprovider/ec-webspherecreatejdbcprovider2.png[image] + +After the job runs, you can view the results, including the following job details, +which show that JDBC provider was successfully created: + +image::cloudbees-common::cd-plugins/ec-websphere/createjdbcprovider/ec-webspherecreatejdbcprovider3.png[image] + +In the *CreateJDBCProvider* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/createjdbcprovider/ec-webspherecreatejdbcprovider4.png[image] + + + +[[DeleteJDBCProvider]] +=== DeleteJDBCProvider + + +Deletes a JDBC Provider using the wsadmin tool + + +This procedure deletes a JDBC provider using a Jython script. + + +==== DeleteJDBCProvider Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| JDBC Provider Name | A unique name that identifies the JDBC Provider to delete in the WebSphere domain. + + +|=== + + + + +=== Deleting JDBC Providers + +To delete a JDBC provider, do these steps: + +* Go to the DeleteJDBCProvider procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejdbcprovider/ec-webspheredeletejdbcprovider2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +the JDBC provider was deleted successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejdbcprovider/ec-webspheredeletejdbcprovider3.png[image] + +In the *DeleteJDBCProvider* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejdbcprovider/ec-webspheredeletejdbcprovider4.png[image] + + + +[[CreateDatasource]] +=== CreateDatasource + + +Creates a datasource using the wsadmin tool. The scope assigned to the datasource is provided by the JDBC Provider. + + +The procedure creates a datasource by using a Jython script. + + +==== CreateDatasource Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| JDBC Provider | Name of an existing JDBC Provider. + + +| Datasource Name | A unique name that identifies this Datasource in the WebSphere domain. + + +| Datasource Description | A description for the datasource. + + +| JNDI Name | The JNDI path to where this Datasource is bound. + + +| Statement Cache Size | Specifies the number of statements that can be cached per connection. The application server caches a statement after you close that statement. + + +| Authentication Alias Name | Provide the authentication data alias. + + +| Datasource Helper Class Name | Provide the datasource helper class name. + + +|=== + + + + +To create a datasource, do the following steps: + +* Go to the CreateDataSource procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createdatasource/ec-webspherecreatedatasource2.png[image] + +After the job runs, you can view the results, including the following job details, +which show that the datasource was successfully created: + +image::cloudbees-common::cd-plugins/ec-websphere/createdatasource/ec-webspherecreatedatasource3.png[image] + +In the *CreateDatasource* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/createdatasource/ec-webspherecreatedatasource4.png[image] + + + +[[DeleteDatasource]] +=== DeleteDatasource + + +Deletes a datasource using the wsadmin tool + + +This procedure deletes a datasource using a Jython script. + + +==== DeleteDatasource Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Datasource Name | A unique name that identifies the datasource to delete in the WebSphere domain. + + +|=== + + + + +=== Deleting Datasources + +To delete a datasource, do these steps: + +* Go to the DeleteDatasource procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletedatasource/ec-webspheredeletedatasource2.png[image] + +After the job runs, you can view the results, including the following job details, which show that the datasource was deleted +successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/deletedatasource/ec-webspheredeletedatasource3.png[image] + +In the *DeleteDatasource* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletedatasource/ec-webspheredeletedatasource4.png[image] + + + +[[CreateJMSProvider]] +=== CreateJMSProvider + + +Creates a JMS Provider using the wsadmin tool + + +This procedure creates a new JMS provider using a Jython script. + + +==== CreateJMSProvider Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Scope | Specifies a scope of cell, node, server, or cluster for the JMS provider. E.g. Cell=Cell01,Node=Node01,Server=server1 + + +| JMS Provider Name | Specifies the name to assign to the new JMS provider. + + +| Initial Context Factory | Specifies the Java class name of the initial context factory for the JMS provider. + + +| JMS provider URL | Specifies the JMS provider URL for external JNDI lookups. + + +| Classpath | Specifies a list of paths or Java archive (JAR) file names which together form the location for the resource provider classes. Use a semicolon (;) to separate class paths. + + +| Description | Specifies a description of the JMS Provider. + + +| Isolated Class Loader | If set to true, specifies that the resource provider is loaded in its own class loader. + + +| Native Path | Specifies an optional path to any native libraries, such as *.dll and *.so. Native path entries are separated by a semicolon (;). + + +| Provider Type | Specifies the JMS provider type that this JMS provider uses. + + +| Property Set | Specifies resource properties in the following format: [[['name','nameValue1'],['type','typeValue1'],['value','valueValue1']]... [['name','nameValuen'],['type','typeValuen'],['value','valueValuen']]] + + +| Supports ASF | If set to true, specifies that the JMS provider supports Application Server Facilities (ASF), which provides concurrency and transactional support for applications. + + +|=== + + + + +=== Create JMS Provider + +To create a new JMS provider, do these steps: + +* Go to the CreateJMSProvider procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createjmsprovider/ec-webspherecreatejmsprovider2.png[image] + + + +[[DeleteJMSProvider]] +=== DeleteJMSProvider + + +Deletes JMS Provider + + +This procedure deletes an existing JMS Provider. + + +==== DeleteJMSProvider Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| JMS Provider Scope | Scope of the WebSphere messaging provider to be deleted. + + +| JMS Provider Administartive Name | The administrative name of JMS Provider to be deleted. + + +|=== + + + + +=== Delete JMS Provider + +To delete JMS Provider in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSProvider from procedures +picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/procedureresult.png[image] + +To delete JMS Provider in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/pipelineresult.png[image] + +In the *DeleteJMSProvider* step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/procedurelog.png[image] + + + +[[CreateOrUpdateJMSQueue]] +=== CreateOrUpdateJMSQueue + + +Creates or updates JMS Queues + + +This procedure creates a new JMS Queue or updates an existing JMS Queue. + + +==== CreateOrUpdateJMSQueue Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Queue Scope | Scope of the messaging provider at which the JMS Queue is to be created. + + +| Queue Administrative Name | The administrative name assigned to this WebSphere MQ messaging provider queue. + + +| Queue Name | Name of the Queue. + + +| JNDI Name | The name used to bind this object into WebSphere Application Server JNDI. + + +| Queue Manager Name | Queue manager that hosts the queue. + + +| Queue Administrative Description | An administrative description assigned to queue. + + +| Additional Options | + This parameter can be used to either override defaults or pass Custom Properties. + For example: -ccsid 1208 -readAhead YES + + + +|=== + + + + +=== Create or update JMS Queue + +To create or update JMS Queue in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateJMSQueue from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/procedureresult.png[image] + +To create or update JMS Queue in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/pipelineresult.png[image] + +In the *CreateOrUpdateJMSQueue* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/procedurelog.png[image] + + + +[[DeleteJMSQueue]] +=== DeleteJMSQueue + + +Deletes JMS Queues + + +This procedure deletes an existing JMS Queue. + + +==== DeleteJMSQueue Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Queue Scope | Scope of the messaging provider at which the JMS Queue is to be deleted. + + +| Queue Administrative Name | The administrative name assigned to this WebSphere MQ messaging provider queue. + + +|=== + + + + +=== Delete JMS Queue + +To delete JMS Queue in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSQueue from procedures +picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/procedureresult.png[image] + +To delete JMS Queue in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/pipelineresult.png[image] + +In the *DeleteJMSQueue* step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/procedurelog.png[image] + + + +[[CreateOrUpdateJMSTopic]] +=== CreateOrUpdateJMSTopic + + +Creates or updates JMS Topics + + +This procedure creates a new JMS Topic or updates an existing JMS Topic. + + +==== CreateOrUpdateJMSTopic Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Topic Scope | Scope of the messaging provider at which the JMS Topic is to be created. + + +| Topic Administrative Name | The administrative name assigned to this WebSphere MQ messaging provider Topic. + + +| Topic Name | Name of the Topic. + + +| JNDI Name | The name used to bind this object into WebSphere Application Server JNDI. + + +| Topic Administrative Description | An administrative description assigned to Topic. + + +| Additional Options | + This parameter can be used to either override defaults or pass Custom Properties. + For example: -readAhead YES -ccsid 1208 + + + +|=== + + + + +### Create or update JMS Topic + +To create or update JMS Topic in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateJMSTopic from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/procedureresult.png[image] + +To create or update JMS Topic in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/pipelineresult.png[image] + +In the *CreateOrUpdateJMSTopic* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/procedurelog.png[image] + + + +[[DeleteJMSTopic]] +=== DeleteJMSTopic + + +Deletes JMS Topics + + +This procedure deletes an existing JMS Topic. + + +==== DeleteJMSTopic Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Topic Scope | Scope of the messaging provider at which the JMS Topic is to be deleted. + + +| Topic Administrative Name | The administrative name assigned to this WebSphere MQ messaging provider topic. + + +|=== + + + + +=== Delete JMS Topic + +To delete JMS Topic in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSTopic from procedures +picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/procedureresult.png[image] + +To delete JMS Topic in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/pipelineresult.png[image] + +In the *DeleteJMSTopic* step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/procedurelog.png[image] + + + +[[CreateOrUpdateSIBJMSActivationSpec]] +=== CreateOrUpdateSIBJMSActivationSpec + + +Creates or updates SIB JMS Activation Specs + + +This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec. + + +==== CreateOrUpdateSIBJMSActivationSpec Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Scope of the Activation Spec | Scope of the WebSphere Default messaging provider at which the Activation Spec is to be created. + + +| Activation Spec Administrative Name | The administrative name assigned to this Activation Spec. + + +| JNDI Name | The name and location used to bind this object into WebSphere Application Server JNDI. + + +| Destination JNDI Name | The JNDI name of the destination JMS queue or topic used by the message-driven bean. + + +| Activation Spec Administrative Description | An Administrative description assigned to Activation Spec. + + +| Destination Type | An option to determine whether the message_driven bean uses a JMS queue or a JMS topic. + + +| Message Selector | + The JMS message selector used to determine which messages the message-driven bean receives. + The value is a string that is used to select a subset of the available messages. + The syntax is based on a subset of the SQL 92 conditional expression syntax, as described in the JMS specification. + Refer to the information center for more information. + The selector string can refer to fields in the JMS message header and fields in the message properties. + Message selectors cannot reference message body values. + A null value (an empty string) indicates that there is no message selector for the message consumer. + + + +| Additional Options | Used to either override defaults or pass Custom Properties. + + +|=== + + + + +=== Create or update SIB JMS Activation Spec + +To create or update JMS Activation Spec in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/procedureresult.png[image] + +To create or update JMS Topic in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/pipelineresult.png[image] + +In the *CreateOrUpdateSIBJMSActivationSpec* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/procedurelog.png[image] + + + +[[CreateOrUpdateWMQJMSActivationSpec]] +=== CreateOrUpdateWMQJMSActivationSpec + + +Creates or updates WMQ JMS Activation Specs + + +This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec. + + +==== CreateOrUpdateWMQJMSActivationSpec Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Scope of the Activation Spec | + Scope of the WebSphere MQ messaging provider at which the Activation Spec is to be created. + + + +| Activation Spec Administrative Name | The administrative name assigned to this Activation Spec. + + +| JNDI Name | The name and location used to bind this object into WebSphere Application Server JNDI. + + +| Destination JNDI Name | The JNDI name of the destination JMS queue or topic used by the message-driven bean. + + +| Destination JNDI Type | The type of the destination specified by "Destination JNDI Name" parameter. + + +| Activation Spec Administrative Description | An Administrative Description assigned to Activation Spec. + + +| Client Channel Definition URL | A URL to a client channel definition table to use, for this Activation Spec, when contacting WebSphere MQ. + + +| Client Channel Definition Queue Manager | A queue manager name, used to select one or more entries from a client channel definition table. + + +| Additional Options | Used to either override defaults or pass Custom Properties. + + +|=== + + + + +=== Create or update WMQ JMS Activation Spec + +To create or update WMQ JMS Activation Spec in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/procedureresult.png[image] + +To create or update WMQ JMS Activation Spec in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/pipelineresult.png[image] + +In the *CreateOrUpdateWMQJMSActivationSpec* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/procedurelog.png[image] + + + +[[DeleteJMSActivationSpec]] +=== DeleteJMSActivationSpec + + +Deletes JMS Activation Specs + + +This procedure deletes an existing JMS ActivationSpec. + + +==== DeleteJMSActivationSpec Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Scope of the Activation Spec | Scope of the messaging provider at which the JMS Activation Spec is to be deleted. + + +| Activation Spec Administrative Name | The administrative name assigned to this WebSphere MQ messaging provider Activation Spec. + + +|=== + + + + +=== Delete JMS Activation Spec + +To delete JMS Activation Spec in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures + picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/procedureresult.png[image] + +In the *DeleteJMSActivationSpec* step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/procedurelog.png[image] + +To delete JMS Activation Spec in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelineresult.png[image] + +In the pipeline tasks click on "Update SIB JMS Activation Spec", then click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelinelog.png[image] + + + +[[CreateOrUpdateSIBJMSConnectionFactory]] +=== CreateOrUpdateSIBJMSConnectionFactory + + +Creates or updates SIB JMS Connection Factories + + +This procedure creates a new SIB JMS Connection Factory or updates an existing JMS Connection Factory. + + +==== CreateOrUpdateSIBJMSConnectionFactory Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Scope of the Connection Factory | + Scope of the WebSphere Default messaging provider at which the Connection Factory is to be created. + + + +| Connection Factory Administrative Name | + The administrative name assigned to this Connection Factory. + + + +| Bus Name | Name of the service integration bus to which connections are made. + + +| JNDI Name | + The name and location used to bind this object into WebSphere Application Server JNDI. + + + +| Connection Factory Type | + Type of Connection Factory to create. Should be one of Queue or Topic. + To create a generic connection factory, leave this parameter unset. + This parameter is being used only if Connection Factory is going to be created. + Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. + + + +| Connection Factory Administrative Description | An Administrative Description assigned to Connection Factory. + + +| Additional Options | Used to either override defaults or pass Custom Properties. + + +|=== + + + + +=== Create or update SIB JMS Connection Factory + +To create or update SIB JMS Connection Factory in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/procedureresult.png[image] + +To create or update JMS Topic in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/pipelineresult.png[image] + +In the *CreateOrUpdateSIBJMSConnectionFactory* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/procedurelog.png[image] + + + +[[CreateOrUpdateWMQJMSConnectionFactory]] +=== CreateOrUpdateWMQJMSConnectionFactory + + +Creates or updates WMQ JMS Connection Factories + + +This procedure creates a new WMQ JMS Connection Factory or updates an existing JMS Connection Factory. + + +==== CreateOrUpdateWMQJMSConnectionFactory Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Scope of the Connection Factory | + Scope of the WebSphere MQ messaging provider at which the Connection Factory is to be created. + + + +| Connection Factory Administrative Name | + The administrative name assigned to this Connection Factory. + + + +| Connection Factory Type | + Use this parameter to determine whether a unified connection factory, a queue connection factory or a topic connection factory is to be created. + This needs to be one of the values from CF, QCF and TCF. Default is CF. + Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. + + + +| JNDI Name | + The name and location used to bind this object into WebSphere Application Server JNDI. + + + +| Connection Factory Administrative Description | An Administrative description assigned to Connection Factory. + + +| Client Channel Definition URL | + A URL to a client channel definition table to use, for this Connection Factory, when contacting WebSphere MQ. + + + +| Client Channel Definition Queue Manager | A queue manager name, used to select one or more entries from a client channel definition table. + + +| Additional Options | Used to either override defaults or pass Custom Properties. + + +|=== + + + + +=== Create or update WMQ JMS Connection Factory + +To create or update WMQ JMS Connection Factory in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from + procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/procedureresult.png[image] + +To create or update JMS Topic in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/pipelineresult.png[image] + +In the *CreateOrUpdateWMQJMSConnectionFactory* step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/procedurelog.png[image] + + + +[[DeleteJMSConnectionFactory]] +=== DeleteJMSConnectionFactory + + +Deletes JMS Connection Factories + + +This procedure deletes an existing JMS ConnectionFactory. + + +==== DeleteJMSConnectionFactory Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. + + +| Scope of the Connection Factory | + Scope of the WebSphere messaging provider at which the Connection Factory is to be deleted. + + + +| Connection Factory Administrative Name | The administrative name assigned to this Connection Factory. + + +|=== + + + + +=== Delete JMS ConnectionFactory + +To delete JMS ConnectionFactory in {CD} interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures +picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/procedureconfig.png[image] + +After the job runs, you can view the results, including the following +job details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/procedureresult.png[image] + +To delete JMS ConnectionFactory in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the +following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/pipelineresult.png[image] + +In the *DeleteJMSConnectionFactory* step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/procedurelog.png[image] + + + +[[DeployApp]] +=== DeployApp + + +Deploys an application using AdminApp.install + + +This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall. + + +==== DeployApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar' + + +| Application Name | Name of the web application to be deploy. i.e: 'webapp'. + + +| Application Path | Absolute path of the application to deploy. i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Deploying Applications + +To deploy an application, do these steps:select the following +highlighted +step: + +* Go to the DeployApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deployapp/deployapp2.png[image] + +After the job runs, you can view the results, including the following job details, which show that the +application was deployed +successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/deployapp/deployapp3.png[image] + +In the *DeployApp* step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/deployapp/deployapp4.png[image] + + + +[[DeployEnterpriseApp]] +=== DeployEnterpriseApp + + +Deploys an enterprise application using wsadmin tool + + +This procedure deploys java enterprise application (.EAR) or java web application (.WAR) on given targets. If application is already deployed, procedure updates application. + + +==== DeployEnterpriseApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Specifies logical name to be given to installing enterprise application. Do not include whitespaces in application name. + + +| Application Path | + Absolute path of the application to deploy. Use "/" as the path separator on both linux and windows i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. + + + +| Target cluster | Name of the cluster on which to deploy enterprise application. Not required in WebSphere Base Edition. Enter either target cluster or target server(s). + + +| Target server(s) | Specify single or list of standalone application servers on which to deploy enterprise application. Specify servers in the form Node=server. For e.g. Node01=Server1,Node02=Server2. Not required in WebSphere Base Edition. + + +| Map modules to servers | Specify deployment targets where you want to install the modules that are contained in your application. Modules can be installed on the same deployment target or dispersed among several deployment targets. Give input in format [ "Module1Name" Module1URL server1][ "Module2Name" Module2URL server2 ] E.g. [ "Increment EJB module" Increment.jar,META-INF/ejb-jar.xml WebSphere:cell=Cell01,node=Node01,server=singleServer ] + + +| Additional deployment parameters | Specify any additional options for AdminApp. Install object in case not listed in this input form. For more information about each of the supported arguments, refer to 'http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/rxml_taskoptions.html'. + + +| Directory to install application | Specifies the directory to which the enterprise archive (EAR) file will be installed. Default is profile_root/installedApps/cell_name/application_name.ear directory. + + +| Precompile JavaServer Pages files? | Specify whether to precompile JavaServer Pages (JSP) files as a part of installation. The default is not to precompile JSP files. + + +| Distribute application? | Specifies whether the product expands application binaries in the installation location during installation. + + +| Use binary configuration? | Specifies whether the application server uses the binding, extensions, and deployment descriptors located with the application deployment + document, the deployment.xml file (default), or those located in the enterprise archive (EAR) file. Default is to use bindings located in deployment.xml. + + +| Deploy enterprise beans? | Specifies whether the EJBDeploy tool runs during application installation. Default is false(true for EJB 3.0 modules). + + +| Create MBeans for resources? | Specifies whether to create MBeans for resources such as servlets or JSP files within an application when the application starts. Default is create MBeans. + + +| Override class reloading settings for web and EJB modules? | Specifies whether the product run time detects changes to application classes when the application is running. If yes, then on such changes application is stopped and restarted to reload updated classes. + + +| Deploy web services? | Specifies whether to deploy web services. Default is do not enable Deploy web services. + + +| Process embedded configuration? | Specifies whether the embedded configuration should be processed. An embedded configuration consists of files such as resource.xml, + variables.xml, and deployment.xml. + + +| Allow EJB reference targets to resolve automatically? | Specifies whether the embedded configuration should be processed. + + +| Deploy client modules? | Select if the file to deploy has one or more client modules and want to configure environment entries for the client modules. Default is do not enable Client Module. + + +| Validate schema? | Specifies whether to validate the deployment descriptors against published Java EE deployment descriptor schemas. + + +| Synchronize active nodes? | Specify whether to synchronize active nodes. Applicable only for Network Deployment installation. Enabled by default. + + +| Start application? | Specify whether to start application or not. Enabled by default. + + +| Reload interval in seconds | Specifies the number of seconds to scan the application's file system for updated files. Default is 3 seconds. + + +| Validate resource references | Specifies whether websphere examines the application references specified during application installation or updating and, if validation is + enabled, warns you of incorrect references or fails the operation. + + +| File permission | Specifies access permissions for application binaries. + + +| Customized file permission | Provide custom file permissions if not listed in File permissions drop down. + + +| Business level application name | Specifies whether websphere creates a new business-level application with the enterprise application that you are installing or makes the enterprise application a composition unit of an existing business-level application. The default is to create a new business-level application. + + +| Client deployment mode | Specifies whether to deploy client modules to an isolated deployment target (Isolated), a federated node of a deployment manager (Federated), + or an application server (Server Deployed). Default is Isolated + + +| Wsadmin Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Wsadmin Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. + + +| Wsadmin Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Wsadmin Additional Arguments | Additional arguements to be passed to wsadmin. + + +| Context root | Applicable only to web applications (WAR). +Specifies the context root of the web application (WAR). +A context root for each web module is defined in the application deployment descriptor during application assembly. Use this field to assign a different context root to a web module. The context root is combined with the defined servlet mapping (from the WAR file) to compose the full URL that users type to access the servlet. For example, if the context root is /gettingstarted and the servlet mapping is MySession, then the URL is http://host:port/gettingstarted/MySession. + + +|=== + + + + +=== Deploy Enterprise Application + +To deploy an enterprise application, do these steps: + +* Go to the DeployEnterpriseApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deployenterpriseapp/ec-webspheredeployenterpriseapp2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +enterprise application is deployed successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/deployenterpriseapp/ec-webspheredeployenterpriseapp3.png[image] + +In the *DeployEnterpriseApp* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/deployenterpriseapp/ec-webspheredeployenterpriseapp4.png[image] + + + +[[DeployOSGiApp]] +=== DeployOSGiApp + + +Deploy OSGi application using the wsadmin tool + + +This procedure deploys the OSGi application.It optionally configures external OSGi bundle library if the application to be deployed reference bundles that are stored in an external bundle repository. This procedure can also add the bundles to internal bundle repository, if required. + + +==== DeployOSGiApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Want to add external bundle repository? | If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required. + + +| External Bundle Repository Name | Name of the external bundle repository to configure. + + +| External Bundle Repository URL | URL of the external bundle repository to configure. + + +| List of bundles to add to local repository | Comma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar + + +| EBA file Path | Absolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'. + + +| Application Name | Name to be given to newly deployed OSGi application. + + +| Target Deployment Unit | Deployment Unit on which to deploy the OSGi application. For e.g cluster=cluster1 or node=node01,server=server1 + + +|=== + + + + +=== Deploy OSGi Application + +To deploy an OSGi application, do these steps: + +* Go to the DeployOSGiApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/deployosgi/ec-webspheredeployosgi2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +OSGi application is deployed successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/deployosgi/ec-webspheredeployosgi3.png[image] + +In the *DeployOSGi* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/deployosgi/ec-webspheredeployosgi4.png[image] + + + +[[UndeployApp]] +=== UndeployApp + + +Undeploys an application using AdminApp.uninstall + + +This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall. + + +==== UndeployApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the application to undeploy. i.e: 'webapp'. + + +| Commands | Commands to be entered to wsadmin. Use one command per line. + + +| Java Parameters | Java options to be passed to wsadmin, separate them using semicolons (;). + + +| Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar' + + +| Additional Commands | Additional commands to be entered for wsadmin. + + +|=== + + + + +=== Undeploying Applications + +To undeploy an application, do these steps: + +Go to the UndeployApp procedure. +Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/undeployapp/undeployapp2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +the application was undeployed +successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/undeployapp/undeployapp3.png[image] + +In the *UndeployApp* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/undeployapp/undeployapp4.png[image] + + + +[[UpdateApp]] +=== UpdateApp + + +Updates existing application + + +This procedure updates already deployed application in units of files, modules or entire application. + + +==== UpdateApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the web application to be updated. i.e: 'webapp'. + + +| Content Type | Specifies to type of content to update. Use File option for updating a single file, Partial Application option for updating application partially, Module option to add/update a module to the deployed application, Application option for updating the entire deployed application. + + +| Operation | Specifies to type of operation to perform as part of update procedure. Use Add option to add new content, Update option to update existing content, AddUpdate option to add content and to replace if already exist, Delete option to remove existing content respectively. + + +| Content | Specifies the file that contains the content that you want to update. For example, depending on the content type, the file could be an EAR file, a module, a partial zip, or a single file.Not required for Delete operation. + + +| Content URI | The relative path beginning with the installed application archive file to the file to be replaced or added. For example, if the file is located at com/company/greeting.class in module hello.jar, specify hello.jar/com/company/greeting.class for the relative path + + +| Cluster Name | Name of the cluster on which application is deployed. + + +| Server Name | Name of the server on which application is deployed. + + +| Additional Parameters | Additional parameters to pass while updating entire application or module/s, if required. For e.g. -nodeployejb, -BindJndiForEJBNonMessageBinding etc. + + +|=== + + + + +=== Update Application + +To update application , do these steps: + +* Go to the UpdateApp procedure. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/updateapp/ec-websphereupdateapp2.png[image] + +After the job runs, you can view the results, including the following job details, which show that +WSDL files are published successfully: + +image::cloudbees-common::cd-plugins/ec-websphere/updateapp/ec-websphereupdateapp3.png[image] + +In the *UpdateApp* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/updateapp/ec-websphereupdateapp4.png[image] + + + +[[CheckApp]] +=== CheckApp + + +Checks if a web application is ready + + +This procedure checks if a web application is ready by using a Jython script. + + +==== CheckApp Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Application Name | Name of the web application to be checked. i.e: 'webapp'. + + +| Application State Checked | + Application State that is being checked, with any applicable retries based on wait time parameter. + Any state that is not the desired state after any applicable retries, will be returned as a failure by the procedure. + + + +| Wait Time | Maximum duration of check application state retries. + + +|=== + + + + +=== Checking Application State + +To check Application State, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CheckApp from procedures picker. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/procedureconfig.png[image] + +After the job runs, you can view the results, including the following job details: + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/procedureresult.png[image] + +To check Application State in {CD} interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/pipelinepicker.png[image] + +* Click on arrow. + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/pipelineconfig.png[image] + +After the pipeline runs, you can view the results, including the following step details: + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/pipelineresult.png[image] + +In the *CheckApp* step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/checkapp/procedurelog.png[image] + + + +[[CheckNodeStatus]] +=== CheckNodeStatus + +**(Applicable only for WebSphere Network Deployment installation.)** + + + +Checks Node Status. + + +This procedure checks WebSphere node status. It checks Node Agent and all servers associated with node by it's name. + + +==== CheckNodeStatus Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Wsadmin Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. + + +| Name of the Node | Name of the Node, which should be checked. + + +| Success Criteria | Conditions that must be met for successful completion of the procedure. + + +|=== + + + + + + +[[CheckPageStatus]] +=== CheckPageStatus + + +Check the status of a page on a given URL + + +This procedure checks the status of the page with the specified URL. + + +==== CheckPageStatus Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Credentials to be entered | The credentials needed to check the status of the page. + + +| Target URL | URL of the page to be checked. + + +| Maximum Elapsed Time | Defines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time). + + +| Success Criteria | Indicates the expected correct result to be obtained when running checking the server. + + +|=== + + + + +=== Checking the Status of a Page + +To check the status of page at a specific URL, do the following steps: + +* Enter the following parameters: + +image::cloudbees-common::cd-plugins/ec-websphere/checkpagestatus/parameterstoenter.png[image] + +* Click *Run*. + +After the job runs, you can view the results, including the following job details, +which show that the criteria was reached: + +image::cloudbees-common::cd-plugins/ec-websphere/checkpagestatus/checkpagestatus5.png[image] + +In the *CheckPageStatus* step, click the Log +icon to see the diagnostic info. The output is similar +to the following diagnostic +report. + +image::cloudbees-common::cd-plugins/ec-websphere/checkpagestatus/checkpagestatus6.png[image] + + + +[[CheckServerStatus]] +=== CheckServerStatus + + +Check the status of the given server URL + + +This procedure checks the status of the specified server URL. + + +==== CheckServerStatus Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. + + +| Maximum Elapsed Time | Defines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time). + + +| Success Criteria | Indicates the expected correct result to be obtained when running checking the server. + + +|=== + + + + +image::cloudbees-common::cd-plugins/ec-websphere/checkserverstatus/cssparameters.png[image] + + + +[[Discover]] +=== Discover + + +Discover WebSphere instance configuration on a resources or environment + + + +==== Discover Parameters +[cols=",",options="header",] +|=== +| Parameter | Description + +| Configuration Name | The plugin's configuration name. + + +| Resource Names | List of resources, on which discovery procedure should run. Enter multiple values on separate lines. + + +|=== + + + + + + + + + + + + + + + + + + +[[rns]] +== Release notes + + +=== EC-WebSphere 3.8.1 + +- The documentation has been migrated to the main documentation site. + + +=== EC-WebSphere 3.8.0 + +- Add checking connection while creating a configuration. + +- Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved. + +- Add logging while running "CreateConfiguration". + + +=== EC-WebSphere 2.7.1 + +- Rebranding from "CloudBees Flow" to "{CD}". + + +=== EC-WebSphere 2.7.0 + +- Preserve time limit settings after upgrade. + + +=== EC-WebSphere 2.6.3 + +- Renaming from "Electric Cloud" to "CloudBees". + + +=== EC-WebSphere 2.6.2 + +- Configurations can be created by users with "@" sign in a name. + + +=== EC-WebSphere 2.6.1 + +- The plugin icon has been updated. + + +=== EC-WebSphere 2.6.0 + +- Following new procedures have been added to support management of clusters: + +* link:#CreateFirstClusterMember[CreateFirstClusterMember] +* link:#CreateClusterMembers[CreateClusterMembers] + +The Interface for the Following procedures have been Improved (for moving WSADMIN path to configuration, decoupling Application deployment from Start, Ability to sync nodes etc.,) + + * link:#StartCluster[StartCluster] + * link:#StopCluster[StopCluster] + * link:#CreateCluster[CreateCluster] + * link:#DeleteCluster[DeleteCluster] + * link:#ListClusterMembers[ListClusterMembers] + * link:#ListClusterMembers[RemoveClusterMembers] + +Error Reporting has been improved by leveraging postp to capture granular error messages in Diagnostics. + + + +=== EC-WebSphere 2.5.0 + +- Following New procedures have been added to support application server management: + + * link:#CreateApplicationServer[CreateApplicationServer] + * link:#DeleteApplicationServer[DeleteApplicationServer] + * link:#CreateApplicationServerTemplate[CreateApplicationServerTemplate] + * link:#DeleteApplicationServerTemplate[DeleteApplicationServerTemplate] + * link:#ExportApplicationServer[ExportApplicationServer] + * link:#ImportApplicationServer[ImportApplicationServer] + * link:#StartApplicationServers[StartApplicationServers] + * link:#StopApplicationServers[StopApplicationServers] + + Following New procedures have been added to support start and stop of Node and Deployment Manager: + + * link:#StartDeploymentManager[StartDeploymentManager] + * link:#StopDeploymentManager[StopDeploymentManager] + * link:#StartNode[StartNode] + * link:#StopNode[StopNode] + + WSAdmin Absolute path has been changed from non-required to required in plugin configuration. + + + +=== EC-WebSphere 2.4.1 + +- Configured the plugin to allow the ElectricFlow UI to create configs inline of procedure form. + + +=== EC-WebSphere 2.4.0 + +- Following New procedures have been added to support the entire set of IBM JMS functionality: + +* link:#CreateOrUpdateSIBJMSActivationSpec[CreateOrUpdateSIBJMSActivationSpec] +* link:#CreateOrUpdateWMQJMSActivationSpec[CreateOrUpdateWMQJMSActivationSpec] +* link:#CreateOrUpdateSIBJMSConnectionFactory[CreateOrUpdateSIBJMSConnectionFactory] +* link:#CreateOrUpdateWMQJMSConnectionFactory[CreateOrUpdateWMQJMSConnectionFactory] +* link:#DeleteJMSActivationSpec[DeleteJMSActivationSpec] +* link:#DeleteJMSConnectionFactory[DeleteJMSConnectionFactory] +* link:#DeleteJMSProvider[DeleteJMSProvider] + + + + +=== EC-WebSphere 2.3.1 + +- Help links have been updated for DeleteJMSTopic and DeleteJMSQueue procedures. + +- Configured the plugin to allow the ElectricFlow UI to render the plugin procedure parameters entirely using the configured form XMLs. + +- Enabled the plugin for managing the plugin configurations in-line when defining an application process step or a pipeline stage task. + + +=== EC-WebSphere 2.3.0 + +- Following New procedures have been added: + +* link:#DeleteJMSQueue[DeleteJMSQueue] +* link:#DeleteJMSTopic[DeleteJMSTopic] +* link:#CreateOrUpdateJMSQueue[CreateOrUpdateJMSQueue] +* link:#CreateOrUpdateJMSTopic[CreateOrUpdateJMSTopic] + +Fixed non-ascii characters in plugin forms. + + +Following procedures have been extended to support Websphere 9.0: + +* link:#StartApp[StartApp] +* link:#StopApp[StopApp] +* link:#StopCluster[StopCluster] + + +The Debug Level checkbox has been changed to a dropdown. The level will be defaulted to INFO if no value is chosen. + +WSAdmin Absolute Path has been added to configuration and made as an optional parameter for all the following procedures: + + * link:#CreateJMSProvider[CreateJMSProvider] + * link:#RunCustomJob[RunCustomJob] + * link:#DeployEnterpriseApp[DeployEnterpriseApp] + * link:#CreateJDBCProvider[CreateJDBCProvider] + * link:#CheckApp[CheckApp] + +link:#DeployEnterpriseApp[DeployEnterpriseApp] + + +Fixed an issue when application was not started on all servers during deployment if server name and node name are the same. + +link:#CreateJDBCProvider[CreateJDBCProvider] + +Fixed an error with attached credentials when in some cases it was not possible to create new JDBC provider. + +link:#CheckApp[CheckApp] + +Procedure has been improved and now it could check for different application states. + + + + +=== EC-WebSphere 2.2.4 + +- Documentation has been improved. + +- Cluster Scope field has been added to CreateJDBCProvider procedure. + + +=== EC-WebSphere 2.2.3 + +- Added support of parallel execution for all plugin procedures. + +- Added "Context root" parameter for Deploy Enterprise Application procedure. + +- Bug fixes in CheckPageStatus procedure. + +- Added warning instead of stack trace in the Stop/StartApp procedures if app was already stoped or started. + + +=== EC-WebSphere 2.2.2 + +- Added new procedures - SyncNodes, CheckNodeStatus. + +- Added following optional parameters to DeployEnterpriseApplication procedure: + +* "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default. +* "Start application": Start the deployed application after deploying the application. Enabled by default. + + + +- Changed default value for "Distribute application" from unchecked to checked. (Deploy Enterprise Application procedure). + + +=== EC-WebSphere 2.2.1 + +- Added new procedures - StartCluster, StopCluster, MapSharedLibrary, ModifyApplicationClassLoader. + +- DeployEnterpriseApp procedure will now update the application if it is already deployed. This procedure was refactored. + +- Added debugging in DeployEnterpriseApp procedure. + +- Bug fixes in DeployEnterpriseApplication procedure on WASND 8.5.5 Windows platform. + +- Bug fixes in UpdateApp procedure on WAS 8.5 and WASND 8.5.5 Windows platform. + +- Added application name to step log when ModifyApplicationClassLoader procedure fails to find application. + +- Added debug flag to plugin configurations. + + +=== EC-WebSphere 2.2.0 + +- Added suport for discovering WebSphere configuraiton on ElectricFlow resource. + +- Moved 'Connection Type' parameter for all plugin procedures to plugin's configuration. + +- Added 'Cluster Name' and 'Server Name' optional parameter to 'Start Application' and 'Stop Application' procedures. + + +=== EC-WebSphere 2.1.2 + +- Fixed issue with configurations being cached for IE. + + +=== EC-WebSphere 2.1.1 + +- Added link to plugin Configuration Page in plugin step panels. + + +=== EC-WebSphere 2.1.0 + +- Added support for WebSphere Network Deployment 8.5 + +- Added support to create a cluster, add application servers to it, deploy applications in the cluster, remove cluster members, and delete the cluster. + +- Added support to deploy Java enterprise applications (EARs) and web archives (WARs). + +- Added support to update deployed applications. + +- Added support to deploy OSGi applications and to configure external and internal bundle repositories. + +- Added support to configure session management component for deployed applications. + +- Added support for setting the EJB container properties for improved memory consumption and stateful session bean failover. + +- Added support for the JavaMail session. + + +=== EC-WebSphere 2.0.6 + +- Fixed the DeployApp procedure to not include the password in the log file. + +- Fixed the problem about attaching credentials in the CheckApp procedure. + +- Fixed the problem where the wsadmin password appeared when you view job step log files and property information. + +- Fixed instructions to create WebSphere plugin configurations. + +- Fixed instructions to access plugins in ElectricFlow. + + +=== EC-WebSphere 2.0.5 + +- Fix minor bugs. + + +=== EC-WebSphere 2.0.4 + +- Add four new procedures: CreateDatasources, DeleteDatasources, CreateJDBCProviders, and DeleteJDBCProviders. + +- Fix minor bugs. + + +=== EC-WebSphere 2.0.3 + +- Change the procedure names in the step picker section. + + +=== EC-WebSphere 2.0.2 + +- Make improvements to the help document. + + +=== EC-WebSphere 2.0.1 + +- Features and Enhancements in EC-WebSphere 2.0.1. + +- Use the new Parameter Form XML. + +- Add a link directly to the new help document. + + +=== EC-WebSphere 2.0.0 + +- Use the new help page format. + +- Add new parameter panels for each procedure. + + +=== EC-WebSphere 1.3.0 + +- Add the CheckPageStatus procedure. + +- Remove the CURL dependency from the CheckServerStatus procedure. + +- Fix minor bugs. + +- The procedures now have only one step using ec-perl to execute the necessary commands. + + +=== EC-WebSphere 1.2.1 + +- Fix a minor bug on the Configuration List page. + + +=== EC-WebSphere 1.2.0 + +- Add the StartApp, StopApp, DeployApp, and UndeployApp procedures. + + +=== EC-WebSphere 1.1.1 + +- Jython commands can now be entered manually in the RunCustomJob procedure. + +- The absolute path of executable files now requires the path and filename with an extension. + + +=== EC-WebSphere 1.1.0 + +- RunCustomJob procedure has been added. + + diff --git a/help/overview.md b/help/overview.md index b6bde7bc..2d1c1205 100644 --- a/help/overview.md +++ b/help/overview.md @@ -1,24 +1,3 @@ -WebSphere Application Server (WAS) is a software product that performs the role of a web application server. -More specifically, it is a software framework and middleware that hosts Java based web applications. -It is the flagship product within IBM's WebSphere software suite. -It was initially created by Donald F. Ferguson, who later became CTO of Software for Dell. -The first version was launched in 1998. -WAS is built using open standards such as Java EE, XML, and Web Services. -It is supported on the following platforms: - - Windows - - AIX - - Linux - - Solaris - - IBM i and z/OS. - -Beginning with Version 6.1 and now into Version 9.0, the open standard specifications are aligned and common across all the platforms. -Platform exploitation, to the extent it takes place, is done below the open standard specification line. -It works with a number of Web servers including Apache HTTP Server, Netscape Enterprise Server, Microsoft Internet Information Services (IIS), IBM HTTP Server for i5/OS, IBM HTTP Server for z/OS, and IBM HTTP Server for AIX/Linux/Microsoft Windows/Solaris. -It uses port 9060 for connection as the default administration port and port 9080 as the default website publication port. -In case you install more WebSphere instances these values will be changed. - -For more information about WebSphere, go to the WebSphere Home Page. - ## CloudBees CD Integration to WebSphere You can use this plugin to interact with an IBM WebSphere Server. You can start and stop the server. @@ -33,11 +12,13 @@ created. ## Integrated Version The plugin was tested on following WebSphere versions: + + - WAS and WASND 9.0 on Linux and Windows - WAS and WASND 8.5.5 on Linux and Windows - WAS and WASND 8.5.0 on Linux and Windows - WAS and WASND 8.0 on Linux and Windows - WAS 7.0 on Linux and Windows. Beginning Release 2.4 we do not certify this plugin on the 7.0 version of WAS considering that this version is not actively supported by IBM since April 2018. - Please refer to this IBM Link + Please refer to this [IBM Link](https://www-01.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/3/897/ENUS916-143/index.html&lang=en&request_locale=en) diff --git a/help/procedures/CheckApp/postface.md b/help/procedures/CheckApp/postface.md index 2a7c563d..3988821e 100644 --- a/help/procedures/CheckApp/postface.md +++ b/help/procedures/CheckApp/postface.md @@ -1,25 +1,45 @@ -

                              Checking Application State

                              -

                              To check Application State, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CheckApp from procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. -
                              -

                              After the job runs, you can view the results, including the following job details:

                              - - -

                              To check Application State in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters:

                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. -
                              -

                              After the pipeline runs, you can view the results, including the following step details:

                              - -

                              In the CheckApp step, click the Log icon +### Checking Application State + +To check Application State, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CheckApp from procedures picker. + +* Enter the following parameters: + +![image](images/CheckApp/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following job details: + +![image](images/CheckApp/ProcedureResult.png) + + +To check Application State in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CheckApp/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CheckApp/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the following step details: + +![image](images/CheckApp/PipelineResult.png) + +In the **CheckApp** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic -report.

                              - \ No newline at end of file +report. + +![image](images/CheckApp/ProcedureLog.png) diff --git a/help/procedures/CheckNodeStatus/token.txt b/help/procedures/CheckNodeStatus/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CheckNodeStatus/token.txt +++ b/help/procedures/CheckNodeStatus/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CheckPageStatus/postface.md b/help/procedures/CheckPageStatus/postface.md index 1fd4938e..0913ab29 100644 --- a/help/procedures/CheckPageStatus/postface.md +++ b/help/procedures/CheckPageStatus/postface.md @@ -1,14 +1,21 @@ -

                              Checking the Status of a Page

                              -

                              To check the status of page at a specific URL, do the following steps:

                              -
                                -
                              1. Enter the following parameters:
                              2. - -
                              3. Click Run.
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, - which show that the criteria was reached:

                              - -

                              In the CheckPageStatus step, click the Log - icon to see the diagnostic info. The output is similar - to the following diagnostic - report.

                              \ No newline at end of file +### Checking the Status of a Page + +To check the status of page at a specific URL, do the following steps: + +* Enter the following parameters: + +![image](images/CheckPageStatus/parametersToEnter.png) + +* Click **Run**. + +After the job runs, you can view the results, including the following job details, +which show that the criteria was reached: + +![image](images/CheckPageStatus/checkPageStatus5.png) + +In the **CheckPageStatus** step, click the Log +icon to see the diagnostic info. The output is similar +to the following diagnostic +report. + +![image](images/CheckPageStatus/checkPageStatus6.png) diff --git a/help/procedures/CheckServerStatus/postface.md b/help/procedures/CheckServerStatus/postface.md index fcb6dc5e..2b67c329 100644 --- a/help/procedures/CheckServerStatus/postface.md +++ b/help/procedures/CheckServerStatus/postface.md @@ -1 +1,3 @@ - \ No newline at end of file + + +![image](images/CheckServerStatus/CSSparameters.png) diff --git a/help/procedures/ConfigEJBContainer/postface.md b/help/procedures/ConfigEJBContainer/postface.md index 4888cc13..6e9f4876 100644 --- a/help/procedures/ConfigEJBContainer/postface.md +++ b/help/procedures/ConfigEJBContainer/postface.md @@ -1,14 +1,22 @@ -

                              Configure EJB Container

                              -

                              To Configure EJB Container, do these steps:

                              -
                                -
                              1. Go to the ConfigEJBContainer procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - EJB container is configured successfully:

                              - -

                              In the ConfigEJBContainer step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Configure EJB Container + +To Configure EJB Container, do these steps: + +* Go to the ConfigEJBContainer procedure. + +* Enter the following parameters: + +![image](images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer2.png) + + +After the job runs, you can view the results, including the following job details, which show that +EJB container is configured successfully: + +![image](images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer3.png) + +In the **ConfigEJBContainer** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer4.png) diff --git a/help/procedures/ConfigureSession/postface.md b/help/procedures/ConfigureSession/postface.md index 125ce1a8..428dc12a 100644 --- a/help/procedures/ConfigureSession/postface.md +++ b/help/procedures/ConfigureSession/postface.md @@ -1,14 +1,22 @@ -

                              Configure Session Management for application

                              -

                              To Configure Session Management for application, do these steps:

                              -
                                -
                              1. Go to the ConfigureSession procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - the cluster was created successfully:

                              - -

                              In the ConfigureSession step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Configure Session Management for application + +To Configure Session Management for application, do these steps: + +* Go to the ConfigureSession procedure. + +* Enter the following parameters: + +![image](images/ConfigureSession/EC-WebSphereConfigureSession2.png) + + +After the job runs, you can view the results, including the following job details, which show that +the cluster was created successfully: + +![image](images/ConfigureSession/EC-WebSphereConfigureSession3.png) + +In the **ConfigureSession** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/ConfigureSession/EC-WebSphereConfigureSession4.png) diff --git a/help/procedures/ConfigureSession/preface.md b/help/procedures/ConfigureSession/preface.md index bbcccd10..978d7443 100644 --- a/help/procedures/ConfigureSession/preface.md +++ b/help/procedures/ConfigureSession/preface.md @@ -1 +1 @@ -This procedure configures the session management related properties for deployed application. For more information on each of the parameter, please refer to the WebSphere Knowledge Center Page. \ No newline at end of file +This procedure configures the session management related properties for deployed application. For more information on each of the parameter, please refer to the [WebSphere Knowledge Center Page](http://www-01.ibm.com/support/knowledgecenter/SSCKBL_8.5.5/com.ibm.websphere.nd.doc/ae/uprs_rsession_manager.html). \ No newline at end of file diff --git a/help/procedures/CreateApplicationServer/postface.md b/help/procedures/CreateApplicationServer/postface.md index 110395e4..7bd0ef56 100644 --- a/help/procedures/CreateApplicationServer/postface.md +++ b/help/procedures/CreateApplicationServer/postface.md @@ -3,15 +3,26 @@ To Create Application Server in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateApplicationServer/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateApplicationServer/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the CreateApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/CreateApplicationServer/PipelineResult.png) + +In the **CreateApplicationServer** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/CreateApplicationServer/PipelineLog.png) + diff --git a/help/procedures/CreateApplicationServer/token.txt b/help/procedures/CreateApplicationServer/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CreateApplicationServer/token.txt +++ b/help/procedures/CreateApplicationServer/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CreateApplicationServerTemplate/postface.md b/help/procedures/CreateApplicationServerTemplate/postface.md index 1ca8d202..8300dcb6 100644 --- a/help/procedures/CreateApplicationServerTemplate/postface.md +++ b/help/procedures/CreateApplicationServerTemplate/postface.md @@ -3,15 +3,26 @@ To Create Application Server Template in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateApplicationServerTemplate/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateApplicationServerTemplate/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the CreateApplicationServerTemplate step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/CreateApplicationServerTemplate/PipelineResult.png) + +In the **CreateApplicationServerTemplate** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/CreateApplicationServerTemplate/PipelineLog.png) + diff --git a/help/procedures/CreateApplicationServerTemplate/token.txt b/help/procedures/CreateApplicationServerTemplate/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CreateApplicationServerTemplate/token.txt +++ b/help/procedures/CreateApplicationServerTemplate/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CreateCluster/postface.md b/help/procedures/CreateCluster/postface.md index 32c4ae5e..f3bb6125 100644 --- a/help/procedures/CreateCluster/postface.md +++ b/help/procedures/CreateCluster/postface.md @@ -3,15 +3,26 @@ To Create Cluster in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateCluster/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateCluster/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the CreateCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/CreateCluster/PipelineResult.png) + +In the **CreateCluster** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/CreateCluster/PipelineLog.png) + diff --git a/help/procedures/CreateCluster/token.txt b/help/procedures/CreateCluster/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CreateCluster/token.txt +++ b/help/procedures/CreateCluster/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CreateClusterMembers/postface.md b/help/procedures/CreateClusterMembers/postface.md index c98ac971..3d0ce833 100644 --- a/help/procedures/CreateClusterMembers/postface.md +++ b/help/procedures/CreateClusterMembers/postface.md @@ -3,15 +3,26 @@ To Create Cluster Members in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateClusterMembers/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateClusterMembers/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the CreateClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/CreateClusterMembers/PipelineResult.png) + +In the **CreateClusterMembers** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/CreateClusterMembers/PipelineLog.png) + diff --git a/help/procedures/CreateClusterMembers/token.txt b/help/procedures/CreateClusterMembers/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CreateClusterMembers/token.txt +++ b/help/procedures/CreateClusterMembers/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CreateConfiguration/preface.md b/help/procedures/CreateConfiguration/preface.md index dba65b63..ae7060d9 100644 --- a/help/procedures/CreateConfiguration/preface.md +++ b/help/procedures/CreateConfiguration/preface.md @@ -1,5 +1,7 @@ -Note: After you perform the setup below it is important to make sure that the CloudBees CD agent machine on which WebSphere runs is registered as a resource that can be pinged. -
                              +**Note: After you perform the setup below it is important to make sure that the CloudBees CD agent machine on which WebSphere runs is registered as a resource that can be pinged.** + +![image](images/Config/parameters.png) + Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. They reduce repetition of common values, create predefined parameter sets for end users, and securely store credentials where needed. diff --git a/help/procedures/CreateDatasource/postface.md b/help/procedures/CreateDatasource/postface.md index e998e5b1..53ce8be4 100644 --- a/help/procedures/CreateDatasource/postface.md +++ b/help/procedures/CreateDatasource/postface.md @@ -1,14 +1,20 @@ -

                              To create a datasource, do the following steps:

                              -
                                -
                              1. Go to the CreateDataSource procedure.
                              2. - -
                              3. Enter the following parameters:
                              4. - -
                              -

                              After the job runs, you can view the results, including the following job details, - which show that the datasource was successfully created:

                              - -

                              In the CreateDatasource step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              \ No newline at end of file +To create a datasource, do the following steps: + +* Go to the CreateDataSource procedure. + +* Enter the following parameters: + +![image](images/CreateDatasource/EC-WebSphereCreateDatasource2.png) + + +After the job runs, you can view the results, including the following job details, +which show that the datasource was successfully created: + +![image](images/CreateDatasource/EC-WebSphereCreateDatasource3.png) + +In the **CreateDatasource** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/CreateDatasource/EC-WebSphereCreateDatasource4.png) diff --git a/help/procedures/CreateEndToEndMailProvider/postface.md b/help/procedures/CreateEndToEndMailProvider/postface.md index b8ba09e7..4acea9fc 100644 --- a/help/procedures/CreateEndToEndMailProvider/postface.md +++ b/help/procedures/CreateEndToEndMailProvider/postface.md @@ -1,14 +1,22 @@ -

                              CreateEndToEndMailProvider

                              -

                              To create a new mail provider along with protocol provider and mail session, do these steps:

                              -
                                -
                              1. Go to the CreateEndToEndMailProvider procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - OSGi application is deployed successfully:

                              - -

                              In the CreateEndToEndMailProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### CreateEndToEndMailProvider + +To create a new mail provider along with protocol provider and mail session, do these steps: + +* Go to the CreateEndToEndMailProvider procedure. + +* Enter the following parameters: + +![image](images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider2.png) + + +After the job runs, you can view the results, including the following job details, which show that +OSGi application is deployed successfully: + +![image](images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider3.png) + +In the **CreateEndToEndMailProvider** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider4.png) diff --git a/help/procedures/CreateFirstClusterMember/postface.md b/help/procedures/CreateFirstClusterMember/postface.md index 9acb0657..b3c12402 100644 --- a/help/procedures/CreateFirstClusterMember/postface.md +++ b/help/procedures/CreateFirstClusterMember/postface.md @@ -3,15 +3,26 @@ To Create First Cluster Member in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateFirstClusterMember/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateFirstClusterMember/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the CreateFirstClusterMember step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/CreateFirstClusterMember/PipelineResult.png) + +In the **CreateFirstClusterMember** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/CreateFirstClusterMember/PipelineLog.png) + diff --git a/help/procedures/CreateFirstClusterMember/token.txt b/help/procedures/CreateFirstClusterMember/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/CreateFirstClusterMember/token.txt +++ b/help/procedures/CreateFirstClusterMember/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/CreateJDBCProvider/postface.md b/help/procedures/CreateJDBCProvider/postface.md index 6a1c8fc7..1fdea550 100644 --- a/help/procedures/CreateJDBCProvider/postface.md +++ b/help/procedures/CreateJDBCProvider/postface.md @@ -1,15 +1,22 @@ -

                              Creating a JDBC Providers

                              -

                              To create a JDBC provider, do these steps:

                              -
                                -
                              1. Go to the CreateJDBCProvider procedure.
                              2. - -
                              3. Enter the following parameters:
                              4. - -
                              -

                              After the job runs, you can view the results, including the following job details, - which show that JDBC provider was successfully created:

                              - -

                              In the CreateJDBCProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              \ No newline at end of file +### Creating a JDBC Providers + +To create a JDBC provider, do these steps: + +* Go to the CreateJDBCProvider procedure. + +* Enter the following parameters: + +![image](images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider2.png) + + +After the job runs, you can view the results, including the following job details, +which show that JDBC provider was successfully created: + +![image](images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider3.png) + +In the **CreateJDBCProvider** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider4.png) diff --git a/help/procedures/CreateJMSProvider/postface.md b/help/procedures/CreateJMSProvider/postface.md index 269f6b3e..42a691a4 100644 --- a/help/procedures/CreateJMSProvider/postface.md +++ b/help/procedures/CreateJMSProvider/postface.md @@ -1,6 +1,11 @@ -

                              Create JMS Provider

                              -

                              To create a new JMS provider, do these steps:

                              -
                                -
                              1. Go to the CreateJMSProvider procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              \ No newline at end of file +### Create JMS Provider + +To create a new JMS provider, do these steps: + +* Go to the CreateJMSProvider procedure. + +* Enter the following parameters: + +![image](images/CreateJMSProvider/EC-WebSphereCreateJMSProvider2.png) + + \ No newline at end of file diff --git a/help/procedures/CreateMailSession/postface.md b/help/procedures/CreateMailSession/postface.md index 723bea96..46c46667 100644 --- a/help/procedures/CreateMailSession/postface.md +++ b/help/procedures/CreateMailSession/postface.md @@ -1,14 +1,22 @@ -

                              Create Mail Session

                              -

                              To create a mail session for default mail provider, do these steps:

                              -
                                -
                              1. Go to the CreateMailSession procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - mail session is created successfully:

                              - -

                              In the CreateMailSession step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Create Mail Session + +To create a mail session for default mail provider, do these steps: + +* Go to the CreateMailSession procedure. + +* Enter the following parameters: + +![image](images/CreateMailSession/EC-WebSphereCreateMailSession2.png) + + +After the job runs, you can view the results, including the following job details, which show that +mail session is created successfully: + +![image](images/CreateMailSession/EC-WebSphereCreateMailSession3.png) + +In the **CreateMailSession** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/CreateMailSession/EC-WebSphereCreateMailSession4.png) diff --git a/help/procedures/CreateOrUpdateJMSQueue/postface.md b/help/procedures/CreateOrUpdateJMSQueue/postface.md index 81f00038..6e3cd53b 100644 --- a/help/procedures/CreateOrUpdateJMSQueue/postface.md +++ b/help/procedures/CreateOrUpdateJMSQueue/postface.md @@ -1,30 +1,46 @@ -

                              Create or update JMS Queue

                              -

                              To create or update JMS Queue in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateJMSQueue from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update JMS Queue in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateJMSQueue step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Create or update JMS Queue + +To create or update JMS Queue in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateJMSQueue from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateJMSQueue/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateJMSQueue/ProcedureResult.png) + +To create or update JMS Queue in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateJMSQueue/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateJMSQueue/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateJMSQueue/PipelineResult.png) + +In the **CreateOrUpdateJMSQueue** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateJMSQueue/ProcedureLog.png) diff --git a/help/procedures/CreateOrUpdateJMSTopic/postface.md b/help/procedures/CreateOrUpdateJMSTopic/postface.md index 4498f0fe..dcc74133 100644 --- a/help/procedures/CreateOrUpdateJMSTopic/postface.md +++ b/help/procedures/CreateOrUpdateJMSTopic/postface.md @@ -1,30 +1,46 @@ -

                              Create or update JMS Topic

                              -

                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateJMSTopic from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateJMSTopic step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file + ### Create or update JMS Topic + +To create or update JMS Topic in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateJMSTopic from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateJMSTopic/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateJMSTopic/ProcedureResult.png) + +To create or update JMS Topic in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateJMSTopic/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateJMSTopic/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateJMSTopic/PipelineResult.png) + +In the **CreateOrUpdateJMSTopic** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateJMSTopic/ProcedureLog.png) diff --git a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md index 952c1390..21a30587 100644 --- a/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSActivationSpec/postface.md @@ -1,30 +1,46 @@ -

                              Create or update SIB JMS Activation Spec

                              -

                              To create or update JMS Activation Spec in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateSIBJMSActivationSpec step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Create or update SIB JMS Activation Spec + +To create or update JMS Activation Spec in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateSIBJMSActivationSpec/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateSIBJMSActivationSpec/ProcedureResult.png) + +To create or update JMS Topic in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateSIBJMSActivationSpec/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateSIBJMSActivationSpec/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateSIBJMSActivationSpec/PipelineResult.png) + +In the **CreateOrUpdateSIBJMSActivationSpec** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateSIBJMSActivationSpec/ProcedureLog.png) diff --git a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md index cb6327b4..19a781cc 100644 --- a/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateSIBJMSConnectionFactory/postface.md @@ -1,30 +1,46 @@ -

                              Create or update SIB JMS Connection Factory

                              -

                              To create or update SIB JMS Connection Factory in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateSIBJMSConnectionFactory step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Create or update SIB JMS Connection Factory + +To create or update SIB JMS Connection Factory in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureResult.png) + +To create or update JMS Topic in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/PipelineResult.png) + +In the **CreateOrUpdateSIBJMSConnectionFactory** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureLog.png) diff --git a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md index bac0950c..ee5d3c41 100644 --- a/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSActivationSpec/postface.md @@ -1,30 +1,46 @@ -

                              Create or update WMQ JMS Activation Spec

                              -

                              To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateWMQJMSActivationSpec step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Create or update WMQ JMS Activation Spec + +To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateWMQJMSActivationSpec/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateWMQJMSActivationSpec/ProcedureResult.png) + +To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateWMQJMSActivationSpec/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateWMQJMSActivationSpec/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateWMQJMSActivationSpec/PipelineResult.png) + +In the **CreateOrUpdateWMQJMSActivationSpec** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateWMQJMSActivationSpec/ProcedureLog.png) diff --git a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md index 973bdb37..cd36d6e2 100644 --- a/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md +++ b/help/procedures/CreateOrUpdateWMQJMSConnectionFactory/postface.md @@ -1,30 +1,46 @@ -

                              Create or update WMQ JMS Connection Factory

                              -

                              To create or update WMQ JMS Connection Factory in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from - procedures picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To create or update JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the CreateOrUpdateWMQJMSConnectionFactory step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Create or update WMQ JMS Connection Factory + +To create or update WMQ JMS Connection Factory in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from + procedures picker. + +* Enter the following parameters: + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureResult.png) + +To create or update JMS Topic in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/PipelineResult.png) + +In the **CreateOrUpdateWMQJMSConnectionFactory** step, click the Log icon to see +the diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureLog.png) diff --git a/help/procedures/DeleteApplicationServer/postface.md b/help/procedures/DeleteApplicationServer/postface.md index 8b843f5c..e8a61bcc 100644 --- a/help/procedures/DeleteApplicationServer/postface.md +++ b/help/procedures/DeleteApplicationServer/postface.md @@ -3,15 +3,26 @@ To Delete Application Server in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteApplicationServer/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteApplicationServer/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the DeleteApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/DeleteApplicationServer/PipelineResult.png) + +In the **DeleteApplicationServer** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/DeleteApplicationServer/PipelineLog.png) + diff --git a/help/procedures/DeleteApplicationServer/token.txt b/help/procedures/DeleteApplicationServer/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/DeleteApplicationServer/token.txt +++ b/help/procedures/DeleteApplicationServer/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/DeleteApplicationServerTemplate/postface.md b/help/procedures/DeleteApplicationServerTemplate/postface.md index a910139d..9588e47a 100644 --- a/help/procedures/DeleteApplicationServerTemplate/postface.md +++ b/help/procedures/DeleteApplicationServerTemplate/postface.md @@ -3,15 +3,26 @@ To Delete Application Server Template in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteApplicationServerTemplate/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteApplicationServerTemplate/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the DeleteApplicationServerTemplate step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/DeleteApplicationServerTemplate/PipelineResult.png) + +In the **DeleteApplicationServerTemplate** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/DeleteApplicationServerTemplate/PipelineLog.png) + diff --git a/help/procedures/DeleteApplicationServerTemplate/token.txt b/help/procedures/DeleteApplicationServerTemplate/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/DeleteApplicationServerTemplate/token.txt +++ b/help/procedures/DeleteApplicationServerTemplate/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/DeleteCluster/postface.md b/help/procedures/DeleteCluster/postface.md index a19f6c2c..bfe5ac27 100644 --- a/help/procedures/DeleteCluster/postface.md +++ b/help/procedures/DeleteCluster/postface.md @@ -3,15 +3,26 @@ To Delete Cluster in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteCluster/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteCluster/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the DeleteCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/DeleteCluster/PipelineResult.png) + +In the **DeleteCluster** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/DeleteCluster/PipelineLog.png) + diff --git a/help/procedures/DeleteCluster/token.txt b/help/procedures/DeleteCluster/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/DeleteCluster/token.txt +++ b/help/procedures/DeleteCluster/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/DeleteDatasource/postface.md b/help/procedures/DeleteDatasource/postface.md index a1286cc8..66e7a56d 100644 --- a/help/procedures/DeleteDatasource/postface.md +++ b/help/procedures/DeleteDatasource/postface.md @@ -1,14 +1,23 @@ -

                              Deleting Datasources

                              -

                              To delete a datasource, do these steps:

                              -
                                -
                              1. Go to the DeleteDatasource procedure.
                              2. - -
                              3. Enter the following parameters:
                              4. - -
                              -

                              After the job runs, you can view the results, including the following job details, which show that the datasource was deleted -successfully:

                              -

                              In the DeleteDatasource step, click the Log icon +### Deleting Datasources + +To delete a datasource, do these steps: + +* Go to the DeleteDatasource procedure. + +* Enter the following parameters: + +![image](images/DeleteDatasource/EC-WebSphereDeleteDatasource2.png) + + +After the job runs, you can view the results, including the following job details, which show that the datasource was deleted +successfully: + +![image](images/DeleteDatasource/EC-WebSphereDeleteDatasource3.png) + +In the **DeleteDatasource** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic -report.

                              +report. + +![image](images/DeleteDatasource/EC-WebSphereDeleteDatasource4.png) + diff --git a/help/procedures/DeleteJDBCProvider/postface.md b/help/procedures/DeleteJDBCProvider/postface.md index a121b8d7..6025a7fd 100644 --- a/help/procedures/DeleteJDBCProvider/postface.md +++ b/help/procedures/DeleteJDBCProvider/postface.md @@ -1,14 +1,22 @@ -

                              Deleting JDBC Providers

                              -

                              To delete a JDBC provider, do these steps:

                              -
                                -
                              1. Go to the DeleteJDBCProvider procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - the JDBC provider was deleted successfully:

                              - -

                              In the DeleteJDBCProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Deleting JDBC Providers + +To delete a JDBC provider, do these steps: + +* Go to the DeleteJDBCProvider procedure. + +* Enter the following parameters: + +![image](images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider2.png) + + +After the job runs, you can view the results, including the following job details, which show that +the JDBC provider was deleted successfully: + +![image](images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider3.png) + +In the **DeleteJDBCProvider** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider4.png) diff --git a/help/procedures/DeleteJMSActivationSpec/postface.md b/help/procedures/DeleteJMSActivationSpec/postface.md index 2848bea7..af05b996 100644 --- a/help/procedures/DeleteJMSActivationSpec/postface.md +++ b/help/procedures/DeleteJMSActivationSpec/postface.md @@ -1,34 +1,52 @@ -

                              Delete JMS Activation Spec

                              -

                              To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures - picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              In the DeleteJMSActivationSpec step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - -

                              To delete JMS Activation Spec in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the pipeline tasks click on "Update SIB JMS Activation Spec", then click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Delete JMS Activation Spec + +To delete JMS Activation Spec in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures + picker. + +* Enter the following parameters: + +![image](images/DeleteJMSActivationSpec/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/DeleteJMSActivationSpec/ProcedureResult.png) + +In the **DeleteJMSActivationSpec** step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSActivationSpec/ProcedureLog.png) + +To delete JMS Activation Spec in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteJMSActivationSpec/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteJMSActivationSpec/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/DeleteJMSActivationSpec/PipelineResult.png) + +In the pipeline tasks click on "Update SIB JMS Activation Spec", then click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSActivationSpec/PipelineLog.png) diff --git a/help/procedures/DeleteJMSConnectionFactory/postface.md b/help/procedures/DeleteJMSConnectionFactory/postface.md index 4a7bc221..67c0ab04 100644 --- a/help/procedures/DeleteJMSConnectionFactory/postface.md +++ b/help/procedures/DeleteJMSConnectionFactory/postface.md @@ -1,30 +1,46 @@ -

                              Delete JMS ConnectionFactory

                              -

                              To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures - picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the DeleteJMSConnectionFactory step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Delete JMS ConnectionFactory + +To delete JMS ConnectionFactory in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures +picker. + +* Enter the following parameters: + +![image](images/DeleteJMSConnectionFactory/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/DeleteJMSConnectionFactory/ProcedureResult.png) + +To delete JMS ConnectionFactory in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteJMSConnectionFactory/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteJMSConnectionFactory/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/DeleteJMSConnectionFactory/PipelineResult.png) + +In the **DeleteJMSConnectionFactory** step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSConnectionFactory/ProcedureLog.png) diff --git a/help/procedures/DeleteJMSProvider/postface.md b/help/procedures/DeleteJMSProvider/postface.md index a058d6da..f747b7e9 100644 --- a/help/procedures/DeleteJMSProvider/postface.md +++ b/help/procedures/DeleteJMSProvider/postface.md @@ -1,30 +1,46 @@ -

                              Delete JMS Provider

                              -

                              To delete JMS Provider in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose DeleteJMSProvider from procedures - picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To delete JMS Provider in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the DeleteJMSProvider step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Delete JMS Provider + +To delete JMS Provider in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSProvider from procedures + picker. + +* Enter the following parameters: + +![image](images/DeleteJMSProvider/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/DeleteJMSProvider/ProcedureResult.png) + +To delete JMS Provider in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteJMSProvider/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteJMSProvider/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/DeleteJMSProvider/PipelineResult.png) + +In the **DeleteJMSProvider** step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSProvider/ProcedureLog.png) diff --git a/help/procedures/DeleteJMSQueue/postface.md b/help/procedures/DeleteJMSQueue/postface.md index 9e1a00ae..78154616 100644 --- a/help/procedures/DeleteJMSQueue/postface.md +++ b/help/procedures/DeleteJMSQueue/postface.md @@ -1,30 +1,46 @@ -

                              Delete JMS Queue

                              -

                              To delete JMS Queue in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose DeleteJMSQueue from procedures - picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To delete JMS Queue in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the DeleteJMSQueue step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Delete JMS Queue + +To delete JMS Queue in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSQueue from procedures +picker. + +* Enter the following parameters: + +![image](images/DeleteJMSQueue/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/DeleteJMSQueue/ProcedureResult.png) + +To delete JMS Queue in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteJMSQueue/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteJMSQueue/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/DeleteJMSQueue/PipelineResult.png) + +In the **DeleteJMSQueue** step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSQueue/ProcedureLog.png) diff --git a/help/procedures/DeleteJMSTopic/postface.md b/help/procedures/DeleteJMSTopic/postface.md index 4d967e77..a99f12c4 100644 --- a/help/procedures/DeleteJMSTopic/postface.md +++ b/help/procedures/DeleteJMSTopic/postface.md @@ -1,30 +1,46 @@ -

                              Delete JMS Topic

                              -

                              To delete JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create procedure.
                              2. -
                              3. Create step, choose Plugin, choose DeleteJMSTopic from procedures - picker.
                              4. -
                              5. Enter the following parameters:
                              6. - -
                              -

                              After the job runs, you can view the results, including the following - job details:

                              - -

                              To delete JMS Topic in CloudBees CD interface, do these steps:

                              -
                                -
                              1. Create Pipeline.
                              2. -
                              3. Create task.
                              4. -
                              5. In task definition choose Plugin and choose following parameters: -

                                -
                              6. -
                              7. Click on arrow.
                              8. -
                              9. Enter the following parameters:
                              10. - -
                              -

                              After the pipeline runs, you can view the results, including the - following step details:

                              - -

                              In the DeleteJMSTopic step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

                              - \ No newline at end of file +### Delete JMS Topic + +To delete JMS Topic in CloudBees CD interface, do these steps: + +* Create procedure. + +* Create step, choose Plugin, choose DeleteJMSTopic from procedures + picker. + +* Enter the following parameters: + +![image](images/DeleteJMSTopic/ProcedureConfig.png) + + +After the job runs, you can view the results, including the following +job details: + +![image](images/DeleteJMSTopic/ProcedureResult.png) + +To delete JMS Topic in CloudBees CD interface, do these steps: + +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/DeleteJMSTopic/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/DeleteJMSTopic/PipelineConfig.png) + + +After the pipeline runs, you can view the results, including the +following step details: + +![image](images/DeleteJMSTopic/PipelineResult.png) + +In the **DeleteJMSTopic** step, click the Log icon to see the +diagnostic information. The output is similar to the following +diagnostic report. + +![image](images/DeleteJMSTopic/ProcedureLog.png) diff --git a/help/procedures/DeployApp/postface.md b/help/procedures/DeployApp/postface.md index 1aa45444..a15fb316 100644 --- a/help/procedures/DeployApp/postface.md +++ b/help/procedures/DeployApp/postface.md @@ -1,15 +1,25 @@ -

                              Deploying Applications

                              -

                              To deploy an application, do these steps:select the following - highlighted - step:

                              -
                                -
                              1. Go to the DeployApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that the - application was deployed - successfully:

                              -

                              In the DeployApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

                              \ No newline at end of file +### Deploying Applications + +To deploy an application, do these steps:select the following +highlighted +step: + +* Go to the DeployApp procedure. + +* Enter the following parameters: + +![image](images/DeployApp/deployApp2.png) + + +After the job runs, you can view the results, including the following job details, which show that the +application was deployed +successfully: + +![image](images/DeployApp/deployApp3.png) + +In the **DeployApp** step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +![image](images/DeployApp/deployApp4.png) diff --git a/help/procedures/DeployEnterpriseApp/postface.md b/help/procedures/DeployEnterpriseApp/postface.md index de84b56b..f1c843ea 100644 --- a/help/procedures/DeployEnterpriseApp/postface.md +++ b/help/procedures/DeployEnterpriseApp/postface.md @@ -1,14 +1,22 @@ -

                              Deploy Enterprise Application

                              -

                              To deploy an enterprise application, do these steps:

                              -
                                -
                              1. Go to the DeployEnterpriseApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - enterprise application is deployed successfully:

                              - -

                              In the DeployEnterpriseApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Deploy Enterprise Application + +To deploy an enterprise application, do these steps: + +* Go to the DeployEnterpriseApp procedure. + +* Enter the following parameters: + +![image](images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp2.png) + + +After the job runs, you can view the results, including the following job details, which show that +enterprise application is deployed successfully: + +![image](images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp3.png) + +In the **DeployEnterpriseApp** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp4.png) diff --git a/help/procedures/DeployOSGiApp/postface.md b/help/procedures/DeployOSGiApp/postface.md index afdf7f08..733952c6 100644 --- a/help/procedures/DeployOSGiApp/postface.md +++ b/help/procedures/DeployOSGiApp/postface.md @@ -1,14 +1,22 @@ -

                              Deploy OSGi Application

                              -

                              To deploy an OSGi application, do these steps:

                              -
                                -
                              1. Go to the DeployOSGiApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - OSGi application is deployed successfully:

                              - -

                              In the DeployOSGi step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Deploy OSGi Application + +To deploy an OSGi application, do these steps: + +* Go to the DeployOSGiApp procedure. + +* Enter the following parameters: + +![image](images/DeployOSGi/EC-WebSphereDeployOSGi2.png) + + +After the job runs, you can view the results, including the following job details, which show that +OSGi application is deployed successfully: + +![image](images/DeployOSGi/EC-WebSphereDeployOSGi3.png) + +In the **DeployOSGi** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/DeployOSGi/EC-WebSphereDeployOSGi4.png) diff --git a/help/procedures/ExportApplicationServer/postface.md b/help/procedures/ExportApplicationServer/postface.md index 9dcfa5d3..13c0b0fe 100644 --- a/help/procedures/ExportApplicationServer/postface.md +++ b/help/procedures/ExportApplicationServer/postface.md @@ -3,15 +3,26 @@ To Export Application Server in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/ExportApplicationServer/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/ExportApplicationServer/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the ExportApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/ExportApplicationServer/PipelineResult.png) + +In the **ExportApplicationServer** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/ExportApplicationServer/PipelineLog.png) + diff --git a/help/procedures/ExportApplicationServer/token.txt b/help/procedures/ExportApplicationServer/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/ExportApplicationServer/token.txt +++ b/help/procedures/ExportApplicationServer/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/ImportApplicationServer/postface.md b/help/procedures/ImportApplicationServer/postface.md index bb58d9e7..2586e809 100644 --- a/help/procedures/ImportApplicationServer/postface.md +++ b/help/procedures/ImportApplicationServer/postface.md @@ -3,15 +3,26 @@ To Import Application Server in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/ImportApplicationServer/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/ImportApplicationServer/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the ImportApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/ImportApplicationServer/PipelineResult.png) + +In the **ImportApplicationServer** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/ImportApplicationServer/PipelineLog.png) + diff --git a/help/procedures/ImportApplicationServer/token.txt b/help/procedures/ImportApplicationServer/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/ImportApplicationServer/token.txt +++ b/help/procedures/ImportApplicationServer/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/ListClusterMembers/postface.md b/help/procedures/ListClusterMembers/postface.md index 5bd61d45..bfbb039c 100644 --- a/help/procedures/ListClusterMembers/postface.md +++ b/help/procedures/ListClusterMembers/postface.md @@ -3,15 +3,26 @@ To List Cluster Members in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/ListClusterMembers/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/ListClusterMembers/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the ListClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/ListClusterMembers/PipelineResult.png) + +In the **ListClusterMembers** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/ListClusterMembers/PipelineLog.png) + diff --git a/help/procedures/ListClusterMembers/token.txt b/help/procedures/ListClusterMembers/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/ListClusterMembers/token.txt +++ b/help/procedures/ListClusterMembers/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/MapSharedLibrary/postface.md b/help/procedures/MapSharedLibrary/postface.md index 324f5735..ddd6a33a 100644 --- a/help/procedures/MapSharedLibrary/postface.md +++ b/help/procedures/MapSharedLibrary/postface.md @@ -1,13 +1,21 @@ -

                              Map Shared Library to Application

                              -

                              To map shared library to application, do these steps:

                              -
                                -
                              1. Go to the MapSharedLibrary procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details:

                              - -

                              In the MapSharedLibrary step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Map Shared Library to Application + +To map shared library to application, do these steps: + +* Go to the MapSharedLibrary procedure. + +* Enter the following parameters: + +![image](images/MapSharedLibrary/EC-WebSphereMapSharedLibrary2.png) + + +After the job runs, you can view the results, including the following job details: + +![image](images/MapSharedLibrary/EC-WebSphereMapSharedLibrary3.png) + +In the **MapSharedLibrary** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/MapSharedLibrary/EC-WebSphereMapSharedLibrary4.png) diff --git a/help/procedures/ModifyApplicationClassLoader/postface.md b/help/procedures/ModifyApplicationClassLoader/postface.md index 2115d57f..65713e7c 100644 --- a/help/procedures/ModifyApplicationClassLoader/postface.md +++ b/help/procedures/ModifyApplicationClassLoader/postface.md @@ -1,13 +1,21 @@ -

                              Modify Application's ClassLoader

                              -

                              To modify Application's ClassLoader do the following steps:

                              -
                                -
                              1. Go to the ModifyApplicationClassLoader procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details:

                              - -

                              In the ModifyApplicationClassLoader step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Modify Application's ClassLoader + +To modify Application's ClassLoader do the following steps: + +* Go to the ModifyApplicationClassLoader procedure. + +* Enter the following parameters: + +![image](images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader2.png) + + +After the job runs, you can view the results, including the following job details: + +![image](images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader3.png) + +In the **ModifyApplicationClassLoader** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader4.png) diff --git a/help/procedures/PublishWSDL/postface.md b/help/procedures/PublishWSDL/postface.md index 620b2671..2d875396 100644 --- a/help/procedures/PublishWSDL/postface.md +++ b/help/procedures/PublishWSDL/postface.md @@ -1,6 +1,11 @@ -

                              Publish WSDL

                              -

                              To publish WSDL files, do these steps:

                              -
                                -
                              1. Go to the PublishWSDL procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              +### Publish WSDL + +To publish WSDL files, do these steps: + +* Go to the PublishWSDL procedure. + +* Enter the following parameters: + +![image](images/PublishWSDL/EC-WebSpherePublishWSDL2.png) + + diff --git a/help/procedures/RemoveClusterMembers/postface.md b/help/procedures/RemoveClusterMembers/postface.md index 861d3b10..12d79d82 100644 --- a/help/procedures/RemoveClusterMembers/postface.md +++ b/help/procedures/RemoveClusterMembers/postface.md @@ -3,15 +3,26 @@ To Remove Cluster Members in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/RemoveClusterMembers/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/RemoveClusterMembers/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the RemoveClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/RemoveClusterMembers/PipelineResult.png) + +In the **RemoveClusterMembers** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/RemoveClusterMembers/PipelineLog.png) + diff --git a/help/procedures/RemoveClusterMembers/token.txt b/help/procedures/RemoveClusterMembers/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/RemoveClusterMembers/token.txt +++ b/help/procedures/RemoveClusterMembers/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/RunCustomJob/postface.md b/help/procedures/RunCustomJob/postface.md index 26cad9ea..c57ab0b9 100644 --- a/help/procedures/RunCustomJob/postface.md +++ b/help/procedures/RunCustomJob/postface.md @@ -1,2 +1,3 @@ -

                              Running Custom Jobs

                              -

                              For a complete example, go to the Examples and Use Cases section.

                              \ No newline at end of file +### Running Custom Jobs + +For a complete example, go to the Examples and Use Cases section. \ No newline at end of file diff --git a/help/procedures/StartApp/postface.md b/help/procedures/StartApp/postface.md index 6ab36b53..1e029711 100644 --- a/help/procedures/StartApp/postface.md +++ b/help/procedures/StartApp/postface.md @@ -1,13 +1,23 @@ -

                              Starting Applications

                              -

                              To start an application, do these steps:

                              -
                                -
                              1. Go to the StartApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, - which show that application was started - successfully:

                              -

                              In the StartApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

                              \ No newline at end of file +### Starting Applications + +To start an application, do these steps: + +* Go to the StartApp procedure. + +* Enter the following parameters: + +![image](images/StartApp/startApp2.png) + + +After the job runs, you can view the results, including the following job details, +which show that application was started +successfully: + +![image](images/StartApp/startApp3.png) + +In the **StartApp** step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +![image](images/StartApp/startApp4.png) diff --git a/help/procedures/StartApplicationServers/postface.md b/help/procedures/StartApplicationServers/postface.md index ef980c5b..79572b45 100644 --- a/help/procedures/StartApplicationServers/postface.md +++ b/help/procedures/StartApplicationServers/postface.md @@ -3,15 +3,26 @@ To Start Application Servers in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StartApplicationServers/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StartApplicationServers/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StartApplicationServers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StartApplicationServers/PipelineResult.png) + +In the **StartApplicationServers** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StartApplicationServers/PipelineLog.png) + diff --git a/help/procedures/StartApplicationServers/token.txt b/help/procedures/StartApplicationServers/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StartApplicationServers/token.txt +++ b/help/procedures/StartApplicationServers/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StartCluster/postface.md b/help/procedures/StartCluster/postface.md index c8e1faef..d436f083 100644 --- a/help/procedures/StartCluster/postface.md +++ b/help/procedures/StartCluster/postface.md @@ -3,15 +3,26 @@ To Start Cluster in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StartCluster/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StartCluster/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StartCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StartCluster/PipelineResult.png) + +In the **StartCluster** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StartCluster/PipelineLog.png) + diff --git a/help/procedures/StartCluster/token.txt b/help/procedures/StartCluster/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StartCluster/token.txt +++ b/help/procedures/StartCluster/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StartDeploymentManager/postface.md b/help/procedures/StartDeploymentManager/postface.md index 281cba16..65b3d98f 100644 --- a/help/procedures/StartDeploymentManager/postface.md +++ b/help/procedures/StartDeploymentManager/postface.md @@ -3,15 +3,26 @@ To Start Deployment Manager in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StartDeploymentManager/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StartDeploymentManager/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StartDeploymentManager step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StartDeploymentManager/PipelineResult.png) + +In the **StartDeploymentManager** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StartDeploymentManager/PipelineLog.png) + diff --git a/help/procedures/StartDeploymentManager/token.txt b/help/procedures/StartDeploymentManager/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StartDeploymentManager/token.txt +++ b/help/procedures/StartDeploymentManager/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StartNode/postface.md b/help/procedures/StartNode/postface.md index 7b3e5b2f..7332494e 100644 --- a/help/procedures/StartNode/postface.md +++ b/help/procedures/StartNode/postface.md @@ -3,15 +3,26 @@ To Start Node in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StartNode/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StartNode/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StartNode step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StartNode/PipelineResult.png) + +In the **StartNode** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StartNode/PipelineLog.png) + diff --git a/help/procedures/StartNode/token.txt b/help/procedures/StartNode/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StartNode/token.txt +++ b/help/procedures/StartNode/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StopApp/postface.md b/help/procedures/StopApp/postface.md index 3a0b6505..c9195960 100644 --- a/help/procedures/StopApp/postface.md +++ b/help/procedures/StopApp/postface.md @@ -1,13 +1,23 @@ -

                              Stopping Applications

                              -

                              To stop an application, do these steps:

                              -
                                -
                              1. Go to the StopApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - the application was stoped - successfully:

                              -

                              In the StopApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

                              \ No newline at end of file +### Stopping Applications + +To stop an application, do these steps: + +* Go to the StopApp procedure. + +* Enter the following parameters: + +![image](images/StopApp/stopApp2.png) + + +After the job runs, you can view the results, including the following job details, which show that +the application was stoped +successfully: + +![image](images/StopApp/stopApp3.png) + +In the **StopApp** step, click the Log icon to +see the diagnostic information. The output is similar to the +following diagnostic +report. + +![image](images/StopApp/stopApp4.png) diff --git a/help/procedures/StopApplicationServers/postface.md b/help/procedures/StopApplicationServers/postface.md index a08d950c..188b1bb7 100644 --- a/help/procedures/StopApplicationServers/postface.md +++ b/help/procedures/StopApplicationServers/postface.md @@ -3,15 +3,26 @@ To Stop Application Servers in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StopApplicationServers/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StopApplicationServers/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StopApplicationServers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StopApplicationServers/PipelineResult.png) + +In the **StopApplicationServers** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StopApplicationServers/PipelineLog.png) + diff --git a/help/procedures/StopApplicationServers/token.txt b/help/procedures/StopApplicationServers/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StopApplicationServers/token.txt +++ b/help/procedures/StopApplicationServers/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StopCluster/postface.md b/help/procedures/StopCluster/postface.md index d13e279d..35f8dd11 100644 --- a/help/procedures/StopCluster/postface.md +++ b/help/procedures/StopCluster/postface.md @@ -3,15 +3,26 @@ To Stop Cluster in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StopCluster/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StopCluster/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StopCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StopCluster/PipelineResult.png) + +In the **StopCluster** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StopCluster/PipelineLog.png) + diff --git a/help/procedures/StopCluster/token.txt b/help/procedures/StopCluster/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StopCluster/token.txt +++ b/help/procedures/StopCluster/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StopDeploymentManager/postface.md b/help/procedures/StopDeploymentManager/postface.md index 180c40a4..7e25667a 100644 --- a/help/procedures/StopDeploymentManager/postface.md +++ b/help/procedures/StopDeploymentManager/postface.md @@ -3,15 +3,26 @@ To Stop Deployment Manager in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StopDeploymentManager/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StopDeploymentManager/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StopDeploymentManager step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StopDeploymentManager/PipelineResult.png) + +In the **StopDeploymentManager** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StopDeploymentManager/PipelineLog.png) + diff --git a/help/procedures/StopDeploymentManager/token.txt b/help/procedures/StopDeploymentManager/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StopDeploymentManager/token.txt +++ b/help/procedures/StopDeploymentManager/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/StopNode/postface.md b/help/procedures/StopNode/postface.md index f7abdee4..7293dd2d 100644 --- a/help/procedures/StopNode/postface.md +++ b/help/procedures/StopNode/postface.md @@ -3,15 +3,26 @@ To Stop Node in CloudBees CD interface, do these steps: - * Create Pipeline. - * Create task. - * In task definition choose Plugin and choose following parameters: -
                              - * Click on arrow. - * Enter the following parameters: -
                              +* Create Pipeline. + +* Create task. + +* In task definition choose Plugin and choose following parameters: + +![image](images/StopNode/PipelinePicker.png) + +* Click on arrow. + +* Enter the following parameters: + +![image](images/StopNode/PipelineConfig.png) + After the pipeline runs, you can view the results, including the following step details: -
                              -
                              In the StopNode step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -
                              + +![image](images/StopNode/PipelineResult.png) + +In the **StopNode** step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. + +![image](images/StopNode/PipelineLog.png) + diff --git a/help/procedures/StopNode/token.txt b/help/procedures/StopNode/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/StopNode/token.txt +++ b/help/procedures/StopNode/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/SyncNodes/token.txt b/help/procedures/SyncNodes/token.txt index 963cb475..9d036681 100644 --- a/help/procedures/SyncNodes/token.txt +++ b/help/procedures/SyncNodes/token.txt @@ -1 +1 @@ -(Applicable only for WebSphere Network Deployment installation.) +**(Applicable only for WebSphere Network Deployment installation.)** diff --git a/help/procedures/UndeployApp/postface.md b/help/procedures/UndeployApp/postface.md index 487a6c70..f03b1ad5 100644 --- a/help/procedures/UndeployApp/postface.md +++ b/help/procedures/UndeployApp/postface.md @@ -1,13 +1,22 @@ -

                              Undeploying Applications

                              -

                              To undeploy an application, do these steps:

                              -
                                -

                                Go to the UndeployApp procedure.

                                -

                                Enter the following parameters:

                                -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - the application was undeployed - successfully:

                              -

                              In the UndeployApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              \ No newline at end of file +### Undeploying Applications + +To undeploy an application, do these steps: + +Go to the UndeployApp procedure. +Enter the following parameters: + +![image](images/UndeployApp/undeployApp2.png) + + +After the job runs, you can view the results, including the following job details, which show that +the application was undeployed +successfully: + +![image](images/UndeployApp/undeployApp3.png) + +In the **UndeployApp** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/UndeployApp/undeployApp4.png) diff --git a/help/procedures/UpdateApp/postface.md b/help/procedures/UpdateApp/postface.md index 0261b191..3e01a326 100644 --- a/help/procedures/UpdateApp/postface.md +++ b/help/procedures/UpdateApp/postface.md @@ -1,14 +1,22 @@ -

                              Update Application

                              -

                              To update application , do these steps:

                              -
                                -
                              1. Go to the UpdateApp procedure.
                              2. -
                              3. Enter the following parameters:
                              4. -
                              -

                              After the job runs, you can view the results, including the following job details, which show that - WSDL files are published successfully:

                              - -

                              In the UpdateApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

                              - \ No newline at end of file +### Update Application + +To update application , do these steps: + +* Go to the UpdateApp procedure. + +* Enter the following parameters: + +![image](images/UpdateApp/EC-WebSphereUpdateApp2.png) + + +After the job runs, you can view the results, including the following job details, which show that +WSDL files are published successfully: + +![image](images/UpdateApp/EC-WebSphereUpdateApp3.png) + +In the **UpdateApp** step, click the Log icon +to see the diagnostic information. The output is similar to +the following diagnostic +report. + +![image](images/UpdateApp/EC-WebSphereUpdateApp4.png) diff --git a/htdocs/images/CheckApp/PipelineConfig.png b/htdocs/images/checkapp/pipelineconfig.png similarity index 100% rename from htdocs/images/CheckApp/PipelineConfig.png rename to htdocs/images/checkapp/pipelineconfig.png diff --git a/htdocs/images/CheckApp/PipelinePicker.png b/htdocs/images/checkapp/pipelinepicker.png similarity index 100% rename from htdocs/images/CheckApp/PipelinePicker.png rename to htdocs/images/checkapp/pipelinepicker.png diff --git a/htdocs/images/CheckApp/PipelineResult.png b/htdocs/images/checkapp/pipelineresult.png similarity index 100% rename from htdocs/images/CheckApp/PipelineResult.png rename to htdocs/images/checkapp/pipelineresult.png diff --git a/htdocs/images/CheckApp/ProcedureConfig.png b/htdocs/images/checkapp/procedureconfig.png similarity index 100% rename from htdocs/images/CheckApp/ProcedureConfig.png rename to htdocs/images/checkapp/procedureconfig.png diff --git a/htdocs/images/CheckApp/ProcedureLog.png b/htdocs/images/checkapp/procedurelog.png similarity index 100% rename from htdocs/images/CheckApp/ProcedureLog.png rename to htdocs/images/checkapp/procedurelog.png diff --git a/htdocs/images/CheckApp/ProcedureResult.png b/htdocs/images/checkapp/procedureresult.png similarity index 100% rename from htdocs/images/CheckApp/ProcedureResult.png rename to htdocs/images/checkapp/procedureresult.png diff --git a/htdocs/images/CheckNodeStatus/CheckNodeStatusParameters.png b/htdocs/images/checknodestatus/checknodestatusparameters.png similarity index 100% rename from htdocs/images/CheckNodeStatus/CheckNodeStatusParameters.png rename to htdocs/images/checknodestatus/checknodestatusparameters.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus1.png b/htdocs/images/checkpagestatus/checkpagestatus1.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus1.png rename to htdocs/images/checkpagestatus/checkpagestatus1.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus2.png b/htdocs/images/checkpagestatus/checkpagestatus2.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus2.png rename to htdocs/images/checkpagestatus/checkpagestatus2.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus3.png b/htdocs/images/checkpagestatus/checkpagestatus3.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus3.png rename to htdocs/images/checkpagestatus/checkpagestatus3.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus4.png b/htdocs/images/checkpagestatus/checkpagestatus4.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus4.png rename to htdocs/images/checkpagestatus/checkpagestatus4.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus5.png b/htdocs/images/checkpagestatus/checkpagestatus5.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus5.png rename to htdocs/images/checkpagestatus/checkpagestatus5.png diff --git a/htdocs/images/CheckPageStatus/checkPageStatus6.png b/htdocs/images/checkpagestatus/checkpagestatus6.png similarity index 100% rename from htdocs/images/CheckPageStatus/checkPageStatus6.png rename to htdocs/images/checkpagestatus/checkpagestatus6.png diff --git a/htdocs/images/CheckPageStatus/parametersToEnter.png b/htdocs/images/checkpagestatus/parameterstoenter.png similarity index 100% rename from htdocs/images/CheckPageStatus/parametersToEnter.png rename to htdocs/images/checkpagestatus/parameterstoenter.png diff --git a/htdocs/images/CheckPageStatus/parametersToEnterBlank.png b/htdocs/images/checkpagestatus/parameterstoenterblank.png similarity index 100% rename from htdocs/images/CheckPageStatus/parametersToEnterBlank.png rename to htdocs/images/checkpagestatus/parameterstoenterblank.png diff --git a/htdocs/images/CheckServerStatus/1.png b/htdocs/images/checkserverstatus/1.png similarity index 100% rename from htdocs/images/CheckServerStatus/1.png rename to htdocs/images/checkserverstatus/1.png diff --git a/htdocs/images/CheckServerStatus/11.png b/htdocs/images/checkserverstatus/11.png similarity index 100% rename from htdocs/images/CheckServerStatus/11.png rename to htdocs/images/checkserverstatus/11.png diff --git a/htdocs/images/CheckServerStatus/12.png b/htdocs/images/checkserverstatus/12.png similarity index 100% rename from htdocs/images/CheckServerStatus/12.png rename to htdocs/images/checkserverstatus/12.png diff --git a/htdocs/images/CheckServerStatus/13.png b/htdocs/images/checkserverstatus/13.png similarity index 100% rename from htdocs/images/CheckServerStatus/13.png rename to htdocs/images/checkserverstatus/13.png diff --git a/htdocs/images/CheckServerStatus/2.png b/htdocs/images/checkserverstatus/2.png similarity index 100% rename from htdocs/images/CheckServerStatus/2.png rename to htdocs/images/checkserverstatus/2.png diff --git a/htdocs/images/CheckServerStatus/22.png b/htdocs/images/checkserverstatus/22.png similarity index 100% rename from htdocs/images/CheckServerStatus/22.png rename to htdocs/images/checkserverstatus/22.png diff --git a/htdocs/images/CheckServerStatus/CSSparameters.png b/htdocs/images/checkserverstatus/cssparameters.png similarity index 100% rename from htdocs/images/CheckServerStatus/CSSparameters.png rename to htdocs/images/checkserverstatus/cssparameters.png diff --git a/htdocs/images/Cleanup/1.png b/htdocs/images/cleanup/1.png similarity index 100% rename from htdocs/images/Cleanup/1.png rename to htdocs/images/cleanup/1.png diff --git a/htdocs/images/Cleanup/2.png b/htdocs/images/cleanup/2.png similarity index 100% rename from htdocs/images/Cleanup/2.png rename to htdocs/images/cleanup/2.png diff --git a/htdocs/images/Clone/1.png b/htdocs/images/clone/1.png similarity index 100% rename from htdocs/images/Clone/1.png rename to htdocs/images/clone/1.png diff --git a/htdocs/images/Config/parameters.png b/htdocs/images/config/parameters.png similarity index 100% rename from htdocs/images/Config/parameters.png rename to htdocs/images/config/parameters.png diff --git a/htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer1.png b/htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer1.png similarity index 100% rename from htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer1.png rename to htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer1.png diff --git a/htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer2.png b/htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer2.png similarity index 100% rename from htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer2.png rename to htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer2.png diff --git a/htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer3.png b/htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer3.png similarity index 100% rename from htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer3.png rename to htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer3.png diff --git a/htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer4.png b/htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer4.png similarity index 100% rename from htdocs/images/ConfigEJBContainer/EC-WebSphereConfigEJBContainer4.png rename to htdocs/images/configejbcontainer/ec-websphereconfigejbcontainer4.png diff --git a/htdocs/images/ConfigureSession/EC-WebSphereConfigureSession2.png b/htdocs/images/configuresession/ec-websphereconfiguresession2.png similarity index 100% rename from htdocs/images/ConfigureSession/EC-WebSphereConfigureSession2.png rename to htdocs/images/configuresession/ec-websphereconfiguresession2.png diff --git a/htdocs/images/ConfigureSession/EC-WebSphereConfigureSession3.png b/htdocs/images/configuresession/ec-websphereconfiguresession3.png similarity index 100% rename from htdocs/images/ConfigureSession/EC-WebSphereConfigureSession3.png rename to htdocs/images/configuresession/ec-websphereconfiguresession3.png diff --git a/htdocs/images/ConfigureSession/EC-WebSphereConfigureSession4.png b/htdocs/images/configuresession/ec-websphereconfiguresession4.png similarity index 100% rename from htdocs/images/ConfigureSession/EC-WebSphereConfigureSession4.png rename to htdocs/images/configuresession/ec-websphereconfiguresession4.png diff --git a/htdocs/images/Create/1.png b/htdocs/images/create/1.png similarity index 100% rename from htdocs/images/Create/1.png rename to htdocs/images/create/1.png diff --git a/htdocs/images/Create/2.png b/htdocs/images/create/2.png similarity index 100% rename from htdocs/images/Create/2.png rename to htdocs/images/create/2.png diff --git a/htdocs/images/Create/3.png b/htdocs/images/create/3.png similarity index 100% rename from htdocs/images/Create/3.png rename to htdocs/images/create/3.png diff --git a/htdocs/images/Create/4.png b/htdocs/images/create/4.png similarity index 100% rename from htdocs/images/Create/4.png rename to htdocs/images/create/4.png diff --git a/htdocs/images/CreateApplicationServer/PipelineConfig.png b/htdocs/images/createapplicationserver/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateApplicationServer/PipelineConfig.png rename to htdocs/images/createapplicationserver/pipelineconfig.png diff --git a/htdocs/images/CreateApplicationServer/PipelineLog.png b/htdocs/images/createapplicationserver/pipelinelog.png similarity index 100% rename from htdocs/images/CreateApplicationServer/PipelineLog.png rename to htdocs/images/createapplicationserver/pipelinelog.png diff --git a/htdocs/images/CreateApplicationServer/PipelinePicker.png b/htdocs/images/createapplicationserver/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateApplicationServer/PipelinePicker.png rename to htdocs/images/createapplicationserver/pipelinepicker.png diff --git a/htdocs/images/CreateApplicationServer/PipelineResult.png b/htdocs/images/createapplicationserver/pipelineresult.png similarity index 100% rename from htdocs/images/CreateApplicationServer/PipelineResult.png rename to htdocs/images/createapplicationserver/pipelineresult.png diff --git a/htdocs/images/CreateApplicationServerTemplate/PipelineConfig.png b/htdocs/images/createapplicationservertemplate/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateApplicationServerTemplate/PipelineConfig.png rename to htdocs/images/createapplicationservertemplate/pipelineconfig.png diff --git a/htdocs/images/CreateApplicationServerTemplate/PipelineLog.png b/htdocs/images/createapplicationservertemplate/pipelinelog.png similarity index 100% rename from htdocs/images/CreateApplicationServerTemplate/PipelineLog.png rename to htdocs/images/createapplicationservertemplate/pipelinelog.png diff --git a/htdocs/images/CreateApplicationServerTemplate/PipelinePicker.png b/htdocs/images/createapplicationservertemplate/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateApplicationServerTemplate/PipelinePicker.png rename to htdocs/images/createapplicationservertemplate/pipelinepicker.png diff --git a/htdocs/images/CreateApplicationServerTemplate/PipelineResult.png b/htdocs/images/createapplicationservertemplate/pipelineresult.png similarity index 100% rename from htdocs/images/CreateApplicationServerTemplate/PipelineResult.png rename to htdocs/images/createapplicationservertemplate/pipelineresult.png diff --git a/htdocs/images/CreateCluster/EC-WebSphereCreateCluster1.png b/htdocs/images/createcluster/ec-webspherecreatecluster1.png similarity index 100% rename from htdocs/images/CreateCluster/EC-WebSphereCreateCluster1.png rename to htdocs/images/createcluster/ec-webspherecreatecluster1.png diff --git a/htdocs/images/CreateCluster/EC-WebSphereCreateCluster2.png b/htdocs/images/createcluster/ec-webspherecreatecluster2.png similarity index 100% rename from htdocs/images/CreateCluster/EC-WebSphereCreateCluster2.png rename to htdocs/images/createcluster/ec-webspherecreatecluster2.png diff --git a/htdocs/images/CreateCluster/EC-WebSphereCreateCluster3.png b/htdocs/images/createcluster/ec-webspherecreatecluster3.png similarity index 100% rename from htdocs/images/CreateCluster/EC-WebSphereCreateCluster3.png rename to htdocs/images/createcluster/ec-webspherecreatecluster3.png diff --git a/htdocs/images/CreateCluster/EC-WebSphereCreateCluster4.png b/htdocs/images/createcluster/ec-webspherecreatecluster4.png similarity index 100% rename from htdocs/images/CreateCluster/EC-WebSphereCreateCluster4.png rename to htdocs/images/createcluster/ec-webspherecreatecluster4.png diff --git a/htdocs/images/CreateCluster/PipelineConfig.png b/htdocs/images/createcluster/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateCluster/PipelineConfig.png rename to htdocs/images/createcluster/pipelineconfig.png diff --git a/htdocs/images/CreateCluster/PipelineLog.png b/htdocs/images/createcluster/pipelinelog.png similarity index 100% rename from htdocs/images/CreateCluster/PipelineLog.png rename to htdocs/images/createcluster/pipelinelog.png diff --git a/htdocs/images/CreateCluster/PipelinePicker.png b/htdocs/images/createcluster/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateCluster/PipelinePicker.png rename to htdocs/images/createcluster/pipelinepicker.png diff --git a/htdocs/images/CreateCluster/PipelineResult.png b/htdocs/images/createcluster/pipelineresult.png similarity index 100% rename from htdocs/images/CreateCluster/PipelineResult.png rename to htdocs/images/createcluster/pipelineresult.png diff --git a/htdocs/images/CreateClusterMembers/PipelineConfig.png b/htdocs/images/createclustermembers/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateClusterMembers/PipelineConfig.png rename to htdocs/images/createclustermembers/pipelineconfig.png diff --git a/htdocs/images/CreateClusterMembers/PipelineLog.png b/htdocs/images/createclustermembers/pipelinelog.png similarity index 100% rename from htdocs/images/CreateClusterMembers/PipelineLog.png rename to htdocs/images/createclustermembers/pipelinelog.png diff --git a/htdocs/images/CreateClusterMembers/PipelinePicker.png b/htdocs/images/createclustermembers/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateClusterMembers/PipelinePicker.png rename to htdocs/images/createclustermembers/pipelinepicker.png diff --git a/htdocs/images/CreateClusterMembers/PipelineResult.png b/htdocs/images/createclustermembers/pipelineresult.png similarity index 100% rename from htdocs/images/CreateClusterMembers/PipelineResult.png rename to htdocs/images/createclustermembers/pipelineresult.png diff --git a/htdocs/images/CreateConfiguration/1.png b/htdocs/images/createconfiguration/1.png similarity index 100% rename from htdocs/images/CreateConfiguration/1.png rename to htdocs/images/createconfiguration/1.png diff --git a/htdocs/images/CreateConfiguration/2.png b/htdocs/images/createconfiguration/2.png similarity index 100% rename from htdocs/images/CreateConfiguration/2.png rename to htdocs/images/createconfiguration/2.png diff --git a/htdocs/images/CreateConfiguration/22.png b/htdocs/images/createconfiguration/22.png similarity index 100% rename from htdocs/images/CreateConfiguration/22.png rename to htdocs/images/createconfiguration/22.png diff --git a/htdocs/images/CreateConfiguration/3.png b/htdocs/images/createconfiguration/3.png similarity index 100% rename from htdocs/images/CreateConfiguration/3.png rename to htdocs/images/createconfiguration/3.png diff --git a/htdocs/images/CreateConfiguration/33.png b/htdocs/images/createconfiguration/33.png similarity index 100% rename from htdocs/images/CreateConfiguration/33.png rename to htdocs/images/createconfiguration/33.png diff --git a/htdocs/images/CreateConfiguration/4.png b/htdocs/images/createconfiguration/4.png similarity index 100% rename from htdocs/images/CreateConfiguration/4.png rename to htdocs/images/createconfiguration/4.png diff --git a/htdocs/images/CreateConfiguration/44.png b/htdocs/images/createconfiguration/44.png similarity index 100% rename from htdocs/images/CreateConfiguration/44.png rename to htdocs/images/createconfiguration/44.png diff --git a/htdocs/images/CreateConfiguration/5.png b/htdocs/images/createconfiguration/5.png similarity index 100% rename from htdocs/images/CreateConfiguration/5.png rename to htdocs/images/createconfiguration/5.png diff --git a/htdocs/images/CreateConfiguration/55.png b/htdocs/images/createconfiguration/55.png similarity index 100% rename from htdocs/images/CreateConfiguration/55.png rename to htdocs/images/createconfiguration/55.png diff --git a/htdocs/images/CreateConfiguration/EditConfig.png b/htdocs/images/createconfiguration/editconfig.png similarity index 100% rename from htdocs/images/CreateConfiguration/EditConfig.png rename to htdocs/images/createconfiguration/editconfig.png diff --git a/htdocs/images/CreateConfiguration/NewConfig.png b/htdocs/images/createconfiguration/newconfig.png similarity index 100% rename from htdocs/images/CreateConfiguration/NewConfig.png rename to htdocs/images/createconfiguration/newconfig.png diff --git a/htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource1.png b/htdocs/images/createdatasource/ec-webspherecreatedatasource1.png similarity index 100% rename from htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource1.png rename to htdocs/images/createdatasource/ec-webspherecreatedatasource1.png diff --git a/htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource2.png b/htdocs/images/createdatasource/ec-webspherecreatedatasource2.png similarity index 100% rename from htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource2.png rename to htdocs/images/createdatasource/ec-webspherecreatedatasource2.png diff --git a/htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource3.png b/htdocs/images/createdatasource/ec-webspherecreatedatasource3.png similarity index 100% rename from htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource3.png rename to htdocs/images/createdatasource/ec-webspherecreatedatasource3.png diff --git a/htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource4.png b/htdocs/images/createdatasource/ec-webspherecreatedatasource4.png similarity index 100% rename from htdocs/images/CreateDatasource/EC-WebSphereCreateDatasource4.png rename to htdocs/images/createdatasource/ec-webspherecreatedatasource4.png diff --git a/htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider1.png b/htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider1.png similarity index 100% rename from htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider1.png rename to htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider1.png diff --git a/htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider2.png b/htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider2.png similarity index 100% rename from htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider2.png rename to htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider2.png diff --git a/htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider3.png b/htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider3.png similarity index 100% rename from htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider3.png rename to htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider3.png diff --git a/htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider4.png b/htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider4.png similarity index 100% rename from htdocs/images/CreateEndToEndMailProvider/EC-WebSphereCreateEndToEndMailProvider4.png rename to htdocs/images/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider4.png diff --git a/htdocs/images/CreateFirstClusterMember/PipelineConfig.png b/htdocs/images/createfirstclustermember/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateFirstClusterMember/PipelineConfig.png rename to htdocs/images/createfirstclustermember/pipelineconfig.png diff --git a/htdocs/images/CreateFirstClusterMember/PipelineLog.png b/htdocs/images/createfirstclustermember/pipelinelog.png similarity index 100% rename from htdocs/images/CreateFirstClusterMember/PipelineLog.png rename to htdocs/images/createfirstclustermember/pipelinelog.png diff --git a/htdocs/images/CreateFirstClusterMember/PipelinePicker.png b/htdocs/images/createfirstclustermember/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateFirstClusterMember/PipelinePicker.png rename to htdocs/images/createfirstclustermember/pipelinepicker.png diff --git a/htdocs/images/CreateFirstClusterMember/PipelineResult.png b/htdocs/images/createfirstclustermember/pipelineresult.png similarity index 100% rename from htdocs/images/CreateFirstClusterMember/PipelineResult.png rename to htdocs/images/createfirstclustermember/pipelineresult.png diff --git a/htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider1.png b/htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider1.png similarity index 100% rename from htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider1.png rename to htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider1.png diff --git a/htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider2.png b/htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider2.png similarity index 100% rename from htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider2.png rename to htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider2.png diff --git a/htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider3.png b/htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider3.png similarity index 100% rename from htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider3.png rename to htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider3.png diff --git a/htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider4.png b/htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider4.png similarity index 100% rename from htdocs/images/CreateJDBCProvider/EC-WebSphereCreateJDBCProvider4.png rename to htdocs/images/createjdbcprovider/ec-webspherecreatejdbcprovider4.png diff --git a/htdocs/images/CreateJMSProvider/EC-WebSphereCreateJMSProvider1.png b/htdocs/images/createjmsprovider/ec-webspherecreatejmsprovider1.png similarity index 100% rename from htdocs/images/CreateJMSProvider/EC-WebSphereCreateJMSProvider1.png rename to htdocs/images/createjmsprovider/ec-webspherecreatejmsprovider1.png diff --git a/htdocs/images/CreateJMSProvider/EC-WebSphereCreateJMSProvider2.png b/htdocs/images/createjmsprovider/ec-webspherecreatejmsprovider2.png similarity index 100% rename from htdocs/images/CreateJMSProvider/EC-WebSphereCreateJMSProvider2.png rename to htdocs/images/createjmsprovider/ec-webspherecreatejmsprovider2.png diff --git a/htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession1.png b/htdocs/images/createmailsession/ec-webspherecreatemailsession1.png similarity index 100% rename from htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession1.png rename to htdocs/images/createmailsession/ec-webspherecreatemailsession1.png diff --git a/htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession2.png b/htdocs/images/createmailsession/ec-webspherecreatemailsession2.png similarity index 100% rename from htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession2.png rename to htdocs/images/createmailsession/ec-webspherecreatemailsession2.png diff --git a/htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession3.png b/htdocs/images/createmailsession/ec-webspherecreatemailsession3.png similarity index 100% rename from htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession3.png rename to htdocs/images/createmailsession/ec-webspherecreatemailsession3.png diff --git a/htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession4.png b/htdocs/images/createmailsession/ec-webspherecreatemailsession4.png similarity index 100% rename from htdocs/images/CreateMailSession/EC-WebSphereCreateMailSession4.png rename to htdocs/images/createmailsession/ec-webspherecreatemailsession4.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/PipelineConfig.png b/htdocs/images/createorupdatejmsqueue/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/PipelineConfig.png rename to htdocs/images/createorupdatejmsqueue/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/PipelinePicker.png b/htdocs/images/createorupdatejmsqueue/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/PipelinePicker.png rename to htdocs/images/createorupdatejmsqueue/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/PipelineResult.png b/htdocs/images/createorupdatejmsqueue/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/PipelineResult.png rename to htdocs/images/createorupdatejmsqueue/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/ProcedureConfig.png b/htdocs/images/createorupdatejmsqueue/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/ProcedureConfig.png rename to htdocs/images/createorupdatejmsqueue/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/ProcedureLog.png b/htdocs/images/createorupdatejmsqueue/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/ProcedureLog.png rename to htdocs/images/createorupdatejmsqueue/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateJMSQueue/ProcedureResult.png b/htdocs/images/createorupdatejmsqueue/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSQueue/ProcedureResult.png rename to htdocs/images/createorupdatejmsqueue/procedureresult.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/PipelineConfig.png b/htdocs/images/createorupdatejmstopic/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/PipelineConfig.png rename to htdocs/images/createorupdatejmstopic/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/PipelinePicker.png b/htdocs/images/createorupdatejmstopic/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/PipelinePicker.png rename to htdocs/images/createorupdatejmstopic/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/PipelineResult.png b/htdocs/images/createorupdatejmstopic/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/PipelineResult.png rename to htdocs/images/createorupdatejmstopic/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/ProcedureConfig.png b/htdocs/images/createorupdatejmstopic/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/ProcedureConfig.png rename to htdocs/images/createorupdatejmstopic/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/ProcedureLog.png b/htdocs/images/createorupdatejmstopic/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/ProcedureLog.png rename to htdocs/images/createorupdatejmstopic/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateJMSTopic/ProcedureResult.png b/htdocs/images/createorupdatejmstopic/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateJMSTopic/ProcedureResult.png rename to htdocs/images/createorupdatejmstopic/procedureresult.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelineConfig.png b/htdocs/images/createorupdatesibjmsactivationspec/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelineConfig.png rename to htdocs/images/createorupdatesibjmsactivationspec/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelinePicker.png b/htdocs/images/createorupdatesibjmsactivationspec/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelinePicker.png rename to htdocs/images/createorupdatesibjmsactivationspec/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelineResult.png b/htdocs/images/createorupdatesibjmsactivationspec/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/PipelineResult.png rename to htdocs/images/createorupdatesibjmsactivationspec/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureConfig.png b/htdocs/images/createorupdatesibjmsactivationspec/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureConfig.png rename to htdocs/images/createorupdatesibjmsactivationspec/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureLog.png b/htdocs/images/createorupdatesibjmsactivationspec/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureLog.png rename to htdocs/images/createorupdatesibjmsactivationspec/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureResult.png b/htdocs/images/createorupdatesibjmsactivationspec/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSActivationSpec/ProcedureResult.png rename to htdocs/images/createorupdatesibjmsactivationspec/procedureresult.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelineConfig.png b/htdocs/images/createorupdatesibjmsconnectionfactory/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelineConfig.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelinePicker.png b/htdocs/images/createorupdatesibjmsconnectionfactory/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelinePicker.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelineResult.png b/htdocs/images/createorupdatesibjmsconnectionfactory/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/PipelineResult.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureConfig.png b/htdocs/images/createorupdatesibjmsconnectionfactory/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureConfig.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureLog.png b/htdocs/images/createorupdatesibjmsconnectionfactory/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureLog.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureResult.png b/htdocs/images/createorupdatesibjmsconnectionfactory/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateSIBJMSConnectionFactory/ProcedureResult.png rename to htdocs/images/createorupdatesibjmsconnectionfactory/procedureresult.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelineConfig.png b/htdocs/images/createorupdatewmqjmsactivationspec/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelineConfig.png rename to htdocs/images/createorupdatewmqjmsactivationspec/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelinePicker.png b/htdocs/images/createorupdatewmqjmsactivationspec/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelinePicker.png rename to htdocs/images/createorupdatewmqjmsactivationspec/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelineResult.png b/htdocs/images/createorupdatewmqjmsactivationspec/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/PipelineResult.png rename to htdocs/images/createorupdatewmqjmsactivationspec/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureConfig.png b/htdocs/images/createorupdatewmqjmsactivationspec/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureConfig.png rename to htdocs/images/createorupdatewmqjmsactivationspec/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureLog.png b/htdocs/images/createorupdatewmqjmsactivationspec/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureLog.png rename to htdocs/images/createorupdatewmqjmsactivationspec/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureResult.png b/htdocs/images/createorupdatewmqjmsactivationspec/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSActivationSpec/ProcedureResult.png rename to htdocs/images/createorupdatewmqjmsactivationspec/procedureresult.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelineConfig.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/pipelineconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelineConfig.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/pipelineconfig.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelinePicker.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/pipelinepicker.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelinePicker.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/pipelinepicker.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelineResult.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/pipelineresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/PipelineResult.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/pipelineresult.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureConfig.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/procedureconfig.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureConfig.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/procedureconfig.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureLog.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/procedurelog.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureLog.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/procedurelog.png diff --git a/htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureResult.png b/htdocs/images/createorupdatewmqjmsconnectionfactory/procedureresult.png similarity index 100% rename from htdocs/images/CreateOrUpdateWMQJMSConnectionFactory/ProcedureResult.png rename to htdocs/images/createorupdatewmqjmsconnectionfactory/procedureresult.png diff --git a/htdocs/images/CreateResourceFromVM/1.png b/htdocs/images/createresourcefromvm/1.png similarity index 100% rename from htdocs/images/CreateResourceFromVM/1.png rename to htdocs/images/createresourcefromvm/1.png diff --git a/htdocs/images/CreateResourceFromVM/2.png b/htdocs/images/createresourcefromvm/2.png similarity index 100% rename from htdocs/images/CreateResourceFromVM/2.png rename to htdocs/images/createresourcefromvm/2.png diff --git a/htdocs/images/CreateResourceFromVM/3.png b/htdocs/images/createresourcefromvm/3.png similarity index 100% rename from htdocs/images/CreateResourceFromVM/3.png rename to htdocs/images/createresourcefromvm/3.png diff --git a/htdocs/images/DeleteApplicationServer/PipelineConfig.png b/htdocs/images/deleteapplicationserver/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteApplicationServer/PipelineConfig.png rename to htdocs/images/deleteapplicationserver/pipelineconfig.png diff --git a/htdocs/images/DeleteApplicationServer/PipelineLog.png b/htdocs/images/deleteapplicationserver/pipelinelog.png similarity index 100% rename from htdocs/images/DeleteApplicationServer/PipelineLog.png rename to htdocs/images/deleteapplicationserver/pipelinelog.png diff --git a/htdocs/images/DeleteApplicationServer/PipelinePicker.png b/htdocs/images/deleteapplicationserver/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteApplicationServer/PipelinePicker.png rename to htdocs/images/deleteapplicationserver/pipelinepicker.png diff --git a/htdocs/images/DeleteApplicationServer/PipelineResult.png b/htdocs/images/deleteapplicationserver/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteApplicationServer/PipelineResult.png rename to htdocs/images/deleteapplicationserver/pipelineresult.png diff --git a/htdocs/images/DeleteApplicationServerTemplate/PipelineConfig.png b/htdocs/images/deleteapplicationservertemplate/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteApplicationServerTemplate/PipelineConfig.png rename to htdocs/images/deleteapplicationservertemplate/pipelineconfig.png diff --git a/htdocs/images/DeleteApplicationServerTemplate/PipelineLog.png b/htdocs/images/deleteapplicationservertemplate/pipelinelog.png similarity index 100% rename from htdocs/images/DeleteApplicationServerTemplate/PipelineLog.png rename to htdocs/images/deleteapplicationservertemplate/pipelinelog.png diff --git a/htdocs/images/DeleteApplicationServerTemplate/PipelinePicker.png b/htdocs/images/deleteapplicationservertemplate/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteApplicationServerTemplate/PipelinePicker.png rename to htdocs/images/deleteapplicationservertemplate/pipelinepicker.png diff --git a/htdocs/images/DeleteApplicationServerTemplate/PipelineResult.png b/htdocs/images/deleteapplicationservertemplate/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteApplicationServerTemplate/PipelineResult.png rename to htdocs/images/deleteapplicationservertemplate/pipelineresult.png diff --git a/htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster1.png b/htdocs/images/deletecluster/ec-webspheredeletecluster1.png similarity index 100% rename from htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster1.png rename to htdocs/images/deletecluster/ec-webspheredeletecluster1.png diff --git a/htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster2.png b/htdocs/images/deletecluster/ec-webspheredeletecluster2.png similarity index 100% rename from htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster2.png rename to htdocs/images/deletecluster/ec-webspheredeletecluster2.png diff --git a/htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster3.png b/htdocs/images/deletecluster/ec-webspheredeletecluster3.png similarity index 100% rename from htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster3.png rename to htdocs/images/deletecluster/ec-webspheredeletecluster3.png diff --git a/htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster4.png b/htdocs/images/deletecluster/ec-webspheredeletecluster4.png similarity index 100% rename from htdocs/images/DeleteCluster/EC-WebSphereDeleteCluster4.png rename to htdocs/images/deletecluster/ec-webspheredeletecluster4.png diff --git a/htdocs/images/DeleteCluster/PipelineConfig.png b/htdocs/images/deletecluster/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteCluster/PipelineConfig.png rename to htdocs/images/deletecluster/pipelineconfig.png diff --git a/htdocs/images/DeleteCluster/PipelineLog.png b/htdocs/images/deletecluster/pipelinelog.png similarity index 100% rename from htdocs/images/DeleteCluster/PipelineLog.png rename to htdocs/images/deletecluster/pipelinelog.png diff --git a/htdocs/images/DeleteCluster/PipelinePicker.png b/htdocs/images/deletecluster/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteCluster/PipelinePicker.png rename to htdocs/images/deletecluster/pipelinepicker.png diff --git a/htdocs/images/DeleteCluster/PipelineResult.png b/htdocs/images/deletecluster/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteCluster/PipelineResult.png rename to htdocs/images/deletecluster/pipelineresult.png diff --git a/htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource1.png b/htdocs/images/deletedatasource/ec-webspheredeletedatasource1.png similarity index 100% rename from htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource1.png rename to htdocs/images/deletedatasource/ec-webspheredeletedatasource1.png diff --git a/htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource2.png b/htdocs/images/deletedatasource/ec-webspheredeletedatasource2.png similarity index 100% rename from htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource2.png rename to htdocs/images/deletedatasource/ec-webspheredeletedatasource2.png diff --git a/htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource3.png b/htdocs/images/deletedatasource/ec-webspheredeletedatasource3.png similarity index 100% rename from htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource3.png rename to htdocs/images/deletedatasource/ec-webspheredeletedatasource3.png diff --git a/htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource4.png b/htdocs/images/deletedatasource/ec-webspheredeletedatasource4.png similarity index 100% rename from htdocs/images/DeleteDatasource/EC-WebSphereDeleteDatasource4.png rename to htdocs/images/deletedatasource/ec-webspheredeletedatasource4.png diff --git a/htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider1.png b/htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider1.png similarity index 100% rename from htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider1.png rename to htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider1.png diff --git a/htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider2.png b/htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider2.png similarity index 100% rename from htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider2.png rename to htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider2.png diff --git a/htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider3.png b/htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider3.png similarity index 100% rename from htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider3.png rename to htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider3.png diff --git a/htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider4.png b/htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider4.png similarity index 100% rename from htdocs/images/DeleteJDBCProvider/EC-WebSphereDeleteJDBCProvider4.png rename to htdocs/images/deletejdbcprovider/ec-webspheredeletejdbcprovider4.png diff --git a/htdocs/images/DeleteJMSActivationSpec/PipelineConfig.png b/htdocs/images/deletejmsactivationspec/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/PipelineConfig.png rename to htdocs/images/deletejmsactivationspec/pipelineconfig.png diff --git a/htdocs/images/DeleteJMSActivationSpec/PipelineLog.png b/htdocs/images/deletejmsactivationspec/pipelinelog.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/PipelineLog.png rename to htdocs/images/deletejmsactivationspec/pipelinelog.png diff --git a/htdocs/images/DeleteJMSActivationSpec/PipelinePicker.png b/htdocs/images/deletejmsactivationspec/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/PipelinePicker.png rename to htdocs/images/deletejmsactivationspec/pipelinepicker.png diff --git a/htdocs/images/DeleteJMSActivationSpec/PipelineResult.png b/htdocs/images/deletejmsactivationspec/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/PipelineResult.png rename to htdocs/images/deletejmsactivationspec/pipelineresult.png diff --git a/htdocs/images/DeleteJMSActivationSpec/ProcedureConfig.png b/htdocs/images/deletejmsactivationspec/procedureconfig.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/ProcedureConfig.png rename to htdocs/images/deletejmsactivationspec/procedureconfig.png diff --git a/htdocs/images/DeleteJMSActivationSpec/ProcedureLog.png b/htdocs/images/deletejmsactivationspec/procedurelog.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/ProcedureLog.png rename to htdocs/images/deletejmsactivationspec/procedurelog.png diff --git a/htdocs/images/DeleteJMSActivationSpec/ProcedureResult.png b/htdocs/images/deletejmsactivationspec/procedureresult.png similarity index 100% rename from htdocs/images/DeleteJMSActivationSpec/ProcedureResult.png rename to htdocs/images/deletejmsactivationspec/procedureresult.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/PipelineConfig.png b/htdocs/images/deletejmsconnectionfactory/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/PipelineConfig.png rename to htdocs/images/deletejmsconnectionfactory/pipelineconfig.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/PipelinePicker.png b/htdocs/images/deletejmsconnectionfactory/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/PipelinePicker.png rename to htdocs/images/deletejmsconnectionfactory/pipelinepicker.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/PipelineResult.png b/htdocs/images/deletejmsconnectionfactory/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/PipelineResult.png rename to htdocs/images/deletejmsconnectionfactory/pipelineresult.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/ProcedureConfig.png b/htdocs/images/deletejmsconnectionfactory/procedureconfig.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/ProcedureConfig.png rename to htdocs/images/deletejmsconnectionfactory/procedureconfig.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/ProcedureLog.png b/htdocs/images/deletejmsconnectionfactory/procedurelog.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/ProcedureLog.png rename to htdocs/images/deletejmsconnectionfactory/procedurelog.png diff --git a/htdocs/images/DeleteJMSConnectionFactory/ProcedureResult.png b/htdocs/images/deletejmsconnectionfactory/procedureresult.png similarity index 100% rename from htdocs/images/DeleteJMSConnectionFactory/ProcedureResult.png rename to htdocs/images/deletejmsconnectionfactory/procedureresult.png diff --git a/htdocs/images/DeleteJMSProvider/PipelineConfig.png b/htdocs/images/deletejmsprovider/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/PipelineConfig.png rename to htdocs/images/deletejmsprovider/pipelineconfig.png diff --git a/htdocs/images/DeleteJMSProvider/PipelinePicker.png b/htdocs/images/deletejmsprovider/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/PipelinePicker.png rename to htdocs/images/deletejmsprovider/pipelinepicker.png diff --git a/htdocs/images/DeleteJMSProvider/PipelineResult.png b/htdocs/images/deletejmsprovider/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/PipelineResult.png rename to htdocs/images/deletejmsprovider/pipelineresult.png diff --git a/htdocs/images/DeleteJMSProvider/ProcedureConfig.png b/htdocs/images/deletejmsprovider/procedureconfig.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/ProcedureConfig.png rename to htdocs/images/deletejmsprovider/procedureconfig.png diff --git a/htdocs/images/DeleteJMSProvider/ProcedureLog.png b/htdocs/images/deletejmsprovider/procedurelog.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/ProcedureLog.png rename to htdocs/images/deletejmsprovider/procedurelog.png diff --git a/htdocs/images/DeleteJMSProvider/ProcedureResult.png b/htdocs/images/deletejmsprovider/procedureresult.png similarity index 100% rename from htdocs/images/DeleteJMSProvider/ProcedureResult.png rename to htdocs/images/deletejmsprovider/procedureresult.png diff --git a/htdocs/images/DeleteJMSQueue/PipelineConfig.png b/htdocs/images/deletejmsqueue/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/PipelineConfig.png rename to htdocs/images/deletejmsqueue/pipelineconfig.png diff --git a/htdocs/images/DeleteJMSQueue/PipelinePicker.png b/htdocs/images/deletejmsqueue/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/PipelinePicker.png rename to htdocs/images/deletejmsqueue/pipelinepicker.png diff --git a/htdocs/images/DeleteJMSQueue/PipelineResult.png b/htdocs/images/deletejmsqueue/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/PipelineResult.png rename to htdocs/images/deletejmsqueue/pipelineresult.png diff --git a/htdocs/images/DeleteJMSQueue/ProcedureConfig.png b/htdocs/images/deletejmsqueue/procedureconfig.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/ProcedureConfig.png rename to htdocs/images/deletejmsqueue/procedureconfig.png diff --git a/htdocs/images/DeleteJMSQueue/ProcedureLog.png b/htdocs/images/deletejmsqueue/procedurelog.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/ProcedureLog.png rename to htdocs/images/deletejmsqueue/procedurelog.png diff --git a/htdocs/images/DeleteJMSQueue/ProcedureResult.png b/htdocs/images/deletejmsqueue/procedureresult.png similarity index 100% rename from htdocs/images/DeleteJMSQueue/ProcedureResult.png rename to htdocs/images/deletejmsqueue/procedureresult.png diff --git a/htdocs/images/DeleteJMSTopic/PipelineConfig.png b/htdocs/images/deletejmstopic/pipelineconfig.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/PipelineConfig.png rename to htdocs/images/deletejmstopic/pipelineconfig.png diff --git a/htdocs/images/DeleteJMSTopic/PipelinePicker.png b/htdocs/images/deletejmstopic/pipelinepicker.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/PipelinePicker.png rename to htdocs/images/deletejmstopic/pipelinepicker.png diff --git a/htdocs/images/DeleteJMSTopic/PipelineResult.png b/htdocs/images/deletejmstopic/pipelineresult.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/PipelineResult.png rename to htdocs/images/deletejmstopic/pipelineresult.png diff --git a/htdocs/images/DeleteJMSTopic/ProcedureConfig.png b/htdocs/images/deletejmstopic/procedureconfig.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/ProcedureConfig.png rename to htdocs/images/deletejmstopic/procedureconfig.png diff --git a/htdocs/images/DeleteJMSTopic/ProcedureLog.png b/htdocs/images/deletejmstopic/procedurelog.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/ProcedureLog.png rename to htdocs/images/deletejmstopic/procedurelog.png diff --git a/htdocs/images/DeleteJMSTopic/ProcedureResult.png b/htdocs/images/deletejmstopic/procedureresult.png similarity index 100% rename from htdocs/images/DeleteJMSTopic/ProcedureResult.png rename to htdocs/images/deletejmstopic/procedureresult.png diff --git a/htdocs/images/DeployApp/1.png b/htdocs/images/deployapp/1.png similarity index 100% rename from htdocs/images/DeployApp/1.png rename to htdocs/images/deployapp/1.png diff --git a/htdocs/images/DeployApp/deployApp1.png b/htdocs/images/deployapp/deployapp1.png similarity index 100% rename from htdocs/images/DeployApp/deployApp1.png rename to htdocs/images/deployapp/deployapp1.png diff --git a/htdocs/images/DeployApp/deployApp2.png b/htdocs/images/deployapp/deployapp2.png similarity index 100% rename from htdocs/images/DeployApp/deployApp2.png rename to htdocs/images/deployapp/deployapp2.png diff --git a/htdocs/images/DeployApp/deployApp3.png b/htdocs/images/deployapp/deployapp3.png similarity index 100% rename from htdocs/images/DeployApp/deployApp3.png rename to htdocs/images/deployapp/deployapp3.png diff --git a/htdocs/images/DeployApp/deployApp4.png b/htdocs/images/deployapp/deployapp4.png similarity index 100% rename from htdocs/images/DeployApp/deployApp4.png rename to htdocs/images/deployapp/deployapp4.png diff --git a/htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp1.png b/htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp1.png similarity index 100% rename from htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp1.png rename to htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp1.png diff --git a/htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp2.png b/htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp2.png similarity index 100% rename from htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp2.png rename to htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp2.png diff --git a/htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp3.png b/htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp3.png similarity index 100% rename from htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp3.png rename to htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp3.png diff --git a/htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp4.png b/htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp4.png similarity index 100% rename from htdocs/images/DeployEnterpriseApp/EC-WebSphereDeployEnterpriseApp4.png rename to htdocs/images/deployenterpriseapp/ec-webspheredeployenterpriseapp4.png diff --git a/htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi1.png b/htdocs/images/deployosgi/ec-webspheredeployosgi1.png similarity index 100% rename from htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi1.png rename to htdocs/images/deployosgi/ec-webspheredeployosgi1.png diff --git a/htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi2.png b/htdocs/images/deployosgi/ec-webspheredeployosgi2.png similarity index 100% rename from htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi2.png rename to htdocs/images/deployosgi/ec-webspheredeployosgi2.png diff --git a/htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi3.png b/htdocs/images/deployosgi/ec-webspheredeployosgi3.png similarity index 100% rename from htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi3.png rename to htdocs/images/deployosgi/ec-webspheredeployosgi3.png diff --git a/htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi4.png b/htdocs/images/deployosgi/ec-webspheredeployosgi4.png similarity index 100% rename from htdocs/images/DeployOSGi/EC-WebSphereDeployOSGi4.png rename to htdocs/images/deployosgi/ec-webspheredeployosgi4.png diff --git a/htdocs/images/Export/1.png b/htdocs/images/export/1.png similarity index 100% rename from htdocs/images/Export/1.png rename to htdocs/images/export/1.png diff --git a/htdocs/images/Export/2.png b/htdocs/images/export/2.png similarity index 100% rename from htdocs/images/Export/2.png rename to htdocs/images/export/2.png diff --git a/htdocs/images/ExportApplicationServer/PipelineConfig.png b/htdocs/images/exportapplicationserver/pipelineconfig.png similarity index 100% rename from htdocs/images/ExportApplicationServer/PipelineConfig.png rename to htdocs/images/exportapplicationserver/pipelineconfig.png diff --git a/htdocs/images/ExportApplicationServer/PipelineLog.png b/htdocs/images/exportapplicationserver/pipelinelog.png similarity index 100% rename from htdocs/images/ExportApplicationServer/PipelineLog.png rename to htdocs/images/exportapplicationserver/pipelinelog.png diff --git a/htdocs/images/ExportApplicationServer/PipelinePicker.png b/htdocs/images/exportapplicationserver/pipelinepicker.png similarity index 100% rename from htdocs/images/ExportApplicationServer/PipelinePicker.png rename to htdocs/images/exportapplicationserver/pipelinepicker.png diff --git a/htdocs/images/ExportApplicationServer/PipelineResult.png b/htdocs/images/exportapplicationserver/pipelineresult.png similarity index 100% rename from htdocs/images/ExportApplicationServer/PipelineResult.png rename to htdocs/images/exportapplicationserver/pipelineresult.png diff --git a/htdocs/images/GetVMConfiguration/1.png b/htdocs/images/getvmconfiguration/1.png similarity index 100% rename from htdocs/images/GetVMConfiguration/1.png rename to htdocs/images/getvmconfiguration/1.png diff --git a/htdocs/images/GetVMConfiguration/2.png b/htdocs/images/getvmconfiguration/2.png similarity index 100% rename from htdocs/images/GetVMConfiguration/2.png rename to htdocs/images/getvmconfiguration/2.png diff --git a/htdocs/images/GetVMConfiguration/3.png b/htdocs/images/getvmconfiguration/3.png similarity index 100% rename from htdocs/images/GetVMConfiguration/3.png rename to htdocs/images/getvmconfiguration/3.png diff --git a/htdocs/images/Import/1.png b/htdocs/images/import/1.png similarity index 100% rename from htdocs/images/Import/1.png rename to htdocs/images/import/1.png diff --git a/htdocs/images/Import/2.png b/htdocs/images/import/2.png similarity index 100% rename from htdocs/images/Import/2.png rename to htdocs/images/import/2.png diff --git a/htdocs/images/ImportApplicationServer/PipelineConfig.png b/htdocs/images/importapplicationserver/pipelineconfig.png similarity index 100% rename from htdocs/images/ImportApplicationServer/PipelineConfig.png rename to htdocs/images/importapplicationserver/pipelineconfig.png diff --git a/htdocs/images/ImportApplicationServer/PipelineLog.png b/htdocs/images/importapplicationserver/pipelinelog.png similarity index 100% rename from htdocs/images/ImportApplicationServer/PipelineLog.png rename to htdocs/images/importapplicationserver/pipelinelog.png diff --git a/htdocs/images/ImportApplicationServer/PipelinePicker.png b/htdocs/images/importapplicationserver/pipelinepicker.png similarity index 100% rename from htdocs/images/ImportApplicationServer/PipelinePicker.png rename to htdocs/images/importapplicationserver/pipelinepicker.png diff --git a/htdocs/images/ImportApplicationServer/PipelineResult.png b/htdocs/images/importapplicationserver/pipelineresult.png similarity index 100% rename from htdocs/images/ImportApplicationServer/PipelineResult.png rename to htdocs/images/importapplicationserver/pipelineresult.png diff --git a/htdocs/images/ListClusterMembers/PipelineConfig.png b/htdocs/images/listclustermembers/pipelineconfig.png similarity index 100% rename from htdocs/images/ListClusterMembers/PipelineConfig.png rename to htdocs/images/listclustermembers/pipelineconfig.png diff --git a/htdocs/images/ListClusterMembers/PipelineLog.png b/htdocs/images/listclustermembers/pipelinelog.png similarity index 100% rename from htdocs/images/ListClusterMembers/PipelineLog.png rename to htdocs/images/listclustermembers/pipelinelog.png diff --git a/htdocs/images/ListClusterMembers/PipelinePicker.png b/htdocs/images/listclustermembers/pipelinepicker.png similarity index 100% rename from htdocs/images/ListClusterMembers/PipelinePicker.png rename to htdocs/images/listclustermembers/pipelinepicker.png diff --git a/htdocs/images/ListClusterMembers/PipelineResult.png b/htdocs/images/listclustermembers/pipelineresult.png similarity index 100% rename from htdocs/images/ListClusterMembers/PipelineResult.png rename to htdocs/images/listclustermembers/pipelineresult.png diff --git a/htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary2.png b/htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary2.png similarity index 100% rename from htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary2.png rename to htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary2.png diff --git a/htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary3.png b/htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary3.png similarity index 100% rename from htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary3.png rename to htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary3.png diff --git a/htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary4.png b/htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary4.png similarity index 100% rename from htdocs/images/MapSharedLibrary/EC-WebSphereMapSharedLibrary4.png rename to htdocs/images/mapsharedlibrary/ec-webspheremapsharedlibrary4.png diff --git a/htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader2.png b/htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader2.png similarity index 100% rename from htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader2.png rename to htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader2.png diff --git a/htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader3.png b/htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader3.png similarity index 100% rename from htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader3.png rename to htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader3.png diff --git a/htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader4.png b/htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader4.png similarity index 100% rename from htdocs/images/ModifyApplicationClassLoader/EC-WebSphereModifyApplicationClassLoader4.png rename to htdocs/images/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader4.png diff --git a/htdocs/images/PowerOff/1.png b/htdocs/images/poweroff/1.png similarity index 100% rename from htdocs/images/PowerOff/1.png rename to htdocs/images/poweroff/1.png diff --git a/htdocs/images/PowerOff/2.png b/htdocs/images/poweroff/2.png similarity index 100% rename from htdocs/images/PowerOff/2.png rename to htdocs/images/poweroff/2.png diff --git a/htdocs/images/PowerOn/1.png b/htdocs/images/poweron/1.png similarity index 100% rename from htdocs/images/PowerOn/1.png rename to htdocs/images/poweron/1.png diff --git a/htdocs/images/PowerOn/2.png b/htdocs/images/poweron/2.png similarity index 100% rename from htdocs/images/PowerOn/2.png rename to htdocs/images/poweron/2.png diff --git a/htdocs/images/PublishWSDL/EC-WebSpherePublishWSDL1.png b/htdocs/images/publishwsdl/ec-webspherepublishwsdl1.png similarity index 100% rename from htdocs/images/PublishWSDL/EC-WebSpherePublishWSDL1.png rename to htdocs/images/publishwsdl/ec-webspherepublishwsdl1.png diff --git a/htdocs/images/PublishWSDL/EC-WebSpherePublishWSDL2.png b/htdocs/images/publishwsdl/ec-webspherepublishwsdl2.png similarity index 100% rename from htdocs/images/PublishWSDL/EC-WebSpherePublishWSDL2.png rename to htdocs/images/publishwsdl/ec-webspherepublishwsdl2.png diff --git a/htdocs/images/RegisterVM/1.png b/htdocs/images/registervm/1.png similarity index 100% rename from htdocs/images/RegisterVM/1.png rename to htdocs/images/registervm/1.png diff --git a/htdocs/images/RegisterVM/2.png b/htdocs/images/registervm/2.png similarity index 100% rename from htdocs/images/RegisterVM/2.png rename to htdocs/images/registervm/2.png diff --git a/htdocs/images/Relocate/1.png b/htdocs/images/relocate/1.png similarity index 100% rename from htdocs/images/Relocate/1.png rename to htdocs/images/relocate/1.png diff --git a/htdocs/images/RemoveClusterMembers/PipelineConfig.png b/htdocs/images/removeclustermembers/pipelineconfig.png similarity index 100% rename from htdocs/images/RemoveClusterMembers/PipelineConfig.png rename to htdocs/images/removeclustermembers/pipelineconfig.png diff --git a/htdocs/images/RemoveClusterMembers/PipelineLog.png b/htdocs/images/removeclustermembers/pipelinelog.png similarity index 100% rename from htdocs/images/RemoveClusterMembers/PipelineLog.png rename to htdocs/images/removeclustermembers/pipelinelog.png diff --git a/htdocs/images/RemoveClusterMembers/PipelinePicker.png b/htdocs/images/removeclustermembers/pipelinepicker.png similarity index 100% rename from htdocs/images/RemoveClusterMembers/PipelinePicker.png rename to htdocs/images/removeclustermembers/pipelinepicker.png diff --git a/htdocs/images/RemoveClusterMembers/PipelineResult.png b/htdocs/images/removeclustermembers/pipelineresult.png similarity index 100% rename from htdocs/images/RemoveClusterMembers/PipelineResult.png rename to htdocs/images/removeclustermembers/pipelineresult.png diff --git a/htdocs/images/Revert/1.png b/htdocs/images/revert/1.png similarity index 100% rename from htdocs/images/Revert/1.png rename to htdocs/images/revert/1.png diff --git a/htdocs/images/Revert/2.png b/htdocs/images/revert/2.png similarity index 100% rename from htdocs/images/Revert/2.png rename to htdocs/images/revert/2.png diff --git a/htdocs/images/RunCustomJob/1.png b/htdocs/images/runcustomjob/1.png similarity index 100% rename from htdocs/images/RunCustomJob/1.png rename to htdocs/images/runcustomjob/1.png diff --git a/htdocs/images/RunCustomJob/11.png b/htdocs/images/runcustomjob/11.png similarity index 100% rename from htdocs/images/RunCustomJob/11.png rename to htdocs/images/runcustomjob/11.png diff --git a/htdocs/images/RunCustomJob/2.png b/htdocs/images/runcustomjob/2.png similarity index 100% rename from htdocs/images/RunCustomJob/2.png rename to htdocs/images/runcustomjob/2.png diff --git a/htdocs/images/RunCustomJob/22.png b/htdocs/images/runcustomjob/22.png similarity index 100% rename from htdocs/images/RunCustomJob/22.png rename to htdocs/images/runcustomjob/22.png diff --git a/htdocs/images/RunCustomJob/3.png b/htdocs/images/runcustomjob/3.png similarity index 100% rename from htdocs/images/RunCustomJob/3.png rename to htdocs/images/runcustomjob/3.png diff --git a/htdocs/images/RunCustomJob/runCustomJob1.png b/htdocs/images/runcustomjob/runcustomjob1.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob1.png rename to htdocs/images/runcustomjob/runcustomjob1.png diff --git a/htdocs/images/RunCustomJob/runCustomJob2.png b/htdocs/images/runcustomjob/runcustomjob2.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob2.png rename to htdocs/images/runcustomjob/runcustomjob2.png diff --git a/htdocs/images/RunCustomJob/runCustomJob3.png b/htdocs/images/runcustomjob/runcustomjob3.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob3.png rename to htdocs/images/runcustomjob/runcustomjob3.png diff --git a/htdocs/images/RunCustomJob/runCustomJob4.png b/htdocs/images/runcustomjob/runcustomjob4.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob4.png rename to htdocs/images/runcustomjob/runcustomjob4.png diff --git a/htdocs/images/RunCustomJob/runCustomJob5.png b/htdocs/images/runcustomjob/runcustomjob5.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob5.png rename to htdocs/images/runcustomjob/runcustomjob5.png diff --git a/htdocs/images/RunCustomJob/runCustomJob6.png b/htdocs/images/runcustomjob/runcustomjob6.png similarity index 100% rename from htdocs/images/RunCustomJob/runCustomJob6.png rename to htdocs/images/runcustomjob/runcustomjob6.png diff --git a/htdocs/images/Shutdown/1.png b/htdocs/images/shutdown/1.png similarity index 100% rename from htdocs/images/Shutdown/1.png rename to htdocs/images/shutdown/1.png diff --git a/htdocs/images/Shutdown/2.png b/htdocs/images/shutdown/2.png similarity index 100% rename from htdocs/images/Shutdown/2.png rename to htdocs/images/shutdown/2.png diff --git a/htdocs/images/Snapshot/1.png b/htdocs/images/snapshot/1.png similarity index 100% rename from htdocs/images/Snapshot/1.png rename to htdocs/images/snapshot/1.png diff --git a/htdocs/images/Snapshot/2.png b/htdocs/images/snapshot/2.png similarity index 100% rename from htdocs/images/Snapshot/2.png rename to htdocs/images/snapshot/2.png diff --git a/htdocs/images/StartApp/1.png b/htdocs/images/startapp/1.png similarity index 100% rename from htdocs/images/StartApp/1.png rename to htdocs/images/startapp/1.png diff --git a/htdocs/images/StartApp/startApp1.png b/htdocs/images/startapp/startapp1.png similarity index 100% rename from htdocs/images/StartApp/startApp1.png rename to htdocs/images/startapp/startapp1.png diff --git a/htdocs/images/StartApp/startApp2.png b/htdocs/images/startapp/startapp2.png similarity index 100% rename from htdocs/images/StartApp/startApp2.png rename to htdocs/images/startapp/startapp2.png diff --git a/htdocs/images/StartApp/startApp3.png b/htdocs/images/startapp/startapp3.png similarity index 100% rename from htdocs/images/StartApp/startApp3.png rename to htdocs/images/startapp/startapp3.png diff --git a/htdocs/images/StartApp/startApp4.png b/htdocs/images/startapp/startapp4.png similarity index 100% rename from htdocs/images/StartApp/startApp4.png rename to htdocs/images/startapp/startapp4.png diff --git a/htdocs/images/StartApplicationServers/PipelineConfig.png b/htdocs/images/startapplicationservers/pipelineconfig.png similarity index 100% rename from htdocs/images/StartApplicationServers/PipelineConfig.png rename to htdocs/images/startapplicationservers/pipelineconfig.png diff --git a/htdocs/images/StartApplicationServers/PipelineLog.png b/htdocs/images/startapplicationservers/pipelinelog.png similarity index 100% rename from htdocs/images/StartApplicationServers/PipelineLog.png rename to htdocs/images/startapplicationservers/pipelinelog.png diff --git a/htdocs/images/StartApplicationServers/PipelinePicker.png b/htdocs/images/startapplicationservers/pipelinepicker.png similarity index 100% rename from htdocs/images/StartApplicationServers/PipelinePicker.png rename to htdocs/images/startapplicationservers/pipelinepicker.png diff --git a/htdocs/images/StartApplicationServers/PipelineResult.png b/htdocs/images/startapplicationservers/pipelineresult.png similarity index 100% rename from htdocs/images/StartApplicationServers/PipelineResult.png rename to htdocs/images/startapplicationservers/pipelineresult.png diff --git a/htdocs/images/StartCluster/PipelineConfig.png b/htdocs/images/startcluster/pipelineconfig.png similarity index 100% rename from htdocs/images/StartCluster/PipelineConfig.png rename to htdocs/images/startcluster/pipelineconfig.png diff --git a/htdocs/images/StartCluster/PipelineLog.png b/htdocs/images/startcluster/pipelinelog.png similarity index 100% rename from htdocs/images/StartCluster/PipelineLog.png rename to htdocs/images/startcluster/pipelinelog.png diff --git a/htdocs/images/StartCluster/PipelinePicker.png b/htdocs/images/startcluster/pipelinepicker.png similarity index 100% rename from htdocs/images/StartCluster/PipelinePicker.png rename to htdocs/images/startcluster/pipelinepicker.png diff --git a/htdocs/images/StartCluster/PipelineResult.png b/htdocs/images/startcluster/pipelineresult.png similarity index 100% rename from htdocs/images/StartCluster/PipelineResult.png rename to htdocs/images/startcluster/pipelineresult.png diff --git a/htdocs/images/StartDeploymentManager/PipelineConfig.png b/htdocs/images/startdeploymentmanager/pipelineconfig.png similarity index 100% rename from htdocs/images/StartDeploymentManager/PipelineConfig.png rename to htdocs/images/startdeploymentmanager/pipelineconfig.png diff --git a/htdocs/images/StartDeploymentManager/PipelineLog.png b/htdocs/images/startdeploymentmanager/pipelinelog.png similarity index 100% rename from htdocs/images/StartDeploymentManager/PipelineLog.png rename to htdocs/images/startdeploymentmanager/pipelinelog.png diff --git a/htdocs/images/StartDeploymentManager/PipelinePicker.png b/htdocs/images/startdeploymentmanager/pipelinepicker.png similarity index 100% rename from htdocs/images/StartDeploymentManager/PipelinePicker.png rename to htdocs/images/startdeploymentmanager/pipelinepicker.png diff --git a/htdocs/images/StartDeploymentManager/PipelineResult.png b/htdocs/images/startdeploymentmanager/pipelineresult.png similarity index 100% rename from htdocs/images/StartDeploymentManager/PipelineResult.png rename to htdocs/images/startdeploymentmanager/pipelineresult.png diff --git a/htdocs/images/StartNode/PipelineConfig.png b/htdocs/images/startnode/pipelineconfig.png similarity index 100% rename from htdocs/images/StartNode/PipelineConfig.png rename to htdocs/images/startnode/pipelineconfig.png diff --git a/htdocs/images/StartNode/PipelineLog.png b/htdocs/images/startnode/pipelinelog.png similarity index 100% rename from htdocs/images/StartNode/PipelineLog.png rename to htdocs/images/startnode/pipelinelog.png diff --git a/htdocs/images/StartNode/PipelinePicker.png b/htdocs/images/startnode/pipelinepicker.png similarity index 100% rename from htdocs/images/StartNode/PipelinePicker.png rename to htdocs/images/startnode/pipelinepicker.png diff --git a/htdocs/images/StartNode/PipelineResult.png b/htdocs/images/startnode/pipelineresult.png similarity index 100% rename from htdocs/images/StartNode/PipelineResult.png rename to htdocs/images/startnode/pipelineresult.png diff --git a/htdocs/images/StartServer/1.png b/htdocs/images/startserver/1.png similarity index 100% rename from htdocs/images/StartServer/1.png rename to htdocs/images/startserver/1.png diff --git a/htdocs/images/StartServer/11.png b/htdocs/images/startserver/11.png similarity index 100% rename from htdocs/images/StartServer/11.png rename to htdocs/images/startserver/11.png diff --git a/htdocs/images/StartServer/2.png b/htdocs/images/startserver/2.png similarity index 100% rename from htdocs/images/StartServer/2.png rename to htdocs/images/startserver/2.png diff --git a/htdocs/images/StartServer/22.png b/htdocs/images/startserver/22.png similarity index 100% rename from htdocs/images/StartServer/22.png rename to htdocs/images/startserver/22.png diff --git a/htdocs/images/StartServer/3.png b/htdocs/images/startserver/3.png similarity index 100% rename from htdocs/images/StartServer/3.png rename to htdocs/images/startserver/3.png diff --git a/htdocs/images/StartServer/4.png b/htdocs/images/startserver/4.png similarity index 100% rename from htdocs/images/StartServer/4.png rename to htdocs/images/startserver/4.png diff --git a/htdocs/images/StartServer/jobdetail.png b/htdocs/images/startserver/jobdetail.png similarity index 100% rename from htdocs/images/StartServer/jobdetail.png rename to htdocs/images/startserver/jobdetail.png diff --git a/htdocs/images/StartServer/loginfo.png b/htdocs/images/startserver/loginfo.png similarity index 100% rename from htdocs/images/StartServer/loginfo.png rename to htdocs/images/startserver/loginfo.png diff --git a/htdocs/images/StartServer/parameters.png b/htdocs/images/startserver/parameters.png similarity index 100% rename from htdocs/images/StartServer/parameters.png rename to htdocs/images/startserver/parameters.png diff --git a/htdocs/images/StartServer/pickStep.png b/htdocs/images/startserver/pickstep.png similarity index 100% rename from htdocs/images/StartServer/pickStep.png rename to htdocs/images/startserver/pickstep.png diff --git a/htdocs/images/StopApp/1.png b/htdocs/images/stopapp/1.png similarity index 100% rename from htdocs/images/StopApp/1.png rename to htdocs/images/stopapp/1.png diff --git a/htdocs/images/StopApp/stopApp1.png b/htdocs/images/stopapp/stopapp1.png similarity index 100% rename from htdocs/images/StopApp/stopApp1.png rename to htdocs/images/stopapp/stopapp1.png diff --git a/htdocs/images/StopApp/stopApp2.png b/htdocs/images/stopapp/stopapp2.png similarity index 100% rename from htdocs/images/StopApp/stopApp2.png rename to htdocs/images/stopapp/stopapp2.png diff --git a/htdocs/images/StopApp/stopApp3.png b/htdocs/images/stopapp/stopapp3.png similarity index 100% rename from htdocs/images/StopApp/stopApp3.png rename to htdocs/images/stopapp/stopapp3.png diff --git a/htdocs/images/StopApp/stopApp4.png b/htdocs/images/stopapp/stopapp4.png similarity index 100% rename from htdocs/images/StopApp/stopApp4.png rename to htdocs/images/stopapp/stopapp4.png diff --git a/htdocs/images/StopApplicationServers/PipelineConfig.png b/htdocs/images/stopapplicationservers/pipelineconfig.png similarity index 100% rename from htdocs/images/StopApplicationServers/PipelineConfig.png rename to htdocs/images/stopapplicationservers/pipelineconfig.png diff --git a/htdocs/images/StopApplicationServers/PipelineLog.png b/htdocs/images/stopapplicationservers/pipelinelog.png similarity index 100% rename from htdocs/images/StopApplicationServers/PipelineLog.png rename to htdocs/images/stopapplicationservers/pipelinelog.png diff --git a/htdocs/images/StopApplicationServers/PipelinePicker.png b/htdocs/images/stopapplicationservers/pipelinepicker.png similarity index 100% rename from htdocs/images/StopApplicationServers/PipelinePicker.png rename to htdocs/images/stopapplicationservers/pipelinepicker.png diff --git a/htdocs/images/StopApplicationServers/PipelineResult.png b/htdocs/images/stopapplicationservers/pipelineresult.png similarity index 100% rename from htdocs/images/StopApplicationServers/PipelineResult.png rename to htdocs/images/stopapplicationservers/pipelineresult.png diff --git a/htdocs/images/StopCluster/PipelineConfig.png b/htdocs/images/stopcluster/pipelineconfig.png similarity index 100% rename from htdocs/images/StopCluster/PipelineConfig.png rename to htdocs/images/stopcluster/pipelineconfig.png diff --git a/htdocs/images/StopCluster/PipelineLog.png b/htdocs/images/stopcluster/pipelinelog.png similarity index 100% rename from htdocs/images/StopCluster/PipelineLog.png rename to htdocs/images/stopcluster/pipelinelog.png diff --git a/htdocs/images/StopCluster/PipelinePicker.png b/htdocs/images/stopcluster/pipelinepicker.png similarity index 100% rename from htdocs/images/StopCluster/PipelinePicker.png rename to htdocs/images/stopcluster/pipelinepicker.png diff --git a/htdocs/images/StopCluster/PipelineResult.png b/htdocs/images/stopcluster/pipelineresult.png similarity index 100% rename from htdocs/images/StopCluster/PipelineResult.png rename to htdocs/images/stopcluster/pipelineresult.png diff --git a/htdocs/images/StopDeploymentManager/PipelineConfig.png b/htdocs/images/stopdeploymentmanager/pipelineconfig.png similarity index 100% rename from htdocs/images/StopDeploymentManager/PipelineConfig.png rename to htdocs/images/stopdeploymentmanager/pipelineconfig.png diff --git a/htdocs/images/StopDeploymentManager/PipelineLog.png b/htdocs/images/stopdeploymentmanager/pipelinelog.png similarity index 100% rename from htdocs/images/StopDeploymentManager/PipelineLog.png rename to htdocs/images/stopdeploymentmanager/pipelinelog.png diff --git a/htdocs/images/StopDeploymentManager/PipelinePicker.png b/htdocs/images/stopdeploymentmanager/pipelinepicker.png similarity index 100% rename from htdocs/images/StopDeploymentManager/PipelinePicker.png rename to htdocs/images/stopdeploymentmanager/pipelinepicker.png diff --git a/htdocs/images/StopDeploymentManager/PipelineResult.png b/htdocs/images/stopdeploymentmanager/pipelineresult.png similarity index 100% rename from htdocs/images/StopDeploymentManager/PipelineResult.png rename to htdocs/images/stopdeploymentmanager/pipelineresult.png diff --git a/htdocs/images/StopNode/PipelineConfig.png b/htdocs/images/stopnode/pipelineconfig.png similarity index 100% rename from htdocs/images/StopNode/PipelineConfig.png rename to htdocs/images/stopnode/pipelineconfig.png diff --git a/htdocs/images/StopNode/PipelineLog.png b/htdocs/images/stopnode/pipelinelog.png similarity index 100% rename from htdocs/images/StopNode/PipelineLog.png rename to htdocs/images/stopnode/pipelinelog.png diff --git a/htdocs/images/StopNode/PipelinePicker.png b/htdocs/images/stopnode/pipelinepicker.png similarity index 100% rename from htdocs/images/StopNode/PipelinePicker.png rename to htdocs/images/stopnode/pipelinepicker.png diff --git a/htdocs/images/StopNode/PipelineResult.png b/htdocs/images/stopnode/pipelineresult.png similarity index 100% rename from htdocs/images/StopNode/PipelineResult.png rename to htdocs/images/stopnode/pipelineresult.png diff --git a/htdocs/images/StopServer/1.png b/htdocs/images/stopserver/1.png similarity index 100% rename from htdocs/images/StopServer/1.png rename to htdocs/images/stopserver/1.png diff --git a/htdocs/images/StopServer/11.png b/htdocs/images/stopserver/11.png similarity index 100% rename from htdocs/images/StopServer/11.png rename to htdocs/images/stopserver/11.png diff --git a/htdocs/images/StopServer/12.png b/htdocs/images/stopserver/12.png similarity index 100% rename from htdocs/images/StopServer/12.png rename to htdocs/images/stopserver/12.png diff --git a/htdocs/images/StopServer/22.png b/htdocs/images/stopserver/22.png similarity index 100% rename from htdocs/images/StopServer/22.png rename to htdocs/images/stopserver/22.png diff --git a/htdocs/images/StopServer/parameters.png b/htdocs/images/stopserver/parameters.png similarity index 100% rename from htdocs/images/StopServer/parameters.png rename to htdocs/images/stopserver/parameters.png diff --git a/htdocs/images/StopServer/step.png b/htdocs/images/stopserver/step.png similarity index 100% rename from htdocs/images/StopServer/step.png rename to htdocs/images/stopserver/step.png diff --git a/htdocs/images/Suspend/1.png b/htdocs/images/suspend/1.png similarity index 100% rename from htdocs/images/Suspend/1.png rename to htdocs/images/suspend/1.png diff --git a/htdocs/images/Suspend/2.png b/htdocs/images/suspend/2.png similarity index 100% rename from htdocs/images/Suspend/2.png rename to htdocs/images/suspend/2.png diff --git a/htdocs/images/SyncNodes/SyncNodesParameters.png b/htdocs/images/syncnodes/syncnodesparameters.png similarity index 100% rename from htdocs/images/SyncNodes/SyncNodesParameters.png rename to htdocs/images/syncnodes/syncnodesparameters.png diff --git a/htdocs/images/UndeployApp/1.png b/htdocs/images/undeployapp/1.png similarity index 100% rename from htdocs/images/UndeployApp/1.png rename to htdocs/images/undeployapp/1.png diff --git a/htdocs/images/UndeployApp/undeployApp1.png b/htdocs/images/undeployapp/undeployapp1.png similarity index 100% rename from htdocs/images/UndeployApp/undeployApp1.png rename to htdocs/images/undeployapp/undeployapp1.png diff --git a/htdocs/images/UndeployApp/undeployApp2.png b/htdocs/images/undeployapp/undeployapp2.png similarity index 100% rename from htdocs/images/UndeployApp/undeployApp2.png rename to htdocs/images/undeployapp/undeployapp2.png diff --git a/htdocs/images/UndeployApp/undeployApp3.png b/htdocs/images/undeployapp/undeployapp3.png similarity index 100% rename from htdocs/images/UndeployApp/undeployApp3.png rename to htdocs/images/undeployapp/undeployapp3.png diff --git a/htdocs/images/UndeployApp/undeployApp4.png b/htdocs/images/undeployapp/undeployapp4.png similarity index 100% rename from htdocs/images/UndeployApp/undeployApp4.png rename to htdocs/images/undeployapp/undeployapp4.png diff --git a/htdocs/images/UpdateApp/EC-WebSphereUpdateApp1.png b/htdocs/images/updateapp/ec-websphereupdateapp1.png similarity index 100% rename from htdocs/images/UpdateApp/EC-WebSphereUpdateApp1.png rename to htdocs/images/updateapp/ec-websphereupdateapp1.png diff --git a/htdocs/images/UpdateApp/EC-WebSphereUpdateApp2.png b/htdocs/images/updateapp/ec-websphereupdateapp2.png similarity index 100% rename from htdocs/images/UpdateApp/EC-WebSphereUpdateApp2.png rename to htdocs/images/updateapp/ec-websphereupdateapp2.png diff --git a/htdocs/images/UpdateApp/EC-WebSphereUpdateApp3.png b/htdocs/images/updateapp/ec-websphereupdateapp3.png similarity index 100% rename from htdocs/images/UpdateApp/EC-WebSphereUpdateApp3.png rename to htdocs/images/updateapp/ec-websphereupdateapp3.png diff --git a/htdocs/images/UpdateApp/EC-WebSphereUpdateApp4.png b/htdocs/images/updateapp/ec-websphereupdateapp4.png similarity index 100% rename from htdocs/images/UpdateApp/EC-WebSphereUpdateApp4.png rename to htdocs/images/updateapp/ec-websphereupdateapp4.png diff --git a/pages/EC-WebSphere_help.xml b/pages/EC-WebSphere_help.xml index 1fff6a58..d0b0bee1 100644 --- a/pages/EC-WebSphere_help.xml +++ b/pages/EC-WebSphere_help.xml @@ -1,6807 +1,21 @@ - - - - @PLUGIN_KEY@ Plugin - - - - -
                              -

                              @PLUGIN_KEY@

                              -

                              Plugin version @PLUGIN_VERSION@

                              - -

                              Revised on July 16, 2020

                              - -
                              -

                              Contents

                              - - - -

                              Overview

                              -

                              WebSphere Application Server (WAS) is a software product that performs the role of a web application server. -More specifically, it is a software framework and middleware that hosts Java based web applications. -It is the flagship product within IBM's WebSphere software suite. -It was initially created by Donald F. Ferguson, who later became CTO of Software for Dell. -The first version was launched in 1998. -WAS is built using open standards such as Java EE, XML, and Web Services. -It is supported on the following platforms:

                              -
                                -
                              • Windows
                              • -
                              • AIX
                              • -
                              • Linux
                              • -
                              • Solaris
                              • -
                              • IBM i and z/OS.
                              • -
                              -

                              Beginning with Version 6.1 and now into Version 9.0, the open standard specifications are aligned and common across all the platforms. -Platform exploitation, to the extent it takes place, is done below the open standard specification line. -It works with a number of Web servers including Apache HTTP Server, Netscape Enterprise Server, Microsoft Internet Information Services (IIS), IBM HTTP Server for i5/OS, IBM HTTP Server for z/OS, and IBM HTTP Server for AIX/Linux/Microsoft Windows/Solaris. -It uses port 9060 for connection as the default administration port and port 9080 as the default website publication port. -In case you install more WebSphere instances these values will be changed.

                              -

                              For more information about WebSphere, go to the WebSphere Home Page.

                              -

                              CloudBees CD Integration to WebSphere

                              -

                              You can use this plugin to interact with an IBM -WebSphere Server. You can start and stop the server. -You can also manage applications within the server (start, -deploy, undeploy, stop or custom task) using the provided -WebSphere scripts in the bin directory under -the installation home directory (wsadmin, startServer, -stopServer). You can run Jython scripts that are -provided by the user or defined when a procedure is -created.

                              -

                              Integrated Version

                              -

                              The plugin was tested on following WebSphere versions:

                              -
                                -
                              • WAS and WASND 9.0 on Linux and Windows
                              • -
                              • WAS and WASND 8.5.5 on Linux and Windows
                              • -
                              • WAS and WASND 8.5.0 on Linux and Windows
                              • -
                              • WAS and WASND 8.0 on Linux and Windows
                              • -
                              • WAS 7.0 on Linux and Windows. -Beginning Release 2.4 we do not certify this plugin on the 7.0 version of WAS considering that this version is not actively supported by IBM since April 2018. -Please refer to this IBM Link
                              • -
                              -

                              - - - - - - - - - - -
                              - -

                              Plugin Configurations

                              - -

                              - Plugin configurations are sets of parameters that apply - across some or all of the plugin procedures. They - reduce repetition of common values, create - predefined parameter sets for end users, and - securely store credentials where needed. Each configuration - is given a unique name that is entered in designated - parameters on procedures that use them.

                              -

                              - -

                              Creating Plugin Configurations

                              -

                              To create plugin configurations in CloudBees CD, - do these steps:

                              - -
                            • Go to Administration > Plugins to open the Plugin Manager.
                            • -
                            • Find the @PLUGIN_NAME@ row.
                            • -
                            • Click Configure to open the - Configurations page.
                            • -
                            • Click Create Configuration as per the description of parameters below.
                            • - -

                              Note: After you perform the setup below it is important to make sure that the CloudBees CD agent machine on which WebSphere runs is registered as a resource that can be pinged. -
                              -Plugin configurations are sets of parameters that apply across some or all of the plugin procedures. -They reduce repetition of common values, create predefined parameter sets for end users, -and securely store credentials where needed. -Each configuration is given a unique name that is entered in designated parameters on procedures that use them.

                              - - - -

                              Configuration Procedure Parameters

                              -
                            Test Connection?Check if connection should be established during config creation to validate credentials.
                            Test Connection ResourceA resource which is used for the testing connection.
                            Debug LevelDebug level.Debug level, higher debug level - more debug messages. Warning: on debug level 10 and more passwords will be revealed in a procedure logs.
                            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            ParameterDescription
                            Configuration NameIdentifier of the configuration to create. i.e: myconfig
                            WSAdmin Absolute PathAbsolute path to wsadmin script.
                            Connection TypeSpecifies type of connection to use to connect to the application server that you want to administer.
                            WebSphere HostHostname of the WebSphere Application Server to administer using wsadmin tool. For example: 10.200.1.234 or yourWSServer.
                            WebSphere Connector PortPort of WebSphere Application server to which wsadmin should connect.Give the port number based on the type of connection you choose.For example, if you want to connect to application server using SOAP connection give the port number of SOAP connector of that server.
                            Login asCredentials used to connect to WebSphere instance.
                            Test Connection?Check if connection should be established during config creation to validate credentials.
                            Test Connection ResourceA resource which is used for the testing connection.
                            Debug LevelDebug level, higher debug level - more debug messages. Warning: on debug level 10 and more passwords will be revealed in a procedure logs.
                            - -
    - - - - -

    Plugin Procedures

    - - - - -
    -

    CreateEndToEndMailProvider

    - - -

    Creates a mail provider along with protocol provider and mail session.

    - - -

    This procedure creates mail provider with a protocol provider, a mail session and a custom property in the specified scope.

    - - -

    CreateEndToEndMailProvider Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    ScopeSpecifies the scope in which the mail provider supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster'
    Mail Provider NameSpecifies the name to be given to the new mail provider .
    Mail Provider DescriptionSpecifies the mail provider description.
    Isolate this mail provider?Specifies that this mail provider will be loaded in its own class loader. This allows the application server to load different versions or implementations of the same mail provider in the same Java Virtual Machine. Give each version or implementation of the mail provider a unique class path in following (Mail provider classpath) field that is appropriate for that version or implementation.
    Mail Provider ClasspathSpecifies the class path to a Java archive (JAR) file that contains the implementation classes for this mail provider.
    Custom Property NameSpecifies the name of custom property to create.
    Custom Property ValueSpecifies the value to associate with this custom property of the resource.
    Protocol Provider NameSpecifies the name to be given to the new protocol provider .
    Protocol Provider Class NameSpecifies the implementation class of this protocol provider.
    Protocol Provider TypeSpecifies the type of protocol provider. Valid options are STORE(for incoming protocol provider) or TRANSPORT(for outgoing protocol provider).
    Mail Session NameSpecifies the administrative name of the JavaMail session object.
    Mail Session JNDI NameSpecifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts.
    CategoryOptional string to use while classifying or grouping the resources.
    Enable Debug Mode?Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file.
    Mail Session DescriptionSpecifies optional description for mail session.
    Incoming Mail ServerSpecifies the host name server that is accessed when receiving mail.
    Incoming Mail Server PortSpecifies the port of the server that is accessed when receiving mail.
    Incoming Mail Server CredentialsSpecifies the credential for the mail account when the incoming mail server requires authentication.
    Outgoing Mail ServerSpecifies the host name of server that is accessed when sending mail.
    Outgoing Mail Server PortSpecifies the port of the server that is accessed when sending mail.
    Outgoing Mail Server CredentialSpecifies the user of the mail account when the outgoing mail server requires authentication.
    Enable Strict Internet Address Parsing?Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822.
    - - - - -

    -

    CreateEndToEndMailProvider

    -

    To create a new mail provider along with protocol provider and mail session, do these steps:

    -
      -
    1. Go to the CreateEndToEndMailProvider procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - OSGi application is deployed successfully:

    - -

    In the CreateEndToEndMailProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    CreateMailSession

    - - -

    Creates a new JavaMail session using the wsadmin tool.

    - - -

    This procedure creates a JavaMail session object for default mail provider at specified scope.

    - - -

    CreateMailSession Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    ScopeSpecifies the scope in which the mail session supports installed mail applications.For example, 'Cell=Cell01,Node=Node01,Server=server1' or 'Cell=Cell01,ServerCluster=testCluster'
    Mail Session NameSpecifies the administrative name of the JavaMail session object.
    Mail Session DescriptionSpecifies optional description for mail session.
    Mail Session JNDI NameSpecifies the Java Naming and Directory Interface (JNDI) name for the resource, including any naming subcontexts.
    CategoryOptional string to use while classifying or grouping the resources.
    Enable Debug Mode?Select to print the interaction between mail application and mail server as well as the properties of this mail session to System.Out.log file.
    Outgoing Mail ServerSpecifies the host name of server that is accessed when sending mail.
    Outgoing Mail Server PortSpecifies the port of the server that is accessed when sending mail.
    Outgoing Mail Server ProtocolSpecifies the protocol to use when sending mail.
    Outgoing Mail Server CredentialSpecifies the user of the mail account when the outgoing mail server requires authentication.
    Return E-mail Address Represents the Internet email address that, by default, displays in the received message in the From or the Reply-To address. The recipient's reply will come to this address.
    Incoming Mail ServerSpecifies the host name server that is accessed when receiving mail.
    Incoming Mail Server PortSpecifies the port of the server that is accessed when receiving mail.
    Incoming Mail Server ProtocolSpecifies the protocol to use when receiving mail.
    Incoming Mail Server CredentialsSpecifies the credential for the mail account when the incoming mail server requires authentication.
    Enable Strict Internet Address Parsing?Specifies whether the recipient addresses must be parsed in strict compliance with RFC 822.
    - - - - -

    -

    Create Mail Session

    -

    To create a mail session for default mail provider, do these steps:

    -
      -
    1. Go to the CreateMailSession procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - mail session is created successfully:

    - -

    In the CreateMailSession step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    PublishWSDL

    - - -

    Publishes WSDL files in each web services-enabled module to the file system location

    - - -

    This procedure publishes WSDL files in each web services-enabled module to the file system location.

    - - -

    PublishWSDL Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the application of which to publish the WSDL file. i.e: 'webapp'.
    Location to publish WSDL fileFilename and absolute path on the filesystem where published WSDL files should get stored.For example, 'C:/webservices/sampleWSDL.zip'
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
    SOAP address prefixesGive SOAP address prefix in format "{{module {{binding partial-url}}}}" to customize the WSDL SOAP address for each module.. i.e: '{ {AddressBookJ2WB.war {{http http://localhost:9080}}} {StockQuote.jar {{http https://localhost:9443}}} }'.
    Additional Commands Additional commands to be entered for wsadmin.
    - - - - -

    -

    Publish WSDL

    -

    To publish WSDL files, do these steps:

    -
      -
    1. Go to the PublishWSDL procedure.
    2. -
    3. Enter the following parameters:
    4. -
    - -

    - -
    - - -
    -

    CreateApplicationServer

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure creates an Application Server identical to an existing Application Server or an Application Server definition which is part of a template. In addition it will synchronize nodes if checked.

    - - -

    CreateApplicationServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Node NameName of the node where application server is to be created.
    Server NameName of application server to be created.
    Generate Unique Ports? - By default ports generated during server creation will be created uniquely. - If not checked ports in template will be used as is for server creation. -
    Source Type - Type of source which should be used for server creation. Select Template or Application Server. - In case of template, application server template will be used for server creation, in case of Application Server, - template will be created from existing application server and new server will be created from this template then. - After successful creation template will be deleted. -
    Source Template Name - This parameter is applicable only when the source is a Template. - Name of server template to be the source for a new server. -
    Source Template Location - The configuration Id that represents the location of a template. - This parameter is applicable only when the source is a Template. -
    Source Server Name - Name of application server to be the source for a new server in format nodename:servername. -
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Create Application Server

    -

    To Create Application Server in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the CreateApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    DeleteApplicationServer

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure deletes an existing Application Server. In addition it will synchronize nodes if checked.

    - - -

    DeleteApplicationServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Node NameName of the node where application server to be deleted.
    Server NameName of application server to be deleted.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Delete Application Server

    -

    To Delete Application Server in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the DeleteApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    CreateApplicationServerTemplate

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure creates a template of an existing Application Server.

    - - -

    CreateApplicationServerTemplate Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Node NameName of the node where application server is located.
    Application Server NameName of the application server the template will be based out of.
    Template NameApplication server template name to be created.
    Template Location - Specifies a configuration Id that represents the location to place the template. -
    Template DescriptionDescription of application server template.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Create Application Server Template

    -

    To Create Application Server Template in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the CreateApplicationServerTemplate step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    DeleteApplicationServerTemplate

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure deletes an existing Application Server Template.

    - - -

    DeleteApplicationServerTemplate Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Template NameApplication server template name to be deleted.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Delete Application Server Template

    -

    To Delete Application Server Template in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the DeleteApplicationServerTemplate step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    CreateCluster

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Creates a new Application Server cluster.

    - - -

    This procedure creates a cluster, adds members to it, and can deploy an application in it using a Jython script.

    - - -

    CreateCluster Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of the new cluster.
    Prefer Local?Specifies whether enterprise bean requests are routed to the node on which - the client resides whenever such a routing is possible.
    Create First Cluster Member?If not checked, empty cluster will be created
    First Cluster Member Creation Policy - Controls how 1st cluster member is to be created - Existing - use existing server as template - Convert - convert existing server to 1st cluster member - Template - use app server template to create 1st cluster member -
    Source Template Name - Name of server template to be the source for first cluster member. -
    Source Server Name - Name of application server to be the source for a new server in format nodename:servername. -
    First Cluster Member NodeNode name where first cluster member will be created.
    First Cluster Member NameName of the server that will be created as a first cluster member.
    First Cluster Member WeightWeight of first cluster member.
    Generate Unique Ports for First Cluster Member? - By default ports generated during for first cluster member creation will be created uniquely. - If not checked ports in template will be used as is for server creation. -
    Server Resources Promotion Policy - Specifies how resources such as data sources are initially created in the cluster. - Create settings at the cluster scope if the settings can be used across the entire cluster. - Otherwise, create settings at the cluster member (server) level. - Creating settings at the cluster scope reduces the amount of configuration that you maintain. - Default is Cluster. -
    Add Cluster Members?If checked, additional cluster members will be added right after cluster creation.
    Gen Unique Ports for Cluster Members? - By default ports generated during cluster members creation will be created uniquely. - If not checked ports in template will be used as is for server creation. -
    Weight of Each Cluster Member - Weight of each cluster member from list. -
    Cluster Members List - List of cluster members to be created in format NodeName:server1, NodeName2:server2. -
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Create Cluster

    -

    To Create Cluster in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the CreateCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    DeleteCluster

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Deletes an existing cluster using the wsadmin tool

    - - -

    This procedure delete the specified cluster.

    - - -

    DeleteCluster Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameThe name of the cluster to delete.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Delete Cluster

    -

    To Delete Cluster in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the DeleteCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    ExportApplicationServer

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure exports the definition of an Application Server in an environment to an archive (with extension .car) in the filesystem, that can in turn be used import into another environment and create an identical server.

    - - -

    ExportApplicationServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Node NameName of application server node.
    Application Server NameName of the application server to be exported.
    ArchiveSpecifies the fully qualified path of the exported configuration archive.
    - - - - -

    -

    Export Application Server

    -

    To Export Application Server in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the ExportApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    ImportApplicationServer

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure imports an Application Server from an Archive and creates an identical server in the environment the Archive is imported into.

    - - -

    ImportApplicationServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Node NameName of the Node in which the Application Server is to be Imported.
    Application Server NameName of the Application Server to be created based on the server in the Imported Archive.
    ArchiveSpecifies the fully qualified path of the configuration archive.
    Node Name in Archive - Specifies the node name of the server defined in the configuration archive. - Not required if there is only one Node in the Archive to be imported. - If there are multiple nodes in the Archive, mention the node name of the Server to be imported. -
    Server Name in Archive - Specifies the name of the server defined in the configuration archive. - Not required if there is only one Server in the Archive to be imported. - If there are multiple servers in the Archive, mention the name of the Server to be imported. -
    Core GroupSpecifies the core group name to which the server should belong.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Import Application Server

    -

    To Import Application Server in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the ImportApplicationServer step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    ListClusterMembers

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Lists all the members of cluster using wsadmin tool.

    - - -

    This procedure lists down all the members (application servers) of the cluster using a Jython script.

    - - -

    ListClusterMembers Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of the cluster of which members to list down.
    Output Property PathProperty where cluster members list is to be stored.
    - - - - -

    -

    List Cluster Members

    -

    To List Cluster Members in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the ListClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    RemoveClusterMembers

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Removes list of application servers from existing cluster

    - - -

    This procedure removes specified application servers from the cluster using a Jython script.

    - - -

    RemoveClusterMembers Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of cluster from which to remove/delete the members.
    List of Cluster Members - List of cluster members in the form Node01:server1, Node02:server2 to remove/delete from cluster. - Important note: server will be not only removed from cluster, but also deleted. -
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Remove Cluster Members

    -

    To Remove Cluster Members in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the RemoveClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    SyncNodes

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Synchronizes active nodes.

    - - -

    Synchronizes Cell's Deployment Manager config repository with nodes of the cell. By default, WebSphere nodes are configured for auto-sync. -This procedure should be used for manual nodes synchronization. -For example: New custom property for node was added, and configuration was saved. -Next, to make it available on each server it should be propagated to all servers of the node by nodes synchronization.

    - - -

    SyncNodes Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    - - - - -
    - - -
    -

    ConfigEJBContainer

    - - -

    Configures EJB container using the wsadmin tool

    - - -

    This procedure configures EJB container properites using a Jython script.

    - - -

    ConfigEJBContainer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Cell NameName of cell to which EJB container belongs to.
    Node NameName of node to which EJB container belongs to.
    Server NameName of application server to which EJB container belongs to.
    Passivation DirectorySpecifies the directory into which the container saves the persistent state of passivated stateful session beans. This directory must already exist. It is not automatically created.Default is ${USER_INSTALL_ROOT}/temp.
    Cache SizeNumber of buckets in the active instance list within the EJB container.Input value range - greater than 0. The container selects the next largest prime number equal to or greater than the specified value.Default is 2053
    Cleanup IntervalInterval (in milliseconds)at which the container attempts to remove unused items from the cache.Default is 3000. Allowed range is 0 to 2147483647
    Inactive Pool Cleanup IntervalSpecifies the interval at which the container examines the pools of available bean instances to determine if some instances can be deleted to reduce memory usage.
    Enable stateful session bean fail over using memory-to-memory replication?Specifies that failover is enabled for all stateful session beans installed in this EJB container.Replication domains must already exist to failover feature to work.
    Replication domainSpecifies the replication domain in which HTTP sessions are replicated.
    Replication ModeThe mode specifies whether data is only sent (client), only received (server), or both. Select client if sessions need to be replicated. Select server if sessions need to be stored. Select both client and server if sessions need to be replicated and stored. The default is both.
    - - - - -

    -

    Configure EJB Container

    -

    To Configure EJB Container, do these steps:

    -
      -
    1. Go to the ConfigEJBContainer procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - EJB container is configured successfully:

    - -

    In the ConfigEJBContainer step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    CreateFirstClusterMember

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Creates the First Cluster Member of an existing cluster.

    - - -

    CreateFirstClusterMember Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of the new cluster.
    First Cluster Member Name - Server Name of first cluster member. -
    First Cluster Member Node - Node Name of first cluster member. -
    First Cluster Member Weight - Weight of first cluster member. -
    Generate Unique Ports for First Cluster Member? - By default the port generated for first cluster member will be created uniquely. - If this option is not checked, ports in template will be used as is. -
    Server Resources Promotion Policy - Specifies how resources such as data sources are initially created in the cluster. - Create settings at the cluster scope if the settings can be used across the entire cluster. - Otherwise, create settings at the cluster member (server) level. - Creating settings at the cluster scope reduces the amount of configuration that you maintain. - Default is Cluster. -
    First Cluster Member Creation Policy - Controls how first cluster member is created. The values mean the following. - Existing - Use existing server - Template - Use app server template to create first cluster member -
    Source Template Name - Name of server template to be the source for first cluster member. -
    Source Server Name - Name of application server to be the source for a new server in format nodename:servername. -
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Create First Cluster Member

    -

    To Create First Cluster Member in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the CreateFirstClusterMember step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    CreateClusterMembers

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Creates members under an existing cluster.

    - - -

    CreateClusterMembers Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameA name of the cluster where servers is to be created.
    Gen Unique Ports?Generate unique ports number if checked.
    Cluster Member WeightWeight of each cluster member
    List of Cluster MembersList of cluster members.
    Sync Nodes? - The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. -
    - - - - -

    -

    Create Cluster Members

    -

    To Create Cluster Members in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the CreateClusterMembers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StartApplicationServers

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure starts one or more Application Servers that can be spread across nodes.

    - - -

    StartApplicationServers Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Server List - List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, - Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to start all servers within Node4. -
    Wait timeNot Required. Time to wait until all servers are started. If not specified wait time will be treated as 0.
    - - - - -

    -

    Start Application Servers

    -

    To Start Application Servers in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StartApplicationServers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StopApplicationServers

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure stops one or more Application Servers that can be spread across nodes.

    - - -

    StopApplicationServers Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Server List - List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, - Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to stop all servers within Node4. -
    Wait timeNot Required. Time to wait until all servers are stopped. If not specified wait time will be treated as 0.
    - - - - -

    -

    Stop Application Servers

    -

    To Stop Application Servers in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StopApplicationServers step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StartCluster

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Starts cluster using wsadmin tool.

    - - -

    This procedure starts a cluster.

    - - -

    StartCluster Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of the cluster to be started.
    Timeout - Specifies the waiting time before cluster start times out and returns an error. -
    - - - - -

    -

    Start Cluster

    -

    To Start Cluster in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StartCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StopCluster

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Stops cluster using wsadmin tool.

    - - -

    This procedure stops a cluster.

    - - -

    StopCluster Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Cluster NameName of the cluster to be stopped.
    Timeout - Specifies the waiting time before cluster stop times out and returns an error. -
    Perform Ripple Start?If checked, all servers within cluster will be stopped one-by-one and then started.
    - - - - -

    -

    Stop Cluster

    -

    To Stop Cluster in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StopCluster step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StartDeploymentManager

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure starts the Deployment Manager in a WAS network deployment.

    - - -

    StartDeploymentManager Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    StartManager LocationAbsolute Physical path in Filesystem to location of startManager script i.e., /path/to/startManager.sh or startManager.bat
    Deployment Manager Profile - Profile name of the DeploymentManager which needs to be started. - If this is not provided StartManager will start the DeploymentManager which has the default profile. -
    Log File LocationAbsolute Physical path in Filesystem to location of startManager.sh logs i.e., /path/to/startServer.log
    TimeoutSpecifies the waiting time before deployment manager start times out and returns an error.
    Additional Parameters - This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. -
    - - - - -

    -

    Start Deployment Manager

    -

    To Start Deployment Manager in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StartDeploymentManager step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StopDeploymentManager

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Stops Deployment Manager

    - - -

    StopDeploymentManager Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    StopManager LocationAbsolute Physical path in Filesystem to location of stopManager script i.e., /path/to/stopManager.sh or stopManager.bat
    Deployment Manager Profile - Profile name of the DeploymentManager which needs to be stopped. - If this is not provided StopManager will stop the DeploymentManager which has the default profile. -
    Log File LocationAbsolute Physical path in Filesystem to location of stopManager.sh logs i.e., /path/to/stopServer.log
    TimeoutSpecifies the waiting time before deployment manager stop times out and returns an error.
    Additional Parameters - This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. -
    - - - - -

    -

    Stop Deployment Manager

    -

    To Stop Deployment Manager in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StopDeploymentManager step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StartNode

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure starts a WAS node and optionally starts all Application Servers in that Node.

    - - -

    StartNode Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    StartNode LocationAbsolute Physical path in Filesystem to location of startNode script i.e., /path/to/startNode.sh or startNode.bat
    Node Profile - Profile name of the Node which needs to be started. - If this is not provided StartNode will start the Node which has the default profile. -
    Log File LocationAbsolute Physical path in Filesystem to location of startNode.sh logs i.e., /path/to/startServer.log
    TimeoutSpecifies the waiting time before node start times out and returns an error.
    Start all Application Servers?Start all application servers within node after nodeagent is started.
    Node Name to start ServersName of the node where application servers needs to be started.
    Additional Parameters - This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. -
    - - - - -

    -

    Start Node

    -

    To Start Node in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StartNode step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StopNode

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    This procedure stops a WAS node and stops the Application Servers in that Node based on the Stop Node policy.

    - - -

    StopNode Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    StopNode LocationAbsolute Physical path in Filesystem to location of stopNode script i.e., /path/to/stopNode.sh or stopNode.bat
    Node Profile - Profile name of the Node which needs to be stopped. - If this is not provided StopNode will stop the Node which has the default profile. -
    Log File LocationAbsolute Physical path in Filesystem to location of stopNode.sh logs i.e., /path/to/stopServer.log
    TimeoutSpecifies the waiting time before node stop times out and returns an error.
    Node Stop PolicyPolicy that will be used for node stopping. It could be one of: Just Stop node agent, stop Spplication Servers, Save Node State.
    Additional Parameters - This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. -
    - - - - -

    -

    Stop Node

    -

    To Stop Node in CloudBees CD interface, do these steps:

    -
      -
    • Create Pipeline.
    • -
    • Create task.
    • -
    • In task definition choose Plugin and choose following parameters: -
    • -
    • Click on arrow.
    • -
    • Enter the following parameters: -
    • -
    -

    After the pipeline runs, you can view the results, including the following step details: -
    -
    In the StopNode step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic report. -

    - -

    - -
    - - -
    -

    StartServer

    - - -

    Starts a WebSphere instance

    - - -

    This procedure starts a WebSphere instance or an application server using startServer.sh.

    - - -

    StartServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    StartServer Absolute PathAbsolute path of the start server script, including filename and extension. i.e: 'startServer.bat' or '/path/to/startServer.sh' or 'C:\Program Files\IBM\WebSphere\AppServer\bin\startServer.bat'.
    Instance nameThe name of the instance of the server to be started. i.e: 'server01'.
    Additional CommandsAdditional commands to be entered for the startup of the server.
    - - - - -
    - - -
    -

    StopServer

    - - -

    Stops a WebSphere instance

    - - -

    This procedure stops a WebSphere instance or an application server using stopServer.sh

    - -

    StopServer Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Script LocationAbsolute path of the stop server script, including filename and extension. i.e: 'C:/Program Files/IBM/WebSphere/AppServer/bin/stopServer.bat', 'stopServer.bat', '/path/to/stopServer.sh'
    Instance NameServer instance name of the server to be stopped. i.e: 'server01'.
    Additional CommandsAdditional commands to be entered for stop the server.
    - - - - -
    - - -
    -

    RunCustomJob

    - - -

    Runs a task using wsadmin

    - - -

    This procedure runs a task using wsadmin and the Jython code files.

    - - -

    RunCustomJob Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
    Script File Absolute PathPath of a Jython script that will be run using wsadmin. i.e: '/path/to/scriptFile.jython' or 'c:/dir/scriptFile.jython'.
    Script File SourceIndicates either if a script file route or an embedded script file will be provided.
    Script FileContent of the script file to run if Embedded File is chosen in the Script File Source.
    Additional CommandsAdditional commands to be entered for wsadmin.
    - - - - -

    -

    Running Custom Jobs

    -

    For a complete example, go to the Examples and Use Cases section.

    - -

    - -
    - - -
    -

    ConfigureSession

    - - -

    Configures the session management properties for the deployed application.

    - - -

    This procedure configures the session management related properties for deployed application. For more information on each of the parameter, please refer to the WebSphere Knowledge Center Page.

    - - -

    ConfigureSession Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. /path/to/wsadmin.sh or wsadmin.bat.
    Application NameName of the web application to configure.
    Enable SSL TrackingSpecifies that session tracking uses Secure Sockets Layer (SSL) information as a session ID. Enabling SSL tracking takes precedence over cookie-based session tracking and URL rewriting.
    Enable CookiesSpecifies whether to enable cookies.
    Enable URL RewritingSpecifies whether the session management facility uses rewritten URLs to carry the session IDs. If URL rewriting is enabled, the session management facility recognizes session IDs that arrive in the URL if the encodeURL method is called in the servlet.
    Enable Protocol SwitchingThis option is only applicable when Enable URL rewriting is selected. This option specifies that the session ID is added to a URL when the URL requires a switch from HTTP to HTTPS or from HTTPS to HTTP. If rewriting is enabled, the session ID is required to go between HTTP and HTTPS.
    Max in-memory session countSpecifies the maximum number of sessions to maintain in memory.
    Allow OverflowSpecifies whether the number of sessions in memory can exceed the value specified by the Max in-memory session count property. This option is valid only in non-distributed sessions mode..
    Enable Serialized SessionIf selected, concurrent session access in a given server is not permitted.
    Maximum Wait TimeSpecifies the maximum amount of time in seconds a servlet request waits on an HTTP session before continuing execution. The default is 5 seconds. Under normal conditions, a servlet request waiting for access to an HTTP session gets notified by the request that currently owns the given HTTP session when the request finishes.
    Access Session On TimeoutSpecifies whether the servlet is started normally or aborted in the event of a timeout. If you specify true, the servlet is started normally. If you specify false, the servlet execution aborts and error logs are generated.
    Invalid TimeoutSpecifies how long(in minutes) a session can go unused before it is no longer valid.
    Session Persistence ModeSpecifies whether to enable session persistence mode.
    - - - - -

    -

    Configure Session Management for application

    -

    To Configure Session Management for application, do these steps:

    -
      -
    1. Go to the ConfigureSession procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - the cluster was created successfully:

    - -

    In the ConfigureSession step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    MapSharedLibrary

    - - -

    Maps shared library.

    - - -

    This procedure maps shared library to already deployed application.

    - - -

    MapSharedLibrary Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Library NameShared Library Name.
    Application NameName of application to which shared library will be mapped.
    - - - - -

    -

    Map Shared Library to Application

    -

    To map shared library to application, do these steps:

    -
      -
    1. Go to the MapSharedLibrary procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details:

    - -

    In the MapSharedLibrary step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    ModifyApplicationClassLoader

    - - -

    Modify Application ClassLoader.

    - - -

    This procedure modifies ClassLoader of the deployed Application.

    - - -

    ModifyApplicationClassLoader Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Load OrderThe class-loader delegation mode, also known as the class loader order, determines whether a class loader delegates the loading of classes to the parent class loader.
    ClassLoader Isolation PolicyApplication class loaders load EJB modules, dependency JAR files, embedded resource adapters, and application-scoped shared libraries. Depending on the application class-loader policy, an application class loader can be shared by multiple applications (Single) or unique for each application (Multiple). The application class-loader policy controls the isolation of applications that are running in the system. When set to Single, applications are not isolated. When set to Multiple, applications are isolated from each other.
    Application NameName of the existing web application, which ClassLoader should be modified.
    - - - - -

    -

    Modify Application's ClassLoader

    -

    To modify Application's ClassLoader do the following steps:

    -
      -
    1. Go to the ModifyApplicationClassLoader procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details:

    - -

    In the ModifyApplicationClassLoader step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    StartApp

    - - -

    Start an application using wsadmin

    - - -

    This procedure starts an application using wsadmin. If the application is already running, a warning will be thrown.

    - - -

    StartApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the application to start. i.e: 'webapp'.
    Cluster NameName of the cluster on which application is deployed. Not required in WebSphere Base Edition.
    Server NameName of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition.
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
    Additional CommandsAdditional commands to be entered for wsadmin.
    - - - - -

    -

    Starting Applications

    -

    To start an application, do these steps:

    -
      -
    1. Go to the StartApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, - which show that application was started - successfully:

    -

    In the StartApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

    - -

    - -
    - - -
    -

    StopApp

    - - -

    Stop an application using wsadmin

    - - -

    This procedure stops an application using wsadmin. If the application is already stopped, a warning will be thrown.

    - - -

    StopApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the application to stop. i.e: 'webapp'.
    Cluster NameName of the cluster on which application is deployed. Not required in WebSphere Base Edition.
    Server NameName of the server on which application is deployed. Specify server in the form Node=server. For e.g. Node01=Server1. Not required in WebSphere Base Edition.
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
    Additional CommandsAdditional commands to be entered for wsadmin.
    - - - - -

    -

    Stopping Applications

    -

    To stop an application, do these steps:

    -
      -
    1. Go to the StopApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - the application was stoped - successfully:

    -

    In the StopApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

    - -

    - -
    - - -
    -

    CreateJDBCProvider

    - - -

    Creates a JDBC Provider using the wsadmin tool

    - - -

    This procedure creates a JDBC provider using a Jython script.

    - - -

    CreateJDBCProvider Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    JDBC Provider NameName of the JDBC Provider.
    JDBC Provider DescriptionA description for the JDBC Provider.
    Cell ScopeParent object where the JDBC Provider will be created. This determines the visibility scope of the JDBC Provider. When the Cell Scope is provided, if the node and server scopes are not provided, then the scope will be the 'cell'; if the node is provided and the server not, then the scope will be the 'node'; if the server is provided and the node not, then the scope will be the 'server'. At least the Cell, the Node or the Server scope must be provided. i.e: 'wsaspluginNode01Cell'.
    Cluster ScopeWhen the Cluster Scope is provided, then the scope will be the cluster. i.e: 'cluster1'.
    Node ScopeWhen the Node Scope is provided, if the cell and server scopes are not provided, then the scope will be the 'node'; if the cell is provided and the server not, then the scope will be the 'node'; if the server is provided and the cell not, then the scope will be the 'server'. i.e: 'wsaspluginNode01'.
    Server ScopeWhen the Server Scope is provided, then the scope will be the Node and the server always, even if the Node and the Cell Scopes are not provided. i.e: 'server1'.
    Implementation Class NameJava class name of the JDBC provider implementation.
    Driver Class PathA path for the resource provider classes.
    - - - - -

    -

    Creating a JDBC Providers

    -

    To create a JDBC provider, do these steps:

    -
      -
    1. Go to the CreateJDBCProvider procedure.
    2. - -
    3. Enter the following parameters:
    4. - -
    -

    After the job runs, you can view the results, including the following job details, - which show that JDBC provider was successfully created:

    - -

    In the CreateJDBCProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - -

    - -
    - - -
    -

    DeleteJDBCProvider

    - - -

    Deletes a JDBC Provider using the wsadmin tool

    - - -

    This procedure deletes a JDBC provider using a Jython script.

    - - -

    DeleteJDBCProvider Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    JDBC Provider NameA unique name that identifies the JDBC Provider to delete in the WebSphere domain.
    - - - - -

    -

    Deleting JDBC Providers

    -

    To delete a JDBC provider, do these steps:

    -
      -
    1. Go to the DeleteJDBCProvider procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - the JDBC provider was deleted successfully:

    - -

    In the DeleteJDBCProvider step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    CreateDatasource

    - - -

    Creates a datasource using the wsadmin tool. The scope assigned to the datasource is provided by the JDBC Provider.

    - - -

    The procedure creates a datasource by using a Jython script.

    - - -

    CreateDatasource Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    JDBC ProviderName of an existing JDBC Provider.
    Datasource NameA unique name that identifies this Datasource in the WebSphere domain.
    Datasource DescriptionA description for the datasource.
    JNDI NameThe JNDI path to where this Datasource is bound.
    Statement Cache SizeSpecifies the number of statements that can be cached per connection. The application server caches a statement after you close that statement.
    Authentication Alias NameProvide the authentication data alias.
    Datasource Helper Class NameProvide the datasource helper class name.
    - - - - -

    -

    To create a datasource, do the following steps:

    -
      -
    1. Go to the CreateDataSource procedure.
    2. - -
    3. Enter the following parameters:
    4. - -
    -

    After the job runs, you can view the results, including the following job details, - which show that the datasource was successfully created:

    - -

    In the CreateDatasource step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - -

    - -
    - - -
    -

    DeleteDatasource

    - - -

    Deletes a datasource using the wsadmin tool

    - - -

    This procedure deletes a datasource using a Jython script.

    - - -

    DeleteDatasource Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Datasource NameA unique name that identifies the datasource to delete in the WebSphere domain.
    - - - - -

    -

    Deleting Datasources

    -

    To delete a datasource, do these steps:

    -
      -
    1. Go to the DeleteDatasource procedure.
    2. - -
    3. Enter the following parameters:
    4. - -
    -

    After the job runs, you can view the results, including the following job details, which show that the datasource was deleted -successfully:

    -

    In the DeleteDatasource step, click the Log icon -to see the diagnostic information. The output is similar to -the following diagnostic -report.

    - -

    - -
    - - -
    -

    CreateJMSProvider

    - - -

    Creates a JMS Provider using the wsadmin tool

    - - -

    This procedure creates a new JMS provider using a Jython script.

    - - -

    CreateJMSProvider Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    ScopeSpecifies a scope of cell, node, server, or cluster for the JMS provider. E.g. Cell=Cell01,Node=Node01,Server=server1
    JMS Provider NameSpecifies the name to assign to the new JMS provider.
    Initial Context FactorySpecifies the Java class name of the initial context factory for the JMS provider.
    JMS provider URLSpecifies the JMS provider URL for external JNDI lookups.
    ClasspathSpecifies a list of paths or Java archive (JAR) file names which together form the location for the resource provider classes. Use a semicolon (;) to separate class paths.
    DescriptionSpecifies a description of the JMS Provider.
    Isolated Class LoaderIf set to true, specifies that the resource provider is loaded in its own class loader.
    Native PathSpecifies an optional path to any native libraries, such as *.dll and *.so. Native path entries are separated by a semicolon (;).
    Provider TypeSpecifies the JMS provider type that this JMS provider uses.
    Property SetSpecifies resource properties in the following format: [[['name','nameValue1'],['type','typeValue1'],['value','valueValue1']]... [['name','nameValuen'],['type','typeValuen'],['value','valueValuen']]]
    Supports ASFIf set to true, specifies that the JMS provider supports Application Server Facilities (ASF), which provides concurrency and transactional support for applications.
    - - - - -

    -

    Create JMS Provider

    -

    To create a new JMS provider, do these steps:

    -
      -
    1. Go to the CreateJMSProvider procedure.
    2. -
    3. Enter the following parameters:
    4. -
    - -

    - -
    - - -
    -

    DeleteJMSProvider

    - - -

    Deletes JMS Provider

    - - -

    This procedure deletes an existing JMS Provider.

    - - -

    DeleteJMSProvider Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    JMS Provider ScopeScope of the WebSphere messaging provider to be deleted.
    JMS Provider Administartive NameThe administrative name of JMS Provider to be deleted.
    - - - - -

    -

    Delete JMS Provider

    -

    To delete JMS Provider in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose DeleteJMSProvider from procedures - picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To delete JMS Provider in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the DeleteJMSProvider step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateJMSQueue

    - - -

    Creates or updates JMS Queues

    - - -

    This procedure creates a new JMS Queue or updates an existing JMS Queue.

    - - -

    CreateOrUpdateJMSQueue Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Queue ScopeScope of the messaging provider at which the JMS Queue is to be created.
    Queue Administrative NameThe administrative name assigned to this WebSphere MQ messaging provider queue.
    Queue NameName of the Queue.
    JNDI NameThe name used to bind this object into WebSphere Application Server JNDI.
    Queue Manager NameQueue manager that hosts the queue.
    Queue Administrative DescriptionAn administrative description assigned to queue.
    Additional Options - This parameter can be used to either override defaults or pass Custom Properties. - For example: -ccsid 1208 -readAhead YES -
    - - - - -

    -

    Create or update JMS Queue

    -

    To create or update JMS Queue in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateJMSQueue from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update JMS Queue in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateJMSQueue step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    DeleteJMSQueue

    - - -

    Deletes JMS Queues

    - - -

    This procedure deletes an existing JMS Queue.

    - - -

    DeleteJMSQueue Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Queue ScopeScope of the messaging provider at which the JMS Queue is to be deleted.
    Queue Administrative NameThe administrative name assigned to this WebSphere MQ messaging provider queue.
    - - - - -

    -

    Delete JMS Queue

    -

    To delete JMS Queue in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose DeleteJMSQueue from procedures - picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To delete JMS Queue in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the DeleteJMSQueue step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateJMSTopic

    - - -

    Creates or updates JMS Topics

    - - -

    This procedure creates a new JMS Topic or updates an existing JMS Topic.

    - - -

    CreateOrUpdateJMSTopic Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Topic ScopeScope of the messaging provider at which the JMS Topic is to be created.
    Topic Administrative NameThe administrative name assigned to this WebSphere MQ messaging provider Topic.
    Topic NameName of the Topic.
    JNDI NameThe name used to bind this object into WebSphere Application Server JNDI.
    Topic Administrative DescriptionAn administrative description assigned to Topic.
    Additional Options - This parameter can be used to either override defaults or pass Custom Properties. - For example: -readAhead YES -ccsid 1208 -
    - - - - -

    -

    Create or update JMS Topic

    -

    To create or update JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateJMSTopic from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateJMSTopic step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    DeleteJMSTopic

    - - -

    Deletes JMS Topics

    - - -

    This procedure deletes an existing JMS Topic.

    - - -

    DeleteJMSTopic Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Topic ScopeScope of the messaging provider at which the JMS Topic is to be deleted.
    Topic Administrative NameThe administrative name assigned to this WebSphere MQ messaging provider topic.
    - - - - -

    -

    Delete JMS Topic

    -

    To delete JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose DeleteJMSTopic from procedures - picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To delete JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the DeleteJMSTopic step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateSIBJMSActivationSpec

    - - -

    Creates or updates SIB JMS Activation Specs

    - - -

    This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec.

    - - -

    CreateOrUpdateSIBJMSActivationSpec Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Scope of the Activation SpecScope of the WebSphere Default messaging provider at which the Activation Spec is to be created.
    Activation Spec Administrative NameThe administrative name assigned to this Activation Spec.
    JNDI NameThe name and location used to bind this object into WebSphere Application Server JNDI.
    Destination JNDI NameThe JNDI name of the destination JMS queue or topic used by the message-driven bean.
    Activation Spec Administrative DescriptionAn Administrative description assigned to Activation Spec.
    Destination TypeAn option to determine whether the message_driven bean uses a JMS queue or a JMS topic.
    Message Selector - The JMS message selector used to determine which messages the message-driven bean receives. - The value is a string that is used to select a subset of the available messages. - The syntax is based on a subset of the SQL 92 conditional expression syntax, as described in the JMS specification. - Refer to the information center for more information. - The selector string can refer to fields in the JMS message header and fields in the message properties. - Message selectors cannot reference message body values. - A null value (an empty string) indicates that there is no message selector for the message consumer. -
    Additional OptionsUsed to either override defaults or pass Custom Properties.
    - - - - -

    -

    Create or update SIB JMS Activation Spec

    -

    To create or update JMS Activation Spec in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateSIBJMSActivationSpec step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateWMQJMSActivationSpec

    - - -

    Creates or updates WMQ JMS Activation Specs

    - - -

    This procedure creates a new JMS Activation Spec or updates an existing JMS Activation Spec.

    - - -

    CreateOrUpdateWMQJMSActivationSpec Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Scope of the Activation Spec - Scope of the WebSphere MQ messaging provider at which the Activation Spec is to be created. -
    Activation Spec Administrative NameThe administrative name assigned to this Activation Spec.
    JNDI NameThe name and location used to bind this object into WebSphere Application Server JNDI.
    Destination JNDI NameThe JNDI name of the destination JMS queue or topic used by the message-driven bean.
    Destination JNDI TypeThe type of the destination specified by "Destination JNDI Name" parameter.
    Activation Spec Administrative DescriptionAn Administrative Description assigned to Activation Spec.
    Client Channel Definition URLA URL to a client channel definition table to use, for this Activation Spec, when contacting WebSphere MQ.
    Client Channel Definition Queue ManagerA queue manager name, used to select one or more entries from a client channel definition table.
    Additional OptionsUsed to either override defaults or pass Custom Properties.
    - - - - -

    -

    Create or update WMQ JMS Activation Spec

    -

    To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update WMQ JMS Activation Spec in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateWMQJMSActivationSpec step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    DeleteJMSActivationSpec

    - - -

    Deletes JMS Activation Specs

    - - -

    This procedure deletes an existing JMS ActivationSpec.

    - - -

    DeleteJMSActivationSpec Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Scope of the Activation SpecScope of the messaging provider at which the JMS Activation Spec is to be deleted.
    Activation Spec Administrative NameThe administrative name assigned to this WebSphere MQ messaging provider Activation Spec.
    - - - - -

    -

    Delete JMS Activation Spec

    -

    To delete JMS Activation Spec in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures - picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    In the DeleteJMSActivationSpec step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - -

    To delete JMS Activation Spec in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the pipeline tasks click on "Update SIB JMS Activation Spec", then click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateSIBJMSConnectionFactory

    - - -

    Creates or updates SIB JMS Connection Factories

    - - -

    This procedure creates a new SIB JMS Connection Factory or updates an existing JMS Connection Factory.

    - - -

    CreateOrUpdateSIBJMSConnectionFactory Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Scope of the Connection Factory - Scope of the WebSphere Default messaging provider at which the Connection Factory is to be created. -
    Connection Factory Administrative Name - The administrative name assigned to this Connection Factory. -
    Bus NameName of the service integration bus to which connections are made.
    JNDI Name - The name and location used to bind this object into WebSphere Application Server JNDI. -
    Connection Factory Type - Type of Connection Factory to create. Should be one of Queue or Topic. - To create a generic connection factory, leave this parameter unset. - This parameter is being used only if Connection Factory is going to be created. - Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. -
    Connection Factory Administrative DescriptionAn Administrative Description assigned to Connection Factory.
    Additional OptionsUsed to either override defaults or pass Custom Properties.
    - - - - -

    -

    Create or update SIB JMS Connection Factory

    -

    To create or update SIB JMS Connection Factory in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateSIBJMSConnectionFactory step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    CreateOrUpdateWMQJMSConnectionFactory

    - - -

    Creates or updates WMQ JMS Connection Factories

    - - -

    This procedure creates a new WMQ JMS Connection Factory or updates an existing JMS Connection Factory.

    - - -

    CreateOrUpdateWMQJMSConnectionFactory Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Scope of the Connection Factory - Scope of the WebSphere MQ messaging provider at which the Connection Factory is to be created. -
    Connection Factory Administrative Name - The administrative name assigned to this Connection Factory. -
    Connection Factory Type - Use this parameter to determine whether a unified connection factory, a queue connection factory or a topic connection factory is to be created. - This needs to be one of the values from CF, QCF and TCF. Default is CF. - Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. -
    JNDI Name - The name and location used to bind this object into WebSphere Application Server JNDI. -
    Connection Factory Administrative DescriptionAn Administrative description assigned to Connection Factory.
    Client Channel Definition URL - A URL to a client channel definition table to use, for this Connection Factory, when contacting WebSphere MQ. -
    Client Channel Definition Queue ManagerA queue manager name, used to select one or more entries from a client channel definition table.
    Additional OptionsUsed to either override defaults or pass Custom Properties.
    - - - - -

    -

    Create or update WMQ JMS Connection Factory

    -

    To create or update WMQ JMS Connection Factory in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from - procedures picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To create or update JMS Topic in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the CreateOrUpdateWMQJMSConnectionFactory step, click the Log icon to see - the diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    DeleteJMSConnectionFactory

    - - -

    Deletes JMS Connection Factories

    - - -

    This procedure deletes an existing JMS ConnectionFactory.

    - - -

    DeleteJMSConnectionFactory Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Messaging System TypeThe name of the messaging provider. Pass in either WMQ or SIB.
    Scope of the Connection Factory - Scope of the WebSphere messaging provider at which the Connection Factory is to be deleted. -
    Connection Factory Administrative NameThe administrative name assigned to this Connection Factory.
    - - - - -

    -

    Delete JMS ConnectionFactory

    -

    To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures - picker.
    4. -
    5. Enter the following parameters:
    6. - -
    -

    After the job runs, you can view the results, including the following - job details:

    - -

    To delete JMS ConnectionFactory in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters: -

      -
    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. - -
    -

    After the pipeline runs, you can view the results, including the - following step details:

    - -

    In the DeleteJMSConnectionFactory step, click the Log icon to see the - diagnostic information. The output is similar to the following - diagnostic report.

    - - -

    - -
    - - -
    -

    DeployApp

    - - -

    Deploys an application using AdminApp.install

    - - -

    This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall.

    - - -

    DeployApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java Parameters Java options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'
    Application NameName of the web application to be deploy. i.e: 'webapp'.
    Application PathAbsolute path of the application to deploy. i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'.
    Additional CommandsAdditional commands to be entered for wsadmin.
    - - - - -

    -

    Deploying Applications

    -

    To deploy an application, do these steps:select the following - highlighted - step:

    -
      -
    1. Go to the DeployApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that the - application was deployed - successfully:

    -

    In the DeployApp step, click the Log icon to - see the diagnostic information. The output is similar to the - following diagnostic - report.

    - -

    - -
    - - -
    -

    DeployEnterpriseApp

    - - -

    Deploys an enterprise application using wsadmin tool

    - - -

    This procedure deploys java enterprise application (.EAR) or java web application (.WAR) on given targets. If application is already deployed, procedure updates application.

    - - -

    DeployEnterpriseApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameSpecifies logical name to be given to installing enterprise application. Do not include whitespaces in application name.
    Application Path - Absolute path of the application to deploy. Use "/" as the path separator on both linux and windows i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. -
    Target clusterName of the cluster on which to deploy enterprise application. Not required in WebSphere Base Edition. Enter either target cluster or target server(s).
    Target server(s)Specify single or list of standalone application servers on which to deploy enterprise application. Specify servers in the form Node=server. For e.g. Node01=Server1,Node02=Server2. Not required in WebSphere Base Edition.
    Map modules to serversSpecify deployment targets where you want to install the modules that are contained in your application. Modules can be installed on the same deployment target or dispersed among several deployment targets. Give input in format [ "Module1Name" Module1URL server1][ "Module2Name" Module2URL server2 ] E.g. [ "Increment EJB module" Increment.jar,META-INF/ejb-jar.xml WebSphere:cell=Cell01,node=Node01,server=singleServer ]
    Additional deployment parametersSpecify any additional options for AdminApp. Install object in case not listed in this input form. For more information about each of the supported arguments, refer to 'http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/rxml_taskoptions.html'.
    Directory to install applicationSpecifies the directory to which the enterprise archive (EAR) file will be installed. Default is profile_root/installedApps/cell_name/application_name.ear directory.
    Precompile JavaServer Pages files?Specify whether to precompile JavaServer Pages (JSP) files as a part of installation. The default is not to precompile JSP files.
    Distribute application?Specifies whether the product expands application binaries in the installation location during installation.
    Use binary configuration?Specifies whether the application server uses the binding, extensions, and deployment descriptors located with the application deployment - document, the deployment.xml file (default), or those located in the enterprise archive (EAR) file. Default is to use bindings located in deployment.xml.
    Deploy enterprise beans?Specifies whether the EJBDeploy tool runs during application installation. Default is false(true for EJB 3.0 modules).
    Create MBeans for resources?Specifies whether to create MBeans for resources such as servlets or JSP files within an application when the application starts. Default is create MBeans.
    Override class reloading settings for web and EJB modules?Specifies whether the product run time detects changes to application classes when the application is running. If yes, then on such changes application is stopped and restarted to reload updated classes.
    Deploy web services?Specifies whether to deploy web services. Default is do not enable Deploy web services.
    Process embedded configuration?Specifies whether the embedded configuration should be processed. An embedded configuration consists of files such as resource.xml, - variables.xml, and deployment.xml.
    Allow EJB reference targets to resolve automatically?Specifies whether the embedded configuration should be processed.
    Deploy client modules?Select if the file to deploy has one or more client modules and want to configure environment entries for the client modules. Default is do not enable Client Module.
    Validate schema?Specifies whether to validate the deployment descriptors against published Java EE deployment descriptor schemas.
    Synchronize active nodes?Specify whether to synchronize active nodes. Applicable only for Network Deployment installation. Enabled by default.
    Start application?Specify whether to start application or not. Enabled by default.
    Reload interval in secondsSpecifies the number of seconds to scan the application's file system for updated files. Default is 3 seconds.
    Validate resource referencesSpecifies whether websphere examines the application references specified during application installation or updating and, if validation is - enabled, warns you of incorrect references or fails the operation.
    File permissionSpecifies access permissions for application binaries.
    Customized file permissionProvide custom file permissions if not listed in File permissions drop down.
    Business level application nameSpecifies whether websphere creates a new business-level application with the enterprise application that you are installing or makes the enterprise application a composition unit of an existing business-level application. The default is to create a new business-level application.
    Client deployment modeSpecifies whether to deploy client modules to an isolated deployment target (Isolated), a federated node of a deployment manager (Federated), - or an application server (Server Deployed). Default is Isolated
    Wsadmin CommandsCommands to be entered to wsadmin. Use one command per line.
    Wsadmin ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'.
    Wsadmin Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    Wsadmin Additional ArgumentsAdditional arguements to be passed to wsadmin.
    Context rootApplicable only to web applications (WAR). -Specifies the context root of the web application (WAR). -A context root for each web module is defined in the application deployment descriptor during application assembly. Use this field to assign a different context root to a web module. The context root is combined with the defined servlet mapping (from the WAR file) to compose the full URL that users type to access the servlet. For example, if the context root is /gettingstarted and the servlet mapping is MySession, then the URL is http://host:port/gettingstarted/MySession.
    - - - - -

    -

    Deploy Enterprise Application

    -

    To deploy an enterprise application, do these steps:

    -
      -
    1. Go to the DeployEnterpriseApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - enterprise application is deployed successfully:

    - -

    In the DeployEnterpriseApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    DeployOSGiApp

    - - -

    Deploy OSGi application using the wsadmin tool

    - - -

    This procedure deploys the OSGi application.It optionally configures external OSGi bundle library if the application to be deployed reference bundles that are stored in an external bundle repository. This procedure can also add the bundles to internal bundle repository, if required.

    - - -

    DeployOSGiApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Want to add external bundle repository?If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required.
    External Bundle Repository NameName of the external bundle repository to configure.
    External Bundle Repository URLURL of the external bundle repository to configure.
    List of bundles to add to local repositoryComma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar
    EBA file PathAbsolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'.
    Application NameName to be given to newly deployed OSGi application.
    Target Deployment UnitDeployment Unit on which to deploy the OSGi application. For e.g cluster=cluster1 or node=node01,server=server1
    - - - - -

    -

    Deploy OSGi Application

    -

    To deploy an OSGi application, do these steps:

    -
      -
    1. Go to the DeployOSGiApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - OSGi application is deployed successfully:

    - -

    In the DeployOSGi step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    UndeployApp

    - - -

    Undeploys an application using AdminApp.uninstall

    - - -

    This procedure undeploys an application using a Jython script and invoking AdminApp.uninstall.

    - - -

    UndeployApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the application to undeploy. i.e: 'webapp'.
    CommandsCommands to be entered to wsadmin. Use one command per line.
    Java ParametersJava options to be passed to wsadmin, separate them using semicolons (;).
    ClasspathJars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'
    Additional CommandsAdditional commands to be entered for wsadmin.
    - - - - -

    -

    Undeploying Applications

    -

    To undeploy an application, do these steps:

    -
      -

      Go to the UndeployApp procedure.

      -

      Enter the following parameters:

      -
    -

    After the job runs, you can view the results, including the following job details, which show that - the application was undeployed - successfully:

    -

    In the UndeployApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - -

    - -
    - - -
    -

    UpdateApp

    - - -

    Updates existing application

    - - -

    This procedure updates already deployed application in units of files, modules or entire application.

    - - -

    UpdateApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the web application to be updated. i.e: 'webapp'.
    Content TypeSpecifies to type of content to update. Use File option for updating a single file, Partial Application option for updating application partially, Module option to add/update a module to the deployed application, Application option for updating the entire deployed application.
    OperationSpecifies to type of operation to perform as part of update procedure. Use Add option to add new content, Update option to update existing content, AddUpdate option to add content and to replace if already exist, Delete option to remove existing content respectively.
    ContentSpecifies the file that contains the content that you want to update. For example, depending on the content type, the file could be an EAR file, a module, a partial zip, or a single file.Not required for Delete operation.
    Content URIThe relative path beginning with the installed application archive file to the file to be replaced or added. For example, if the file is located at com/company/greeting.class in module hello.jar, specify hello.jar/com/company/greeting.class for the relative path
    Cluster NameName of the cluster on which application is deployed.
    Server NameName of the server on which application is deployed.
    Additional ParametersAdditional parameters to pass while updating entire application or module/s, if required. For e.g. -nodeployejb, -BindJndiForEJBNonMessageBinding etc.
    - - - - -

    -

    Update Application

    -

    To update application , do these steps:

    -
      -
    1. Go to the UpdateApp procedure.
    2. -
    3. Enter the following parameters:
    4. -
    -

    After the job runs, you can view the results, including the following job details, which show that - WSDL files are published successfully:

    - -

    In the UpdateApp step, click the Log icon - to see the diagnostic information. The output is similar to - the following diagnostic - report.

    - - -

    - -
    - - -
    -

    CheckApp

    - - -

    Checks if a web application is ready

    - - -

    This procedure checks if a web application is ready by using a Jython script.

    - - -

    CheckApp Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin Absolute PathAbsolute path of wsadmin, including filename and extension. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Application NameName of the web application to be checked. i.e: 'webapp'.
    Application State Checked - Application State that is being checked, with any applicable retries based on wait time parameter. - Any state that is not the desired state after any applicable retries, will be returned as a failure by the procedure. -
    Wait TimeMaximum duration of check application state retries.
    - - - - -

    -

    Checking Application State

    -

    To check Application State, do these steps:

    -
      -
    1. Create procedure.
    2. -
    3. Create step, choose Plugin, choose CheckApp from procedures picker.
    4. -
    5. Enter the following parameters:
    6. -
    -

    After the job runs, you can view the results, including the following job details:

    - -

    To check Application State in CloudBees CD interface, do these steps:

    -
      -
    1. Create Pipeline.
    2. -
    3. Create task.
    4. -
    5. In task definition choose Plugin and choose following parameters:

    6. -
    7. Click on arrow.
    8. -
    9. Enter the following parameters:
    10. -
    -

    After the pipeline runs, you can view the results, including the following step details:

    - -

    In the CheckApp step, click the Log icon -to see the diagnostic information. The output is similar to -the following diagnostic -report.

    - - -

    - -
    - - -
    -

    CheckNodeStatus

    - - -

    (Applicable only for WebSphere Network Deployment installation.) -

    - - - -

    Checks Node Status.

    - - -

    This procedure checks WebSphere node status. It checks Node Agent and all servers associated with node by it's name.

    - - -

    CheckNodeStatus Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Wsadmin PathPath to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'.
    Name of the NodeName of the Node, which should be checked.
    Success CriteriaConditions that must be met for successful completion of the procedure.
    - - - - -
    - - -
    -

    CheckPageStatus

    - - -

    Check the status of a page on a given URL

    - - -

    This procedure checks the status of the page with the specified URL.

    - - -

    CheckPageStatus Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Credentials to be enteredThe credentials needed to check the status of the page.
    Target URLURL of the page to be checked.
    Maximum Elapsed TimeDefines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time).
    Success CriteriaIndicates the expected correct result to be obtained when running checking the server.
    - - - - -

    -

    Checking the Status of a Page

    -

    To check the status of page at a specific URL, do the following steps:

    -
      -
    1. Enter the following parameters:
    2. - -
    3. Click Run.
    4. -
    -

    After the job runs, you can view the results, including the following job details, - which show that the criteria was reached:

    - -

    In the CheckPageStatus step, click the Log - icon to see the diagnostic info. The output is similar - to the following diagnostic - report.

    - -

    - -
    - - -
    -

    CheckServerStatus

    - - -

    Check the status of the given server URL

    - - -

    This procedure checks the status of the specified server URL.

    - - -

    CheckServerStatus Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameName of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    Maximum Elapsed TimeDefines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time).
    Success CriteriaIndicates the expected correct result to be obtained when running checking the server.
    - - - - -

    - - -

    - -
    - - -
    -

    Discover

    - - -

    Discover WebSphere instance configuration on a resources or environment

    - - -

    Discover Parameters

    - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    Configuration NameThe plugin's configuration name.
    Resource NamesList of resources, on which discovery procedure should run. Enter multiple values on separate lines.
    - - - - -
    - - - - - - - - - - - - - - -

    Release Notes

    - -

    @PLUGIN_KEY@ 3.8.0

    -
      - -
    • Add checking connection while creating a configuration.
    • - -
    • Jobs for the successful "CreateConfiguration" and "EditConfiguration" run is now preserved.
    • - -
    • Add logging while running "CreateConfiguration".
    • - -
    - -

    @PLUGIN_KEY@ 2.7.1

    -
      - -
    • Rebranding from "CloudBees Flow" to "CloudBees CD".
    • - -
    - -

    @PLUGIN_KEY@ 2.7.0

    -
      - -
    • Preserve time limit settings after upgrade.
    • - -
    - -

    @PLUGIN_KEY@ 2.6.3

    -
      - -
    • Renaming from "Electric Cloud" to "CloudBees".
    • - -
    - -

    @PLUGIN_KEY@ 2.6.2

    -
      - -
    • Configurations can be created by users with "@" sign in a name.
    • - -
    - -

    @PLUGIN_KEY@ 2.6.1

    -
      - -
    • The plugin icon has been updated.
    • - -
    - -

    @PLUGIN_KEY@ 2.6.0

    - - -

    @PLUGIN_KEY@ 2.5.0

    - - -

    @PLUGIN_KEY@ 2.4.1

    -
      - -
    • Configured the plugin to allow the ElectricFlow UI to create configs inline of procedure form.
    • - -
    - -

    @PLUGIN_KEY@ 2.4.0

    - - -

    @PLUGIN_KEY@ 2.3.1

    -
      - -
    • Help links have been updated for DeleteJMSTopic and DeleteJMSQueue procedures.
    • - -
    • Configured the plugin to allow the ElectricFlow UI to render the plugin procedure parameters entirely using the configured form XMLs.
    • - -
    • Enabled the plugin for managing the plugin configurations in-line when defining an application process step or a pipeline stage task.
    • - -
    - -

    @PLUGIN_KEY@ 2.3.0

    - - -

    @PLUGIN_KEY@ 2.2.4

    -
      - -
    • Documentation has been improved.
    • - -
    • Cluster Scope field has been added to CreateJDBCProvider procedure.
    • - -
    - -

    @PLUGIN_KEY@ 2.2.3

    -
      - -
    • Added support of parallel execution for all plugin procedures.
    • - -
    • Added "Context root" parameter for Deploy Enterprise Application procedure.
    • - -
    • Bug fixes in CheckPageStatus procedure.
    • - -
    • Added warning instead of stack trace in the Stop/StartApp procedures if app was already stoped or started.
    • - -
    - -

    @PLUGIN_KEY@ 2.2.2

    -
      - -
    • Added new procedures - SyncNodes, CheckNodeStatus.
    • - -
    • Added following optional parameters to DeployEnterpriseApplication procedure: -
        -
      • "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default.
      • -
      • "Start application": Start the deployed application after deploying the application. Enabled by default.
      • -
      -
    • - -
    • Changed default value for "Distribute application" from unchecked to checked. (Deploy Enterprise Application procedure).
    • - -
    - -

    @PLUGIN_KEY@ 2.2.1

    -
      - -
    • Added new procedures - StartCluster, StopCluster, MapSharedLibrary, ModifyApplicationClassLoader.
    • - -
    • DeployEnterpriseApp procedure will now update the application if it is already deployed. This procedure was refactored.
    • - -
    • Added debugging in DeployEnterpriseApp procedure.
    • - -
    • Bug fixes in DeployEnterpriseApplication procedure on WASND 8.5.5 Windows platform.
    • - -
    • Bug fixes in UpdateApp procedure on WAS 8.5 and WASND 8.5.5 Windows platform.
    • - -
    • Added application name to step log when ModifyApplicationClassLoader procedure fails to find application.
    • - -
    • Added debug flag to plugin configurations.
    • - -
    - -

    @PLUGIN_KEY@ 2.2.0

    -
      - -
    • Added suport for discovering WebSphere configuraiton on ElectricFlow resource.
    • - -
    • Moved 'Connection Type' parameter for all plugin procedures to plugin's configuration.
    • - -
    • Added 'Cluster Name' and 'Server Name' optional parameter to 'Start Application' and 'Stop Application' procedures.
    • - -
    - -

    @PLUGIN_KEY@ 2.1.2

    -
      - -
    • Fixed issue with configurations being cached for IE.
    • - -
    - -

    @PLUGIN_KEY@ 2.1.1

    -
      - -
    • Added link to plugin Configuration Page in plugin step panels.
    • - -
    - -

    @PLUGIN_KEY@ 2.1.0

    -
      - -
    • Added support for WebSphere Network Deployment 8.5
    • - -
    • Added support to create a cluster, add application servers to it, deploy applications in the cluster, remove cluster members, and delete the cluster.
    • - -
    • Added support to deploy Java enterprise applications (EARs) and web archives (WARs).
    • - -
    • Added support to update deployed applications.
    • - -
    • Added support to deploy OSGi applications and to configure external and internal bundle repositories.
    • - -
    • Added support to configure session management component for deployed applications.
    • - -
    • Added support for setting the EJB container properties for improved memory consumption and stateful session bean failover.
    • - -
    • Added support for the JavaMail session.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.6

    -
      - -
    • Fixed the DeployApp procedure to not include the password in the log file.
    • - -
    • Fixed the problem about attaching credentials in the CheckApp procedure.
    • - -
    • Fixed the problem where the wsadmin password appeared when you view job step log files and property information.
    • - -
    • Fixed instructions to create WebSphere plugin configurations.
    • - -
    • Fixed instructions to access plugins in ElectricFlow.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.5

    -
      - -
    • Fix minor bugs.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.4

    -
      - -
    • [Add four new procedures:CreateDatasources, DeleteDatasources, CreateJDBCProviders, and DeleteJDBCProviders.]
    • - -
    • Fix minor bugs.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.3

    -
      - -
    • Change the procedure names in the step picker section.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.2

    -
      - -
    • Make improvements to the help document.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.1

    -
      - -
    • Features and Enhancements in EC-WebSphere 2.0.1.
    • - -
    • Use the new Parameter Form XML.
    • - -
    • Add a link directly to the new help document.
    • - -
    - -

    @PLUGIN_KEY@ 2.0.0

    -
      - -
    • Use the new help page format.
    • - -
    • Add new parameter panels for each procedure.
    • - -
    - -

    @PLUGIN_KEY@ 1.3.0

    -
      - -
    • Add the CheckPageStatus procedure.
    • - -
    • Remove the CURL dependency from the CheckServerStatus procedure.
    • - -
    • Fix minor bugs.
    • - -
    • The procedures now have only one step using ec-perl to execute the necessary commands.
    • - -
    - -

    @PLUGIN_KEY@ 1.2.1

    -
      - -
    • Fix a minor bug on the Configuration List page.
    • - -
    - -

    @PLUGIN_KEY@ 1.2.0

    -
      - -
    • Add the StartApp, StopApp, DeployApp, and UndeployApp procedures.
    • - -
    - -

    @PLUGIN_KEY@ 1.1.1

    -
      - -
    • Jython commands can now be entered manually in the RunCustomJob procedure.
    • - -
    • The absolute path of executable files now requires the path and filename with an extension.
    • - -
    - -

    @PLUGIN_KEY@ 1.1.0

    -
      - -
    • RunCustomJob procedure has been added.
    • - -
    - - - + + + + + @PLUGIN_KEY@ + + + +
    +

    @PLUGIN_KEY@

    +

    + Version @PLUGIN_VERSION@ +

    +

    + Documentation for this plugin is now available here. +

    +
    + + diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index dbcc0ced..75fac5d9 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -34,4 +34,5 @@ +true diff --git a/src/main/resources/project/parameterForms/CheckApp.xml b/src/main/resources/project/parameterForms/CheckApp.xml index 0421d6de..96616d2f 100644 --- a/src/main/resources/project/parameterForms/CheckApp.xml +++ b/src/main/resources/project/parameterForms/CheckApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CheckApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CheckApp entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CheckNodeStatus.xml b/src/main/resources/project/parameterForms/CheckNodeStatus.xml index cf303f56..ef75345f 100644 --- a/src/main/resources/project/parameterForms/CheckNodeStatus.xml +++ b/src/main/resources/project/parameterForms/CheckNodeStatus.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CheckNodeStatus + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CheckNodeStatus entry @@ -25,7 +25,7 @@ configurationName Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. /plugins/@PLUGIN_NAME@/project/websphere_cfgs 1
    diff --git a/src/main/resources/project/parameterForms/CheckPageStatus.xml b/src/main/resources/project/parameterForms/CheckPageStatus.xml index 128e8139..245801fb 100644 --- a/src/main/resources/project/parameterForms/CheckPageStatus.xml +++ b/src/main/resources/project/parameterForms/CheckPageStatus.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CheckPageStatus + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CheckPageStatus credential diff --git a/src/main/resources/project/parameterForms/CheckServerStatus.xml b/src/main/resources/project/parameterForms/CheckServerStatus.xml index cb17a771..af8ff095 100644 --- a/src/main/resources/project/parameterForms/CheckServerStatus.xml +++ b/src/main/resources/project/parameterForms/CheckServerStatus.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CheckServerStatus + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CheckServerStatus entry @@ -27,7 +27,7 @@ /plugins/@PLUGIN_NAME@/project/websphere_cfgs 1 Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.
    entry diff --git a/src/main/resources/project/parameterForms/Cluster/CreateCluster.xml b/src/main/resources/project/parameterForms/Cluster/CreateCluster.xml index a86ef8d1..98bfb4dd 100644 --- a/src/main/resources/project/parameterForms/Cluster/CreateCluster.xml +++ b/src/main/resources/project/parameterForms/Cluster/CreateCluster.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateCluster + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateCluster entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/CreateClusterMembers.xml b/src/main/resources/project/parameterForms/Cluster/CreateClusterMembers.xml index e5baae5a..2de69565 100644 --- a/src/main/resources/project/parameterForms/Cluster/CreateClusterMembers.xml +++ b/src/main/resources/project/parameterForms/Cluster/CreateClusterMembers.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateClusterMembers + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateClusterMembers entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/CreateFirstClusterMember.xml b/src/main/resources/project/parameterForms/Cluster/CreateFirstClusterMember.xml index 2454d906..c2fcd0c8 100644 --- a/src/main/resources/project/parameterForms/Cluster/CreateFirstClusterMember.xml +++ b/src/main/resources/project/parameterForms/Cluster/CreateFirstClusterMember.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateFirstClusterMember + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateFirstClusterMember entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/DeleteCluster.xml b/src/main/resources/project/parameterForms/Cluster/DeleteCluster.xml index 4e31f30d..895267ba 100644 --- a/src/main/resources/project/parameterForms/Cluster/DeleteCluster.xml +++ b/src/main/resources/project/parameterForms/Cluster/DeleteCluster.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteCluster + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteCluster entry @@ -31,7 +31,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/ListClusterMembers.xml b/src/main/resources/project/parameterForms/Cluster/ListClusterMembers.xml index 78f9fee5..328cbff7 100644 --- a/src/main/resources/project/parameterForms/Cluster/ListClusterMembers.xml +++ b/src/main/resources/project/parameterForms/Cluster/ListClusterMembers.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ListClusterMembers + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ListClusterMembers entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/RemoveClusterMembers.xml b/src/main/resources/project/parameterForms/Cluster/RemoveClusterMembers.xml index 1994109a..a8c8c37a 100644 --- a/src/main/resources/project/parameterForms/Cluster/RemoveClusterMembers.xml +++ b/src/main/resources/project/parameterForms/Cluster/RemoveClusterMembers.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#RemoveClusterMembers + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#RemoveClusterMembers entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/StartCluster.xml b/src/main/resources/project/parameterForms/Cluster/StartCluster.xml index 450a2937..08c8e3be 100644 --- a/src/main/resources/project/parameterForms/Cluster/StartCluster.xml +++ b/src/main/resources/project/parameterForms/Cluster/StartCluster.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartCluster + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartCluster entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Cluster/StopCluster.xml b/src/main/resources/project/parameterForms/Cluster/StopCluster.xml index 68f24ae1..6dc67f66 100644 --- a/src/main/resources/project/parameterForms/Cluster/StopCluster.xml +++ b/src/main/resources/project/parameterForms/Cluster/StopCluster.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopCluster + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopCluster entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/ConfigureEJBContainer.xml b/src/main/resources/project/parameterForms/ConfigureEJBContainer.xml index f3523e71..783ae2f2 100644 --- a/src/main/resources/project/parameterForms/ConfigureEJBContainer.xml +++ b/src/main/resources/project/parameterForms/ConfigureEJBContainer.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ConfigEJBContainer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ConfigEJBContainer entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/ConfigureSessionManagement.xml b/src/main/resources/project/parameterForms/ConfigureSessionManagement.xml index 941ac107..2663d728 100644 --- a/src/main/resources/project/parameterForms/ConfigureSessionManagement.xml +++ b/src/main/resources/project/parameterForms/ConfigureSessionManagement.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ConfigureSession + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ConfigureSession entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CreateDatasource.xml b/src/main/resources/project/parameterForms/CreateDatasource.xml index 5298bd11..a23de511 100644 --- a/src/main/resources/project/parameterForms/CreateDatasource.xml +++ b/src/main/resources/project/parameterForms/CreateDatasource.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateDatasource + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateDatasource entry @@ -31,7 +31,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CreateEndToEndMailProvider.xml b/src/main/resources/project/parameterForms/CreateEndToEndMailProvider.xml index 137d5d21..a356d610 100644 --- a/src/main/resources/project/parameterForms/CreateEndToEndMailProvider.xml +++ b/src/main/resources/project/parameterForms/CreateEndToEndMailProvider.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateEndToEndMailProvider + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateEndToEndMailProvider entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CreateJDBCProvider.xml b/src/main/resources/project/parameterForms/CreateJDBCProvider.xml index a108c566..c4564ef5 100644 --- a/src/main/resources/project/parameterForms/CreateJDBCProvider.xml +++ b/src/main/resources/project/parameterForms/CreateJDBCProvider.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateJDBCProvider + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateJDBCProvider entry @@ -31,7 +31,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CreateJMSProvider.xml b/src/main/resources/project/parameterForms/CreateJMSProvider.xml index 7fd4e054..8c01d09b 100644 --- a/src/main/resources/project/parameterForms/CreateJMSProvider.xml +++ b/src/main/resources/project/parameterForms/CreateJMSProvider.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateJMSProvider + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateJMSProvider entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/CreateMailSession.xml b/src/main/resources/project/parameterForms/CreateMailSession.xml index 94600ac8..7171eb63 100644 --- a/src/main/resources/project/parameterForms/CreateMailSession.xml +++ b/src/main/resources/project/parameterForms/CreateMailSession.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateMailSession + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateMailSession entry @@ -26,7 +26,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/DeleteDatasource.xml b/src/main/resources/project/parameterForms/DeleteDatasource.xml index 5294734d..30baae1a 100644 --- a/src/main/resources/project/parameterForms/DeleteDatasource.xml +++ b/src/main/resources/project/parameterForms/DeleteDatasource.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteDatasource + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteDatasource entry @@ -31,7 +31,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/DeleteJDBCProvider.xml b/src/main/resources/project/parameterForms/DeleteJDBCProvider.xml index a03fa2e3..947cfefd 100644 --- a/src/main/resources/project/parameterForms/DeleteJDBCProvider.xml +++ b/src/main/resources/project/parameterForms/DeleteJDBCProvider.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJDBCProvider + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJDBCProvider entry @@ -31,7 +31,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/DeployApp.xml b/src/main/resources/project/parameterForms/DeployApp.xml index 5ae7c844..c8dd722b 100644 --- a/src/main/resources/project/parameterForms/DeployApp.xml +++ b/src/main/resources/project/parameterForms/DeployApp.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeployApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeployApp entry @@ -32,7 +32,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/DeployEnterpriseApp.xml b/src/main/resources/project/parameterForms/DeployEnterpriseApp.xml index 71dd087e..ce3e8574 100644 --- a/src/main/resources/project/parameterForms/DeployEnterpriseApp.xml +++ b/src/main/resources/project/parameterForms/DeployEnterpriseApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeployEnterpriseApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeployEnterpriseApp entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/DeployOSGi.xml b/src/main/resources/project/parameterForms/DeployOSGi.xml index 145fe8eb..b1caee25 100644 --- a/src/main/resources/project/parameterForms/DeployOSGi.xml +++ b/src/main/resources/project/parameterForms/DeployOSGi.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeployOSGi + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeployOSGi entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSQueue.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSQueue.xml index 68d9ce85..476d2d73 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSQueue.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSQueue.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateJMSQueue + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateJMSQueue entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSTopic.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSTopic.xml index bdd2baf8..f16c456d 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSTopic.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateJMSTopic.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateJMSTopic + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateJMSTopic entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSActivationSpec.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSActivationSpec.xml index c2804ca0..dc14b50b 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSActivationSpec.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSActivationSpec.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateSIBJMSActivationSpec + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateSIBJMSActivationSpec entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSConnectionFactory.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSConnectionFactory.xml index 6fc66ee1..c0fadd6e 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSConnectionFactory.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateSIBJMSConnectionFactory.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateSIBJMSConnectionFactory + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateSIBJMSConnectionFactory entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSActivationSpec.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSActivationSpec.xml index 260f37ea..2089b416 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSActivationSpec.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSActivationSpec.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateWMQJMSActivationSpec + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateWMQJMSActivationSpec entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSConnectionFactory.xml b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSConnectionFactory.xml index 06d99b1d..576c34f6 100644 --- a/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSConnectionFactory.xml +++ b/src/main/resources/project/parameterForms/JMS/CreateOrUpdateWMQJMSConnectionFactory.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateOrUpdateWMQJMSConnectionFactory + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateOrUpdateWMQJMSConnectionFactory entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/DeleteJMSActivationSpec.xml b/src/main/resources/project/parameterForms/JMS/DeleteJMSActivationSpec.xml index 7e026e97..2f39ec65 100644 --- a/src/main/resources/project/parameterForms/JMS/DeleteJMSActivationSpec.xml +++ b/src/main/resources/project/parameterForms/JMS/DeleteJMSActivationSpec.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJMSActivationSpec + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJMSActivationSpec entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/DeleteJMSConnectionFactory.xml b/src/main/resources/project/parameterForms/JMS/DeleteJMSConnectionFactory.xml index b230768e..4049b7c7 100644 --- a/src/main/resources/project/parameterForms/JMS/DeleteJMSConnectionFactory.xml +++ b/src/main/resources/project/parameterForms/JMS/DeleteJMSConnectionFactory.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJMSConnectionFactory + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJMSConnectionFactory entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/DeleteJMSProvider.xml b/src/main/resources/project/parameterForms/JMS/DeleteJMSProvider.xml index 710579c1..5d588ac8 100644 --- a/src/main/resources/project/parameterForms/JMS/DeleteJMSProvider.xml +++ b/src/main/resources/project/parameterForms/JMS/DeleteJMSProvider.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJMSProvider + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJMSProvider entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/DeleteJMSQueue.xml b/src/main/resources/project/parameterForms/JMS/DeleteJMSQueue.xml index 1a8297f9..8cf99173 100644 --- a/src/main/resources/project/parameterForms/JMS/DeleteJMSQueue.xml +++ b/src/main/resources/project/parameterForms/JMS/DeleteJMSQueue.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJMSQueue + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJMSQueue entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/JMS/DeleteJMSTopic.xml b/src/main/resources/project/parameterForms/JMS/DeleteJMSTopic.xml index 0686f5d5..e228ee61 100644 --- a/src/main/resources/project/parameterForms/JMS/DeleteJMSTopic.xml +++ b/src/main/resources/project/parameterForms/JMS/DeleteJMSTopic.xml @@ -17,7 +17,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteJMSTopic + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteJMSTopic entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Management/StartDeploymentManager.xml b/src/main/resources/project/parameterForms/Management/StartDeploymentManager.xml index e77dd36d..be0bcdca 100644 --- a/src/main/resources/project/parameterForms/Management/StartDeploymentManager.xml +++ b/src/main/resources/project/parameterForms/Management/StartDeploymentManager.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartDeploymentManager + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartDeploymentManager entry @@ -27,7 +27,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Management/StartNode.xml b/src/main/resources/project/parameterForms/Management/StartNode.xml index 8467e6a9..cf9faeff 100644 --- a/src/main/resources/project/parameterForms/Management/StartNode.xml +++ b/src/main/resources/project/parameterForms/Management/StartNode.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartNode + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartNode entry @@ -27,7 +27,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Management/StopDeploymentManager.xml b/src/main/resources/project/parameterForms/Management/StopDeploymentManager.xml index 2eb6057b..f4dace5b 100644 --- a/src/main/resources/project/parameterForms/Management/StopDeploymentManager.xml +++ b/src/main/resources/project/parameterForms/Management/StopDeploymentManager.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopDeploymentManager + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopDeploymentManager entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Management/StopNode.xml b/src/main/resources/project/parameterForms/Management/StopNode.xml index 19dced9d..04395a42 100644 --- a/src/main/resources/project/parameterForms/Management/StopNode.xml +++ b/src/main/resources/project/parameterForms/Management/StopNode.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopNode + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopNode entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/MapSharedLibrary.xml b/src/main/resources/project/parameterForms/MapSharedLibrary.xml index 71c8aea5..be8fcb62 100644 --- a/src/main/resources/project/parameterForms/MapSharedLibrary.xml +++ b/src/main/resources/project/parameterForms/MapSharedLibrary.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#MapSharedLibrary + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#MapSharedLibrary entry @@ -25,7 +25,7 @@ configurationName Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. /plugins/@PLUGIN_NAME@/project/websphere_cfgs 1
    diff --git a/src/main/resources/project/parameterForms/ModifyApplicationClassLoader.xml b/src/main/resources/project/parameterForms/ModifyApplicationClassLoader.xml index 7a761208..af625920 100644 --- a/src/main/resources/project/parameterForms/ModifyApplicationClassLoader.xml +++ b/src/main/resources/project/parameterForms/ModifyApplicationClassLoader.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ModifyApplicationClassLoader + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ModifyApplicationClassLoader entry @@ -25,7 +25,7 @@ configurationName Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. /plugins/@PLUGIN_NAME@/project/websphere_cfgs 1
    diff --git a/src/main/resources/project/parameterForms/PublishWSDL.xml b/src/main/resources/project/parameterForms/PublishWSDL.xml index 81d06bc0..9c6d8c15 100644 --- a/src/main/resources/project/parameterForms/PublishWSDL.xml +++ b/src/main/resources/project/parameterForms/PublishWSDL.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#PublishWSDL + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#PublishWSDL entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/RunCustomJob.xml b/src/main/resources/project/parameterForms/RunCustomJob.xml index 12e2f780..418b61c3 100644 --- a/src/main/resources/project/parameterForms/RunCustomJob.xml +++ b/src/main/resources/project/parameterForms/RunCustomJob.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#RunCustomJob + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#RunCustomJob entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 0
    diff --git a/src/main/resources/project/parameterForms/Server/CreateApplicationServer.xml b/src/main/resources/project/parameterForms/Server/CreateApplicationServer.xml index 794ce0eb..e5d17d72 100644 --- a/src/main/resources/project/parameterForms/Server/CreateApplicationServer.xml +++ b/src/main/resources/project/parameterForms/Server/CreateApplicationServer.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateApplicationServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateApplicationServer entry @@ -27,7 +27,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/CreateApplicationServerTemplate.xml b/src/main/resources/project/parameterForms/Server/CreateApplicationServerTemplate.xml index b1bcedf2..e824028c 100644 --- a/src/main/resources/project/parameterForms/Server/CreateApplicationServerTemplate.xml +++ b/src/main/resources/project/parameterForms/Server/CreateApplicationServerTemplate.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#CreateApplicationServerTemplate + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#CreateApplicationServerTemplate entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/DeleteApplicationServer.xml b/src/main/resources/project/parameterForms/Server/DeleteApplicationServer.xml index bd294735..11ebe163 100644 --- a/src/main/resources/project/parameterForms/Server/DeleteApplicationServer.xml +++ b/src/main/resources/project/parameterForms/Server/DeleteApplicationServer.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteApplicationServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteApplicationServer entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/DeleteApplicationServerTemplate.xml b/src/main/resources/project/parameterForms/Server/DeleteApplicationServerTemplate.xml index 5639eea7..dd92fea3 100644 --- a/src/main/resources/project/parameterForms/Server/DeleteApplicationServerTemplate.xml +++ b/src/main/resources/project/parameterForms/Server/DeleteApplicationServerTemplate.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#DeleteApplicationServerTemplate + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#DeleteApplicationServerTemplate entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/ExportApplicationServer.xml b/src/main/resources/project/parameterForms/Server/ExportApplicationServer.xml index 59513b39..6a72f39b 100644 --- a/src/main/resources/project/parameterForms/Server/ExportApplicationServer.xml +++ b/src/main/resources/project/parameterForms/Server/ExportApplicationServer.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ExportApplicationServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ExportApplicationServer entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/ImportApplicationServer.xml b/src/main/resources/project/parameterForms/Server/ImportApplicationServer.xml index 1396c02b..744a191c 100644 --- a/src/main/resources/project/parameterForms/Server/ImportApplicationServer.xml +++ b/src/main/resources/project/parameterForms/Server/ImportApplicationServer.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#ImportApplicationServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#ImportApplicationServer entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/StartApplicationServers.xml b/src/main/resources/project/parameterForms/Server/StartApplicationServers.xml index 693c5def..68c617d2 100644 --- a/src/main/resources/project/parameterForms/Server/StartApplicationServers.xml +++ b/src/main/resources/project/parameterForms/Server/StartApplicationServers.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartApplicationServers + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartApplicationServers entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/Server/StopApplicationServers.xml b/src/main/resources/project/parameterForms/Server/StopApplicationServers.xml index 631c2c2a..282929c6 100644 --- a/src/main/resources/project/parameterForms/Server/StopApplicationServers.xml +++ b/src/main/resources/project/parameterForms/Server/StopApplicationServers.xml @@ -16,7 +16,7 @@ limitations under the License. --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopApplicationServers + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopApplicationServers entry @@ -26,7 +26,7 @@ limitations under the License. configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/StartApp.xml b/src/main/resources/project/parameterForms/StartApp.xml index 4a14ad53..825edf86 100644 --- a/src/main/resources/project/parameterForms/StartApp.xml +++ b/src/main/resources/project/parameterForms/StartApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartApp entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 0
    diff --git a/src/main/resources/project/parameterForms/StartServer.xml b/src/main/resources/project/parameterForms/StartServer.xml index cdd9c8a2..677e9bf4 100644 --- a/src/main/resources/project/parameterForms/StartServer.xml +++ b/src/main/resources/project/parameterForms/StartServer.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StartServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StartServer entry diff --git a/src/main/resources/project/parameterForms/StopApp.xml b/src/main/resources/project/parameterForms/StopApp.xml index ad7d69d4..69f84cfd 100644 --- a/src/main/resources/project/parameterForms/StopApp.xml +++ b/src/main/resources/project/parameterForms/StopApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopApp entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 0
    diff --git a/src/main/resources/project/parameterForms/StopServer.xml b/src/main/resources/project/parameterForms/StopServer.xml index 7ad92e2b..b71502b5 100644 --- a/src/main/resources/project/parameterForms/StopServer.xml +++ b/src/main/resources/project/parameterForms/StopServer.xml @@ -21,7 +21,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#StopServer + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#StopServer entry @@ -32,7 +32,7 @@ /plugins/@PLUGIN_NAME@/project/websphere_cfgs 0 Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.
    diff --git a/src/main/resources/project/parameterForms/SyncNodes.xml b/src/main/resources/project/parameterForms/SyncNodes.xml index b813193f..c21c5430 100644 --- a/src/main/resources/project/parameterForms/SyncNodes.xml +++ b/src/main/resources/project/parameterForms/SyncNodes.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#SyncNodes + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#SyncNodes entry @@ -25,7 +25,7 @@ configurationName Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. /plugins/@PLUGIN_NAME@/project/websphere_cfgs 1
    diff --git a/src/main/resources/project/parameterForms/UndeployApp.xml b/src/main/resources/project/parameterForms/UndeployApp.xml index cbd12a6d..8929a8e8 100644 --- a/src/main/resources/project/parameterForms/UndeployApp.xml +++ b/src/main/resources/project/parameterForms/UndeployApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#UndeployApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#UndeployApp entry @@ -26,7 +26,7 @@ configname /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    diff --git a/src/main/resources/project/parameterForms/UpdateApp.xml b/src/main/resources/project/parameterForms/UpdateApp.xml index ac521a0b..43143c05 100644 --- a/src/main/resources/project/parameterForms/UpdateApp.xml +++ b/src/main/resources/project/parameterForms/UpdateApp.xml @@ -16,7 +16,7 @@ --> - /commander/pages/@PLUGIN_NAME@/@PLUGIN_KEY@_help?s=Administration&ss=Plugins#UpdateApp + https://docs.cloudbees.com/docs/cloudbees-cd/latest/plugins/ec-websphere#UpdateApp entry @@ -27,7 +27,7 @@ configName /plugins/@PLUGIN_NAME@/project/websphere_cfgs Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. To view or create a new configuration, go to the Administration -> Plugins tab, and select 'Configure' action for @PLUGIN_KEY@ plugin. - Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration.

    A Configuration defines connection details and can be created by going to plugin configuration page.
    + Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. 1
    From 7c62c91d734fd1b69f13fc8dad0ad335dcbad0c0 Mon Sep 17 00:00:00 2001 From: Polina Shubina <925043@gmail.com> Date: Mon, 21 Sep 2020 19:06:56 +0300 Subject: [PATCH 16/47] label --- build.gradle | 2 +- src/main/resources/META-INF/plugin.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c94b855c..6e2c6c63 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ buildscript { group = 'com.electriccloud' description = 'Plugins : EC-WebSphere' -version = '2.8.0' +version = '2.8.1' apply plugin: 'flow-gradle-plugin' apply plugin: 'license' diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 75fac5d9..32d798bb 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -34,5 +34,6 @@ -true + true + WebSphere From f304d22c1f941877d8c5e7af1f680e8d47f9e3f4 Mon Sep 17 00:00:00 2001 From: Polina Shubina <925043@gmail.com> Date: Wed, 23 Sep 2020 12:37:51 +0300 Subject: [PATCH 17/47] Adoc back-migration --- help/help.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help/help.adoc b/help/help.adoc index ea828340..13da7acc 100644 --- a/help/help.adoc +++ b/help/help.adoc @@ -56,7 +56,7 @@ parameters on procedures that use them. To create plugin configurations in {CD}, do these steps: * Go to **Administration** >**Plugins** to open the Plugin Manager. -* Find the @PLUGIN_NAME@ row. +* Find the EC-WebSphere-@PLUGIN_VERSION@ row. * Click *Configure* to open the Configurations page. * Click *Create Configuration* as per the description of parameters below. From f3925198ba528c22a1f2b1ca9e437c2e8ea9d90f Mon Sep 17 00:00:00 2001 From: Polina Shubina <925043@gmail.com> Date: Wed, 23 Sep 2020 20:37:25 +0300 Subject: [PATCH 18/47] Adoc back-migration --- help/help.adoc | 478 +++++++++++++++++++++++-------------------------- 1 file changed, 229 insertions(+), 249 deletions(-) diff --git a/help/help.adoc b/help/help.adoc index 13da7acc..f9772796 100644 --- a/help/help.adoc +++ b/help/help.adoc @@ -1,25 +1,7 @@ Plugin version @PLUGIN_VERSION@ - Revised on September 21, 2020 - - - -== Overview - -== {CD} Integration to WebSphere - -You can use this plugin to interact with an IBM -WebSphere Server. You can start and stop the server. -You can also manage applications within the server (start, -deploy, undeploy, stop or custom task) using the provided -WebSphere scripts in the *bin* directory under -the installation home directory (wsadmin, startServer, -stopServer). You can run Jython scripts that are -provided by the user or defined when a procedure is -created. - == Integrated Version The plugin was tested on following WebSphere versions: @@ -160,7 +142,7 @@ This procedure creates mail provider with a protocol provider, a mail session an | Protocol Provider Name | Specifies the name to be given to the new protocol provider . -| Protocol Provider Class Name | Specifies the implementation class of this protocol provider. +| Protocol Provider Class Name | Specifies the implementation class of this protocol provider. | Protocol Provider Type | Specifies the type of protocol provider. Valid options are STORE(for incoming protocol provider) or TRANSPORT(for outgoing protocol provider). @@ -213,7 +195,7 @@ To create a new mail provider along with protocol provider and mail session, do * Go to the CreateEndToEndMailProvider procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createendtoendmailprovider/ec-webspherecreateendtoendmailprovider2.png[image] @@ -311,7 +293,7 @@ To create a mail session for default mail provider, do these steps: * Go to the CreateMailSession procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createmailsession/ec-webspherecreatemailsession2.png[image] @@ -350,7 +332,7 @@ This procedure publishes WSDL files in each web services-enabled module to the f | Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Application Name | Name of the application of which to publish the WSDL file. i.e: 'webapp'. +| Application Name | Name of the application of which to publish the WSDL file. i.e: 'webapp'. | Location to publish WSDL file | Filename and absolute path on the filesystem where published WSDL files should get stored.For example, 'C:/webservices/sampleWSDL.zip' @@ -365,7 +347,7 @@ This procedure publishes WSDL files in each web services-enabled module to the f | Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar'. -| SOAP address prefixes | Give SOAP address prefix in format "{{module {{binding partial-url}}}}" to customize the WSDL SOAP address for each module.. i.e: '{ {AddressBookJ2WB.war {{http http://localhost:9080}}} {StockQuote.jar {{http https://localhost:9443}}} }'. +| SOAP address prefixes | Give SOAP address prefix in format "{{module {{binding partial-url}}}}" to customize the WSDL SOAP address for each module.. i.e: '{ {AddressBookJ2WB.war {{http http://localhost:9080}}} {StockQuote.jar {{http https://localhost:9443}}} }'. | Additional Commands | Additional commands to be entered for wsadmin. @@ -382,7 +364,7 @@ To publish WSDL files, do these steps: * Go to the PublishWSDL procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/publishwsdl/ec-webspherepublishwsdl2.png[image] @@ -413,40 +395,40 @@ This procedure creates an Application Server identical to an existing Applicatio | Server Name | Name of application server to be created. -| Generate Unique Ports? | +| Generate Unique Ports? | By default ports generated during server creation will be created uniquely. If not checked ports in template will be used as is for server creation. - -| Source Type | + +| Source Type | Type of source which should be used for server creation. Select Template or Application Server. In case of template, application server template will be used for server creation, in case of Application Server, template will be created from existing application server and new server will be created from this template then. After successful creation template will be deleted. - -| Source Template Name | + +| Source Template Name | This parameter is applicable only when the source is a Template. Name of server template to be the source for a new server. - -| Source Template Location | + +| Source Template Location | The configuration Id that represents the location of a template. This parameter is applicable only when the source is a Template. - -| Source Server Name | + +| Source Server Name | Name of application server to be the source for a new server in format nodename:servername. - -| Sync Nodes? | + +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -507,9 +489,9 @@ This procedure deletes an existing Application Server. In addition it will synch | Server Name | Name of application server to be deleted. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -573,17 +555,17 @@ This procedure creates a template of an existing Application Server. | Template Name | Application server template name to be created. -| Template Location | +| Template Location | Specifies a configuration Id that represents the location to place the template. - + | Template Description | Description of application server template. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -641,9 +623,9 @@ This procedure deletes an existing Application Server Template. | Template Name | Application server template name to be deleted. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -710,22 +692,22 @@ This procedure creates a cluster, adds members to it, and can deploy an applicat | Create First Cluster Member? | If not checked, empty cluster will be created -| First Cluster Member Creation Policy | +| First Cluster Member Creation Policy | Controls how 1st cluster member is to be created Existing - use existing server as template Convert - convert existing server to 1st cluster member Template - use app server template to create 1st cluster member - -| Source Template Name | + +| Source Template Name | Name of server template to be the source for first cluster member. - -| Source Server Name | + +| Source Server Name | Name of application server to be the source for a new server in format nodename:servername. - + | First Cluster Member Node | Node name where first cluster member will be created. @@ -737,43 +719,43 @@ This procedure creates a cluster, adds members to it, and can deploy an applicat | First Cluster Member Weight | Weight of first cluster member. -| Generate Unique Ports for First Cluster Member? | +| Generate Unique Ports for First Cluster Member? | By default ports generated during for first cluster member creation will be created uniquely. If not checked ports in template will be used as is for server creation. - -| Server Resources Promotion Policy | + +| Server Resources Promotion Policy | Specifies how resources such as data sources are initially created in the cluster. Create settings at the cluster scope if the settings can be used across the entire cluster. Otherwise, create settings at the cluster member (server) level. Creating settings at the cluster scope reduces the amount of configuration that you maintain. Default is Cluster. - + | Add Cluster Members? | If checked, additional cluster members will be added right after cluster creation. -| Gen Unique Ports for Cluster Members? | +| Gen Unique Ports for Cluster Members? | By default ports generated during cluster members creation will be created uniquely. If not checked ports in template will be used as is for server creation. - -| Weight of Each Cluster Member | + +| Weight of Each Cluster Member | Weight of each cluster member from list. - -| Cluster Members List | + +| Cluster Members List | List of cluster members to be created in format NodeName:server1, NodeName2:server2. - -| Sync Nodes? | + +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -833,9 +815,9 @@ This procedure delete the specified cluster. | Cluster Name | The name of the cluster to delete. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -960,26 +942,26 @@ This procedure imports an Application Server from an Archive and creates an iden | Archive | Specifies the fully qualified path of the configuration archive. -| Node Name in Archive | +| Node Name in Archive | Specifies the node name of the server defined in the configuration archive. Not required if there is only one Node in the Archive to be imported. If there are multiple nodes in the Archive, mention the node name of the Server to be imported. - -| Server Name in Archive | + +| Server Name in Archive | Specifies the name of the server defined in the configuration archive. Not required if there is only one Server in the Archive to be imported. If there are multiple servers in the Archive, mention the name of the Server to be imported. - + | Core Group | Specifies the core group name to which the server should belong. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -1096,18 +1078,18 @@ This procedure removes specified application servers from the cluster using a Jy | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Cluster Name | Name of cluster from which to remove/delete the members. +| Cluster Name | Name of cluster from which to remove/delete the members. -| List of Cluster Members | +| List of Cluster Members | List of cluster members in the form Node01:server1, Node02:server2 to remove/delete from cluster. Important note: server will be not only removed from cluster, but also deleted. - -| Sync Nodes? | + +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -1198,10 +1180,10 @@ This procedure configures EJB container properites using a Jython script. | Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Cell Name | Name of cell to which EJB container belongs to. +| Cell Name | Name of cell to which EJB container belongs to. -| Node Name | Name of node to which EJB container belongs to. +| Node Name | Name of node to which EJB container belongs to. | Server Name | Name of application server to which EJB container belongs to. @@ -1239,7 +1221,7 @@ To Configure EJB Container, do these steps: * Go to the ConfigEJBContainer procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/configejbcontainer/ec-websphereconfigejbcontainer2.png[image] @@ -1279,56 +1261,56 @@ Creates the First Cluster Member of an existing cluster. | Cluster Name | Name of the new cluster. -| First Cluster Member Name | +| First Cluster Member Name | Server Name of first cluster member. - -| First Cluster Member Node | + +| First Cluster Member Node | Node Name of first cluster member. - -| First Cluster Member Weight | + +| First Cluster Member Weight | Weight of first cluster member. - -| Generate Unique Ports for First Cluster Member? | + +| Generate Unique Ports for First Cluster Member? | By default the port generated for first cluster member will be created uniquely. If this option is not checked, ports in template will be used as is. - -| Server Resources Promotion Policy | + +| Server Resources Promotion Policy | Specifies how resources such as data sources are initially created in the cluster. Create settings at the cluster scope if the settings can be used across the entire cluster. Otherwise, create settings at the cluster member (server) level. Creating settings at the cluster scope reduces the amount of configuration that you maintain. Default is Cluster. - -| First Cluster Member Creation Policy | + +| First Cluster Member Creation Policy | Controls how first cluster member is created. The values mean the following. Existing - Use existing server Template - Use app server template to create first cluster member - -| Source Template Name | + +| Source Template Name | Name of server template to be the source for first cluster member. - -| Source Server Name | + +| Source Server Name | Name of application server to be the source for a new server in format nodename:servername. - -| Sync Nodes? | + +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -1395,9 +1377,9 @@ Creates members under an existing cluster. | List of Cluster Members | List of cluster members. -| Sync Nodes? | +| Sync Nodes? | The syncNode command forces a configuration synchronization to occur between the node and the deployment manager for the cell in which the node is configured. - + |=== @@ -1452,10 +1434,10 @@ This procedure starts one or more Application Servers that can be spread across | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Server List | - List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, +| Server List | + List of Servers to be started. Provide them in this format : NodeName:ServerName. For example, Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to start all servers within Node4. - + | Wait time | Not Required. Time to wait until all servers are started. If not specified wait time will be treated as 0. @@ -1513,10 +1495,10 @@ This procedure stops one or more Application Servers that can be spread across n | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Server List | - List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, +| Server List | + List of Servers to be stopped. Provide them in this format : NodeName:ServerName. For example, Node1:Server1, Node2:Server2, Node3:Server3, or Node4:* to stop all servers within Node4. - + | Wait time | Not Required. Time to wait until all servers are stopped. If not specified wait time will be treated as 0. @@ -1579,9 +1561,9 @@ This procedure starts a cluster. | Cluster Name | Name of the cluster to be started. -| Timeout | +| Timeout | Specifies the waiting time before cluster start times out and returns an error. - + |=== @@ -1638,12 +1620,12 @@ This procedure stops a cluster. | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Cluster Name | Name of the cluster to be stopped. +| Cluster Name | Name of the cluster to be stopped. -| Timeout | +| Timeout | Specifies the waiting time before cluster stop times out and returns an error. - + | Perform Ripple Start? | If checked, all servers within cluster will be stopped one-by-one and then started. @@ -1704,10 +1686,10 @@ This procedure starts the Deployment Manager in a WAS network deployment. | StartManager Location | Absolute Physical path in Filesystem to location of startManager script i.e., /path/to/startManager.sh or startManager.bat -| Deployment Manager Profile | +| Deployment Manager Profile | Profile name of the DeploymentManager which needs to be started. If this is not provided StartManager will start the DeploymentManager which has the default profile. - + | Log File Location | Absolute Physical path in Filesystem to location of startManager.sh logs i.e., /path/to/startServer.log @@ -1716,9 +1698,9 @@ This procedure starts the Deployment Manager in a WAS network deployment. | Timeout | Specifies the waiting time before deployment manager start times out and returns an error. -| Additional Parameters | +| Additional Parameters | This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. - + |=== @@ -1776,10 +1758,10 @@ Stops Deployment Manager | StopManager Location | Absolute Physical path in Filesystem to location of stopManager script i.e., /path/to/stopManager.sh or stopManager.bat -| Deployment Manager Profile | +| Deployment Manager Profile | Profile name of the DeploymentManager which needs to be stopped. If this is not provided StopManager will stop the DeploymentManager which has the default profile. - + | Log File Location | Absolute Physical path in Filesystem to location of stopManager.sh logs i.e., /path/to/stopServer.log @@ -1788,9 +1770,9 @@ Stops Deployment Manager | Timeout | Specifies the waiting time before deployment manager stop times out and returns an error. -| Additional Parameters | +| Additional Parameters | This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. - + |=== @@ -1848,10 +1830,10 @@ This procedure starts a WAS node and optionally starts all Application Servers i | StartNode Location | Absolute Physical path in Filesystem to location of startNode script i.e., /path/to/startNode.sh or startNode.bat -| Node Profile | +| Node Profile | Profile name of the Node which needs to be started. If this is not provided StartNode will start the Node which has the default profile. - + | Log File Location | Absolute Physical path in Filesystem to location of startNode.sh logs i.e., /path/to/startServer.log @@ -1866,9 +1848,9 @@ This procedure starts a WAS node and optionally starts all Application Servers i | Node Name to start Servers | Name of the node where application servers needs to be started. -| Additional Parameters | +| Additional Parameters | This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. - + |=== @@ -1926,10 +1908,10 @@ This procedure stops a WAS node and stops the Application Servers in that Node b | StopNode Location | Absolute Physical path in Filesystem to location of stopNode script i.e., /path/to/stopNode.sh or stopNode.bat -| Node Profile | +| Node Profile | Profile name of the Node which needs to be stopped. If this is not provided StopNode will stop the Node which has the default profile. - + | Log File Location | Absolute Physical path in Filesystem to location of stopNode.sh logs i.e., /path/to/stopServer.log @@ -1941,9 +1923,9 @@ This procedure stops a WAS node and stops the Application Servers in that Node b | Node Stop Policy | Policy that will be used for node stopping. It could be one of: Just Stop node agent, stop Spplication Servers, Save Node State. -| Additional Parameters | +| Additional Parameters | This parameter can be used to either override defaults or pass Custom Properties. For example: -quiet, -nowait, -help. - + |=== @@ -1997,7 +1979,7 @@ This procedure starts a WebSphere instance or an application server using startS | StartServer Absolute Path | Absolute path of the start server script, including filename and extension. i.e: 'startServer.bat' or '/path/to/startServer.sh' or 'C:\Program Files\IBM\WebSphere\AppServer\bin\startServer.bat'. -| Instance name | The name of the instance of the server to be started. i.e: 'server01'. +| Instance name | The name of the instance of the server to be started. i.e: 'server01'. | Additional Commands | Additional commands to be entered for the startup of the server. @@ -2031,7 +2013,7 @@ This procedure stops a WebSphere instance or an application server using stopSer | Script Location | Absolute path of the stop server script, including filename and extension. i.e: 'C:/Program Files/IBM/WebSphere/AppServer/bin/stopServer.bat', 'stopServer.bat', '/path/to/stopServer.sh' -| Instance Name | Server instance name of the server to be stopped. i.e: 'server01'. +| Instance Name | Server instance name of the server to be stopped. i.e: 'server01'. | Additional Commands | Additional commands to be entered for stop the server. @@ -2062,7 +2044,7 @@ This procedure runs a task using wsadmin and the Jython code files. | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. | Commands | Commands to be entered to wsadmin. Use one command per line. @@ -2077,7 +2059,7 @@ This procedure runs a task using wsadmin and the Jython code files. | Script File Absolute Path | Path of a Jython script that will be run using wsadmin. i.e: '/path/to/scriptFile.jython' or 'c:/dir/scriptFile.jython'. -| Script File Source | Indicates either if a script file route or an embedded script file will be provided. +| Script File Source | Indicates either if a script file route or an embedded script file will be provided. | Script File | Content of the script file to run if Embedded File is chosen in the Script File Source. @@ -2118,7 +2100,7 @@ This procedure configures the session management related properties for deployed | Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. /path/to/wsadmin.sh or wsadmin.bat. -| Application Name | Name of the web application to configure. +| Application Name | Name of the web application to configure. | Enable SSL Tracking | Specifies that session tracking uses Secure Sockets Layer (SSL) information as a session ID. Enabling SSL tracking takes precedence over cookie-based session tracking and URL rewriting. @@ -2165,7 +2147,7 @@ To Configure Session Management for application, do these steps: * Go to the ConfigureSession procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/configuresession/ec-websphereconfiguresession2.png[image] @@ -2221,7 +2203,7 @@ To map shared library to application, do these steps: * Go to the MapSharedLibrary procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/mapsharedlibrary/ec-webspheremapsharedlibrary2.png[image] @@ -2279,7 +2261,7 @@ To modify Application's ClassLoader do the following steps: * Go to the ModifyApplicationClassLoader procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/modifyapplicationclassloader/ec-webspheremodifyapplicationclassloader2.png[image] @@ -2314,10 +2296,10 @@ This procedure starts an application using wsadmin. If the application is alread | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Application Name | Name of the application to start. i.e: 'webapp'. +| Application Name | Name of the application to start. i.e: 'webapp'. | Cluster Name | Name of the cluster on which application is deployed. Not required in WebSphere Base Edition. @@ -2349,7 +2331,7 @@ To start an application, do these steps: * Go to the StartApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/startapp/startapp2.png[image] @@ -2386,10 +2368,10 @@ This procedure stops an application using wsadmin. If the application is already | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Application Name | Name of the application to stop. i.e: 'webapp'. +| Application Name | Name of the application to stop. i.e: 'webapp'. | Cluster Name | Name of the cluster on which application is deployed. Not required in WebSphere Base Edition. @@ -2421,20 +2403,20 @@ To stop an application, do these steps: * Go to the StopApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp2.png[image] After the job runs, you can view the results, including the following job details, which show that the application was stoped -successfully: +successfully: image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp3.png[image] In the *StopApp* step, click the Log icon to see the diagnostic information. The output is similar to the following diagnostic -report. +report. image::cloudbees-common::cd-plugins/ec-websphere/stopapp/stopapp4.png[image] @@ -2467,7 +2449,7 @@ This procedure creates a JDBC provider using a Jython script. | JDBC Provider Description | A description for the JDBC Provider. -| Cell Scope | Parent object where the JDBC Provider will be created. This determines the visibility scope of the JDBC Provider. When the Cell Scope is provided, if the node and server scopes are not provided, then the scope will be the 'cell'; if the node is provided and the server not, then the scope will be the 'node'; if the server is provided and the node not, then the scope will be the 'server'. At least the Cell, the Node or the Server scope must be provided. i.e: 'wsaspluginNode01Cell'. +| Cell Scope | Parent object where the JDBC Provider will be created. This determines the visibility scope of the JDBC Provider. When the Cell Scope is provided, if the node and server scopes are not provided, then the scope will be the 'cell'; if the node is provided and the server not, then the scope will be the 'node'; if the server is provided and the node not, then the scope will be the 'server'. At least the Cell, the Node or the Server scope must be provided. i.e: 'wsaspluginNode01Cell'. | Cluster Scope | When the Cluster Scope is provided, then the scope will be the cluster. i.e: 'cluster1'. @@ -2549,7 +2531,7 @@ To delete a JDBC provider, do these steps: * Go to the DeleteJDBCProvider procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejdbcprovider/ec-webspheredeletejdbcprovider2.png[image] @@ -2591,19 +2573,19 @@ The procedure creates a datasource by using a Jython script. | JDBC Provider | Name of an existing JDBC Provider. -| Datasource Name | A unique name that identifies this Datasource in the WebSphere domain. +| Datasource Name | A unique name that identifies this Datasource in the WebSphere domain. -| Datasource Description | A description for the datasource. +| Datasource Description | A description for the datasource. -| JNDI Name | The JNDI path to where this Datasource is bound. +| JNDI Name | The JNDI path to where this Datasource is bound. -| Statement Cache Size | Specifies the number of statements that can be cached per connection. The application server caches a statement after you close that statement. +| Statement Cache Size | Specifies the number of statements that can be cached per connection. The application server caches a statement after you close that statement. -| Authentication Alias Name | Provide the authentication data alias. +| Authentication Alias Name | Provide the authentication data alias. | Datasource Helper Class Name | Provide the datasource helper class name. @@ -2657,7 +2639,7 @@ This procedure deletes a datasource using a Jython script. | Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Datasource Name | A unique name that identifies the datasource to delete in the WebSphere domain. +| Datasource Name | A unique name that identifies the datasource to delete in the WebSphere domain. |=== @@ -2710,10 +2692,10 @@ This procedure creates a new JMS provider using a Jython script. | Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Scope | Specifies a scope of cell, node, server, or cluster for the JMS provider. E.g. Cell=Cell01,Node=Node01,Server=server1 +| Scope | Specifies a scope of cell, node, server, or cluster for the JMS provider. E.g. Cell=Cell01,Node=Node01,Server=server1 -| JMS Provider Name | Specifies the name to assign to the new JMS provider. +| JMS Provider Name | Specifies the name to assign to the new JMS provider. | Initial Context Factory | Specifies the Java class name of the initial context factory for the JMS provider. @@ -2754,7 +2736,7 @@ To create a new JMS provider, do these steps: * Go to the CreateJMSProvider procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createjmsprovider/ec-webspherecreatejmsprovider2.png[image] @@ -2798,7 +2780,7 @@ To delete JMS Provider in {CD} interface, do these steps: * Create step, choose Plugin, choose DeleteJMSProvider from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/procedureconfig.png[image] @@ -2819,7 +2801,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/pipelinepicke * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsprovider/pipelineconfig.png[image] @@ -2875,10 +2857,10 @@ This procedure creates a new JMS Queue or updates an existing JMS Queue. | Queue Administrative Description | An administrative description assigned to queue. -| Additional Options | - This parameter can be used to either override defaults or pass Custom Properties. +| Additional Options | + This parameter can be used to either override defaults or pass Custom Properties. For example: -ccsid 1208 -readAhead YES - + |=== @@ -2895,7 +2877,7 @@ To create or update JMS Queue in {CD} interface, do these steps: * Create step, choose Plugin, choose CreateOrUpdateJMSQueue from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/procedureconfig.png[image] @@ -2916,7 +2898,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/pipeline * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmsqueue/pipelineconfig.png[image] @@ -2974,7 +2956,7 @@ To delete JMS Queue in {CD} interface, do these steps: * Create step, choose Plugin, choose DeleteJMSQueue from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/procedureconfig.png[image] @@ -2995,7 +2977,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/pipelinepicker.p * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsqueue/pipelineconfig.png[image] @@ -3048,10 +3030,10 @@ This procedure creates a new JMS Topic or updates an existing JMS Topic. | Topic Administrative Description | An administrative description assigned to Topic. -| Additional Options | - This parameter can be used to either override defaults or pass Custom Properties. +| Additional Options | + This parameter can be used to either override defaults or pass Custom Properties. For example: -readAhead YES -ccsid 1208 - + |=== @@ -3068,7 +3050,7 @@ To create or update JMS Topic in {CD} interface, do these steps: * Create step, choose Plugin, choose CreateOrUpdateJMSTopic from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/procedureconfig.png[image] @@ -3089,7 +3071,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/pipeline * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatejmstopic/pipelineconfig.png[image] @@ -3147,7 +3129,7 @@ To delete JMS Topic in {CD} interface, do these steps: * Create step, choose Plugin, choose DeleteJMSTopic from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/procedureconfig.png[image] @@ -3168,7 +3150,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/pipelinepicker.p * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmstopic/pipelineconfig.png[image] @@ -3221,7 +3203,7 @@ This procedure creates a new JMS Activation Spec or updates an existing JMS Acti | Destination Type | An option to determine whether the message_driven bean uses a JMS queue or a JMS topic. -| Message Selector | +| Message Selector | The JMS message selector used to determine which messages the message-driven bean receives. The value is a string that is used to select a subset of the available messages. The syntax is based on a subset of the SQL 92 conditional expression syntax, as described in the JMS specification. @@ -3229,7 +3211,7 @@ This procedure creates a new JMS Activation Spec or updates an existing JMS Acti The selector string can refer to fields in the JMS message header and fields in the message properties. Message selectors cannot reference message body values. A null value (an empty string) indicates that there is no message selector for the message consumer. - + | Additional Options | Used to either override defaults or pass Custom Properties. @@ -3249,7 +3231,7 @@ To create or update JMS Activation Spec in {CD} interface, do these steps: * Create step, choose Plugin, choose CreateOrUpdateSIBJMSActivationSpec from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/procedureconfig.png[image] @@ -3270,7 +3252,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivations * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsactivationspec/pipelineconfig.png[image] @@ -3305,9 +3287,9 @@ This procedure creates a new JMS Activation Spec or updates an existing JMS Acti | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Scope of the Activation Spec | +| Scope of the Activation Spec | Scope of the WebSphere MQ messaging provider at which the Activation Spec is to be created. - + | Activation Spec Administrative Name | The administrative name assigned to this Activation Spec. @@ -3348,7 +3330,7 @@ To create or update WMQ JMS Activation Spec in {CD} interface, do these steps: * Create step, choose Plugin, choose CreateOrUpdateWMQJMSActivationSpec from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/procedureconfig.png[image] @@ -3369,7 +3351,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivations * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsactivationspec/pipelineconfig.png[image] @@ -3427,7 +3409,7 @@ To delete JMS Activation Spec in {CD} interface, do these steps: * Create step, choose Plugin, choose DeleteJMSActivationSpec from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/procedureconfig.png[image] @@ -3454,7 +3436,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelin * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsactivationspec/pipelineconfig.png[image] @@ -3489,30 +3471,30 @@ This procedure creates a new SIB JMS Connection Factory or updates an existing J | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Scope of the Connection Factory | +| Scope of the Connection Factory | Scope of the WebSphere Default messaging provider at which the Connection Factory is to be created. - -| Connection Factory Administrative Name | + +| Connection Factory Administrative Name | The administrative name assigned to this Connection Factory. - + | Bus Name | Name of the service integration bus to which connections are made. -| JNDI Name | +| JNDI Name | The name and location used to bind this object into WebSphere Application Server JNDI. - -| Connection Factory Type | + +| Connection Factory Type | Type of Connection Factory to create. Should be one of Queue or Topic. To create a generic connection factory, leave this parameter unset. This parameter is being used only if Connection Factory is going to be created. Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. - + | Connection Factory Administrative Description | An Administrative Description assigned to Connection Factory. @@ -3535,7 +3517,7 @@ To create or update SIB JMS Connection Factory in {CD} interface, do these steps * Create step, choose Plugin, choose CreateOrUpdateSIBJMSConnectionFactory from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/procedureconfig.png[image] @@ -3556,7 +3538,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionf * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatesibjmsconnectionfactory/pipelineconfig.png[image] @@ -3591,34 +3573,34 @@ This procedure creates a new WMQ JMS Connection Factory or updates an existing J | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Scope of the Connection Factory | +| Scope of the Connection Factory | Scope of the WebSphere MQ messaging provider at which the Connection Factory is to be created. - -| Connection Factory Administrative Name | + +| Connection Factory Administrative Name | The administrative name assigned to this Connection Factory. - -| Connection Factory Type | + +| Connection Factory Type | Use this parameter to determine whether a unified connection factory, a queue connection factory or a topic connection factory is to be created. This needs to be one of the values from CF, QCF and TCF. Default is CF. Since factory type can't be updated in existing factory, this parameter will be omited if Connection Factory already exists. - -| JNDI Name | + +| JNDI Name | The name and location used to bind this object into WebSphere Application Server JNDI. - + | Connection Factory Administrative Description | An Administrative description assigned to Connection Factory. -| Client Channel Definition URL | +| Client Channel Definition URL | A URL to a client channel definition table to use, for this Connection Factory, when contacting WebSphere MQ. - + | Client Channel Definition Queue Manager | A queue manager name, used to select one or more entries from a client channel definition table. @@ -3641,7 +3623,7 @@ To create or update WMQ JMS Connection Factory in {CD} interface, do these steps * Create step, choose Plugin, choose CreateOrUpdateWMQJMSConnectionFactory from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/procedureconfig.png[image] @@ -3662,7 +3644,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionf * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/createorupdatewmqjmsconnectionfactory/pipelineconfig.png[image] @@ -3700,9 +3682,9 @@ This procedure deletes an existing JMS ConnectionFactory. | Messaging System Type | The name of the messaging provider. Pass in either WMQ or SIB. -| Scope of the Connection Factory | +| Scope of the Connection Factory | Scope of the WebSphere messaging provider at which the Connection Factory is to be deleted. - + | Connection Factory Administrative Name | The administrative name assigned to this Connection Factory. @@ -3722,7 +3704,7 @@ To delete JMS ConnectionFactory in {CD} interface, do these steps: * Create step, choose Plugin, choose DeleteJMSConnectionFactory from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/procedureconfig.png[image] @@ -3743,7 +3725,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/pipe * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deletejmsconnectionfactory/pipelineconfig.png[image] @@ -3778,7 +3760,7 @@ This procedure undeploys an application using a Jython script and invoking Admin | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. | Commands | Commands to be entered to wsadmin. Use one command per line. @@ -3790,10 +3772,10 @@ This procedure undeploys an application using a Jython script and invoking Admin | Classpath | Jars to be passed to the wsadmin classpath. It is a string containing paths (semicolon-separated) the required JARs to execute wsadmin in a particular job. i.e: 'c:/MyDir/Myjar.jar;d:/yourdir/yourdir.jar' or '/MyDir/Myjar.jar;/yourdir/yourdir.jar' -| Application Name | Name of the web application to be deploy. i.e: 'webapp'. +| Application Name | Name of the web application to be deploy. i.e: 'webapp'. -| Application Path | Absolute path of the application to deploy. i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. +| Application Path | Absolute path of the application to deploy. i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. | Additional Commands | Additional commands to be entered for wsadmin. @@ -3812,7 +3794,7 @@ step: * Go to the DeployApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deployapp/deployapp2.png[image] @@ -3855,9 +3837,9 @@ This procedure deploys java enterprise application (.EAR) or java web applicatio | Application Name | Specifies logical name to be given to installing enterprise application. Do not include whitespaces in application name. -| Application Path | +| Application Path | Absolute path of the application to deploy. Use "/" as the path separator on both linux and windows i.e: '/path/to/webapp.war' or 'c:/mydir/webapp.war'. - + | Target cluster | Name of the cluster on which to deploy enterprise application. Not required in WebSphere Base Edition. Enter either target cluster or target server(s). @@ -3964,7 +3946,7 @@ To deploy an enterprise application, do these steps: * Go to the DeployEnterpriseApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deployenterpriseapp/ec-webspheredeployenterpriseapp2.png[image] @@ -4003,19 +3985,19 @@ This procedure deploys the OSGi application.It optionally configures external OS | Wsadmin Absolute Path | Path to wsadmin. If the location of wsadmin is in the PATH environment variable, then just the script name can be specified omitting its full path. E.g. '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Want to add external bundle repository? | If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required. +| Want to add external bundle repository? | If your OSGi applications reference bundles that are stored in an external bundle repository, you must configure a link (name and URL) to the repository so that the provisioner can retrieve the bundles when required. -| External Bundle Repository Name | Name of the external bundle repository to configure. +| External Bundle Repository Name | Name of the external bundle repository to configure. -| External Bundle Repository URL | URL of the external bundle repository to configure. +| External Bundle Repository URL | URL of the external bundle repository to configure. -| List of bundles to add to local repository | Comma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar +| List of bundles to add to local repository | Comma separated list of bundles to add to internal bundle repository.E.g. C:/installableApps/com.ibm.samples.websphere.osgi.logging.api.jar,C:/installableApps/com.ibm.samples.websphere.osgi.logging.impl.jar -| EBA file Path | Absolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'. +| EBA file Path | Absolute path of the OSGi application to deploy. i.e: '/path/to/blog.eba' or 'c:/mydir/blog.eba'. | Application Name | Name to be given to newly deployed OSGi application. @@ -4035,7 +4017,7 @@ To deploy an OSGi application, do these steps: * Go to the DeployOSGiApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/deployosgi/ec-webspheredeployosgi2.png[image] @@ -4071,10 +4053,10 @@ This procedure undeploys an application using a Jython script and invoking Admin | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. If the path in which wsadmin is stored in the path environmental variable, the absolute path is ommited. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Application Name | Name of the application to undeploy. i.e: 'webapp'. +| Application Name | Name of the application to undeploy. i.e: 'webapp'. | Commands | Commands to be entered to wsadmin. Use one command per line. @@ -4099,7 +4081,7 @@ This procedure undeploys an application using a Jython script and invoking Admin To undeploy an application, do these steps: Go to the UndeployApp procedure. -Enter the following parameters: +Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/undeployapp/undeployapp2.png[image] @@ -4145,7 +4127,7 @@ This procedure updates already deployed application in units of files, modules o | Content Type | Specifies to type of content to update. Use File option for updating a single file, Partial Application option for updating application partially, Module option to add/update a module to the deployed application, Application option for updating the entire deployed application. -| Operation | Specifies to type of operation to perform as part of update procedure. Use Add option to add new content, Update option to update existing content, AddUpdate option to add content and to replace if already exist, Delete option to remove existing content respectively. +| Operation | Specifies to type of operation to perform as part of update procedure. Use Add option to add new content, Update option to update existing content, AddUpdate option to add content and to replace if already exist, Delete option to remove existing content respectively. | Content | Specifies the file that contains the content that you want to update. For example, depending on the content type, the file could be an EAR file, a module, a partial zip, or a single file.Not required for Delete operation. @@ -4174,7 +4156,7 @@ To update application , do these steps: * Go to the UpdateApp procedure. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/updateapp/ec-websphereupdateapp2.png[image] @@ -4210,16 +4192,16 @@ This procedure checks if a web application is ready by using a Jython script. | Configuration Name | Name of the configuration to be used. URL, port and credentials are retrieved from the given configuration. -| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. +| Wsadmin Absolute Path | Absolute path of wsadmin, including filename and extension. i.e: '/path/to/wsadmin.sh' or 'wsadmin.bat'. -| Application Name | Name of the web application to be checked. i.e: 'webapp'. +| Application Name | Name of the web application to be checked. i.e: 'webapp'. -| Application State Checked | +| Application State Checked | Application State that is being checked, with any applicable retries based on wait time parameter. Any state that is not the desired state after any applicable retries, will be returned as a failure by the procedure. - + | Wait Time | Maximum duration of check application state retries. @@ -4238,7 +4220,7 @@ To check Application State, do these steps: * Create step, choose Plugin, choose CheckApp from procedures picker. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/checkapp/procedureconfig.png[image] @@ -4258,7 +4240,7 @@ image::cloudbees-common::cd-plugins/ec-websphere/checkapp/pipelinepicker.png[ima * Click on arrow. -* Enter the following parameters: +* Enter the following parameters: image::cloudbees-common::cd-plugins/ec-websphere/checkapp/pipelineconfig.png[image] @@ -4330,7 +4312,7 @@ This procedure checks the status of the page with the specified URL. | Credentials to be entered | The credentials needed to check the status of the page. -| Target URL | URL of the page to be checked. +| Target URL | URL of the page to be checked. | Maximum Elapsed Time | Defines the maximum time in seconds that the job will try to check into the server. Blank implies no wait time (URL only checked one time). @@ -4459,7 +4441,7 @@ Discover WebSphere instance configuration on a resources or environment === EC-WebSphere 2.7.1 -- Rebranding from "CloudBees Flow" to "{CD}". +- Rebranding to "{CD}". === EC-WebSphere 2.7.0 @@ -4469,7 +4451,7 @@ Discover WebSphere instance configuration on a resources or environment === EC-WebSphere 2.6.3 -- Renaming from "Electric Cloud" to "CloudBees". +- Renaming to "CloudBees". === EC-WebSphere 2.6.2 @@ -4505,7 +4487,7 @@ Error Reporting has been improved by leveraging postp to capture granular error === EC-WebSphere 2.5.0 - Following New procedures have been added to support application server management: - + * link:#CreateApplicationServer[CreateApplicationServer] * link:#DeleteApplicationServer[DeleteApplicationServer] * link:#CreateApplicationServerTemplate[CreateApplicationServerTemplate] @@ -4514,14 +4496,14 @@ Error Reporting has been improved by leveraging postp to capture granular error * link:#ImportApplicationServer[ImportApplicationServer] * link:#StartApplicationServers[StartApplicationServers] * link:#StopApplicationServers[StopApplicationServers] - + Following New procedures have been added to support start and stop of Node and Deployment Manager: - + * link:#StartDeploymentManager[StartDeploymentManager] * link:#StopDeploymentManager[StopDeploymentManager] * link:#StartNode[StartNode] * link:#StopNode[StopNode] - + WSAdmin Absolute path has been changed from non-required to required in plugin configuration. @@ -4534,7 +4516,7 @@ Error Reporting has been improved by leveraging postp to capture granular error === EC-WebSphere 2.4.0 - Following New procedures have been added to support the entire set of IBM JMS functionality: - + * link:#CreateOrUpdateSIBJMSActivationSpec[CreateOrUpdateSIBJMSActivationSpec] * link:#CreateOrUpdateWMQJMSActivationSpec[CreateOrUpdateWMQJMSActivationSpec] * link:#CreateOrUpdateSIBJMSConnectionFactory[CreateOrUpdateSIBJMSConnectionFactory] @@ -4542,7 +4524,7 @@ Error Reporting has been improved by leveraging postp to capture granular error * link:#DeleteJMSActivationSpec[DeleteJMSActivationSpec] * link:#DeleteJMSConnectionFactory[DeleteJMSConnectionFactory] * link:#DeleteJMSProvider[DeleteJMSProvider] - + @@ -4558,7 +4540,7 @@ Error Reporting has been improved by leveraging postp to capture granular error === EC-WebSphere 2.3.0 - Following New procedures have been added: - + * link:#DeleteJMSQueue[DeleteJMSQueue] * link:#DeleteJMSTopic[DeleteJMSTopic] * link:#CreateOrUpdateJMSQueue[CreateOrUpdateJMSQueue] @@ -4573,7 +4555,7 @@ Following procedures have been extended to support Websphere 9.0: * link:#StopApp[StopApp] * link:#StopCluster[StopCluster] - + The Debug Level checkbox has been changed to a dropdown. The level will be defaulted to INFO if no value is chosen. WSAdmin Absolute Path has been added to configuration and made as an optional parameter for all the following procedures: @@ -4585,18 +4567,18 @@ WSAdmin Absolute Path has been added to configuration and made as an optional pa * link:#CheckApp[CheckApp] link:#DeployEnterpriseApp[DeployEnterpriseApp] - - + + Fixed an issue when application was not started on all servers during deployment if server name and node name are the same. link:#CreateJDBCProvider[CreateJDBCProvider] - + Fixed an error with attached credentials when in some cases it was not possible to create new JDBC provider. - + link:#CheckApp[CheckApp] - + Procedure has been improved and now it could check for different application states. - + @@ -4623,10 +4605,10 @@ Procedure has been improved and now it could check for different application sta - Added new procedures - SyncNodes, CheckNodeStatus. - Added following optional parameters to DeployEnterpriseApplication procedure: - + * "Synchronize active nodes": Sync active nodes after application deployment. Enabled by default. * "Start application": Start the deployed application after deploying the application. Enabled by default. - + - Changed default value for "Distribute application" from unchecked to checked. (Deploy Enterprise Application procedure). @@ -4769,5 +4751,3 @@ Procedure has been improved and now it could check for different application sta === EC-WebSphere 1.1.0 - RunCustomJob procedure has been added. - - From 5a0eaba3c90561b62e97704ccfc69873768ad296 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Fri, 29 Jan 2021 16:37:05 +0200 Subject: [PATCH 19/47] 3rd stage or enabling external credentials --- build.gradle | 48 +- help/help.adoc | 5 +- .../websphere/client/CreateConfiguration.java | 23 +- .../client/EditConfigPropertySheetEditor.java | 26 +- .../project/WebSphereCreateConfigForm.xml | 1 + .../project/WebSphereEditConfigForm.xml | 1 + .../project/conf/createConfiguration.pl | 283 ++ .../project/conf/editConfiguration.pl | 255 ++ src/main/resources/project/ec_setup.pl | 356 +- src/main/resources/project/manifest.xml | 259 +- .../project/pdk/Bytes/Random/Secure/Tiny.pm | 384 ++ src/main/resources/project/pdk/FlowPDF.pm | 430 +++ .../project/pdk/FlowPDF/BaseClass.pm | 195 + .../project/pdk/FlowPDF/BaseClass2.pm | 207 + .../project/pdk/FlowPDF/Client/REST.pm | 397 ++ .../project/pdk/FlowPDF/Client/REST/Auth.pm | 18 + .../project/pdk/FlowPDF/Component.pm | 106 + .../project/pdk/FlowPDF/Component/CLI.pm | 207 + .../pdk/FlowPDF/Component/CLI/Command.pm | 189 + .../FlowPDF/Component/CLI/ExecutionResult.pm | 101 + .../project/pdk/FlowPDF/Component/EF.pm | 21 + .../pdk/FlowPDF/Component/EF/Reporting.pm | 921 +++++ .../FlowPDF/Component/EF/Reporting/Data.pm | 325 ++ .../FlowPDF/Component/EF/Reporting/Dataset.pm | 185 + .../FlowPDF/Component/EF/Reporting/Engine.pm | 91 + .../Component/EF/Reporting/Metadata.pm | 151 + .../Component/EF/Reporting/MetadataFactory.pm | 99 + .../FlowPDF/Component/EF/Reporting/Payload.pm | 291 ++ .../Component/EF/Reporting/Payloadset.pm | 316 ++ .../Component/EF/Reporting/Transformer.pm | 59 + .../project/pdk/FlowPDF/Component/OAuth.pm | 435 +++ .../project/pdk/FlowPDF/Component/Proxy.pm | 410 ++ .../project/pdk/FlowPDF/ComponentManager.pm | 303 ++ .../resources/project/pdk/FlowPDF/Config.pm | 213 ++ .../project/pdk/FlowPDF/Constants.pm | 40 + .../resources/project/pdk/FlowPDF/Context.pm | 1196 ++++++ .../project/pdk/FlowPDF/ContextFactory.pm | 86 + .../project/pdk/FlowPDF/Credential.pm | 194 + .../project/pdk/FlowPDF/Devel/Stacktrace.pm | 222 ++ .../pdk/FlowPDF/EF/OutputParameters.pm | 59 + .../resources/project/pdk/FlowPDF/EF/PostP.pm | 190 + .../project/pdk/FlowPDF/Exception.pm | 214 ++ .../FlowPDF/Exception/ConfigDoesNotExist.pm | 80 + .../FlowPDF/Exception/EntityAlreadyExists.pm | 102 + .../FlowPDF/Exception/EntityDoesNotExist.pm | 103 + .../Exception/MissingFunctionArgument.pm | 90 + .../Exception/MissingFunctionDefinition.pm | 87 + .../pdk/FlowPDF/Exception/RuntimeException.pm | 54 + .../FlowPDF/Exception/UnexpectedEmptyValue.pm | 96 + .../Exception/UnexpectedMissingValue.pm | 93 + .../Exception/WrongFunctionArgumentType.pm | 114 + .../Exception/WrongFunctionArgumentValue.pm | 112 + .../resources/project/pdk/FlowPDF/Helpers.pm | 272 ++ src/main/resources/project/pdk/FlowPDF/Log.pm | 629 +++ .../resources/project/pdk/FlowPDF/Log/FW.pm | 547 +++ .../project/pdk/FlowPDF/Parameter.pm | 208 + .../project/pdk/FlowPDF/Service/Bootstrap.pm | 116 + .../project/pdk/FlowPDF/Service/RSA.pm | 3394 +++++++++++++++++ .../project/pdk/FlowPDF/StepParameters.pm | 307 ++ .../project/pdk/FlowPDF/StepResult.pm | 628 +++ .../project/pdk/FlowPDF/StepResult/Action.pm | 50 + .../project/pdk/FlowPDF/Throwable.pm | 211 + .../resources/project/pdk/FlowPDF/Types.pm | 178 + .../project/pdk/FlowPDF/Types/Any.pm | 26 + .../project/pdk/FlowPDF/Types/ArrayrefOf.pm | 58 + .../project/pdk/FlowPDF/Types/Enum.pm | 40 + .../project/pdk/FlowPDF/Types/Reference.pm | 46 + .../project/pdk/FlowPDF/Types/Regexp.pm | 61 + .../project/pdk/FlowPDF/Types/Scalar.pm | 47 + src/main/resources/project/pdk/Try/Tiny.pm | 677 ++++ .../project/procedures_with_credentials.json | 234 ++ src/main/resources/project/project.xml | 424 +- 72 files changed, 18261 insertions(+), 335 deletions(-) create mode 100644 src/main/resources/project/conf/createConfiguration.pl create mode 100644 src/main/resources/project/conf/editConfiguration.pl create mode 100644 src/main/resources/project/pdk/Bytes/Random/Secure/Tiny.pm create mode 100644 src/main/resources/project/pdk/FlowPDF.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/BaseClass.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/BaseClass2.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Client/REST.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Client/REST/Auth.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/CLI.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/CLI/Command.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/CLI/ExecutionResult.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Data.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Dataset.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Engine.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Metadata.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/MetadataFactory.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payload.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payloadset.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Transformer.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/OAuth.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Component/Proxy.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/ComponentManager.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Config.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Constants.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Context.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/ContextFactory.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Credential.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Devel/Stacktrace.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/EF/OutputParameters.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/EF/PostP.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/ConfigDoesNotExist.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/EntityAlreadyExists.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/EntityDoesNotExist.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionArgument.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionDefinition.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/RuntimeException.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedEmptyValue.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedMissingValue.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentType.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentValue.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Helpers.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Log.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Log/FW.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Parameter.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Service/Bootstrap.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Service/RSA.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/StepParameters.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/StepResult.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/StepResult/Action.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Throwable.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/Any.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/ArrayrefOf.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/Enum.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/Reference.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/Regexp.pm create mode 100644 src/main/resources/project/pdk/FlowPDF/Types/Scalar.pm create mode 100644 src/main/resources/project/pdk/Try/Tiny.pm create mode 100644 src/main/resources/project/procedures_with_credentials.json diff --git a/build.gradle b/build.gradle index 6e2c6c63..34d5da07 100644 --- a/build.gradle +++ b/build.gradle @@ -17,9 +17,55 @@ buildscript { } } +repositories { + maven { + url "http://artifactory.electric-cloud.com/artifactory/repo" + } + // maven { + // url 'https://nexus-internal.cloudbees.com/content/repositories/snapshots' + // credentials { + // username = nexusUsername + // password = nexusPassword + // } + // } + // maven { + // url 'https://nexus-internal.cloudbees.com/service/local/staging/deploy/maven2' + // credentials { + // username = nexusUsername + // password = nexusPassword + // } + // } + maven { + url 'http://35.234.102.60/artifactory/ec' + credentials { + username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' + password = System.getenv('ARTIFACTORY_PASSWORD') + } + } + maven { + url "http://35.234.102.60/artifactory/thirdparty" + credentials { + username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' + password = System.getenv('ARTIFACTORY_PASSWORD') + } + } +} + +configurations.all { + resolutionStrategy { + force group: 'com.electriccloud', name: 'commander-client', version: '2020.10.0-SNAPSHOT' + force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.0-SNAPSHOT' + force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.0-SNAPSHOT' + force group: 'com.google.gwt', name: 'gwt-user', version: '2.5.0-ec3' + force group: 'com.google.gwt', name: 'gwt-dev', version: '2.5.0-ec1' + + cacheChangingModulesFor 0, 'seconds' + } +} + group = 'com.electriccloud' description = 'Plugins : EC-WebSphere' -version = '2.8.1' +version = '2.9.0' apply plugin: 'flow-gradle-plugin' apply plugin: 'license' diff --git a/help/help.adoc b/help/help.adoc index f9772796..7eac13f7 100644 --- a/help/help.adoc +++ b/help/help.adoc @@ -1,5 +1,5 @@ Plugin version @PLUGIN_VERSION@ -Revised on September 21, 2020 +Revised on February 1, 2021 == Integrated Version @@ -4424,6 +4424,9 @@ Discover WebSphere instance configuration on a resources or environment [[rns]] == Release notes +=== EC-WebSphere 3.9.0 + +- External credentials support has been added. === EC-WebSphere 3.8.1 diff --git a/src/main/java/ecplugins/websphere/client/CreateConfiguration.java b/src/main/java/ecplugins/websphere/client/CreateConfiguration.java index 7210f6d0..7a5aef41 100644 --- a/src/main/java/ecplugins/websphere/client/CreateConfiguration.java +++ b/src/main/java/ecplugins/websphere/client/CreateConfiguration.java @@ -42,6 +42,7 @@ import com.electriccloud.commander.client.requests.RunProcedureRequest; import com.electriccloud.commander.client.responses.DefaultRunProcedureResponseCallback; import com.electriccloud.commander.client.responses.RunProcedureResponse; +import com.electriccloud.commander.client.util.StringUtil; import com.electriccloud.commander.gwt.client.ui.CredentialEditor; import com.electriccloud.commander.gwt.client.ui.FormBuilder; import com.electriccloud.commander.gwt.client.ui.FormTable; @@ -120,9 +121,27 @@ public CreateConfiguration() if (credentialParams.contains(paramName)) { CredentialEditor credential = fb.getCredential(paramName); + String username = + credential.getUsername(); + String password = + credential.getPassword(); - request.addCredentialParameter(paramName, - credential.getUsername(), credential.getPassword()); + String credentialReference = credential.getCredentialReference(); + + if (!StringUtil.isEmpty(credentialReference)) { + + request.addCredentialReferenceParameter( + paramName, + credentialReference); + request.addActualParameter(paramName, + paramName); + } + else { + request.addCredentialParameter(paramName, username, + password); + } + //request.addCredentialParameter(paramName, + // credential.getUsername(), credential.getPassword()); } else { request.addActualParameter(paramName, params.get(paramName)); diff --git a/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java b/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java index 29cc2100..3bbcb2bb 100644 --- a/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java +++ b/src/main/java/ecplugins/websphere/client/EditConfigPropertySheetEditor.java @@ -24,6 +24,7 @@ import com.electriccloud.commander.client.responses.DefaultProcedureCallback; import com.electriccloud.commander.client.responses.DefaultRunProcedureResponseCallback; import com.electriccloud.commander.client.responses.RunProcedureResponse; +import com.electriccloud.commander.client.util.StringUtil; import com.electriccloud.commander.gwt.client.ui.CredentialEditor; import com.electriccloud.commander.gwt.client.ui.FormBuilder; import com.electriccloud.commander.gwt.client.ui.SimpleErrorBox; @@ -126,10 +127,26 @@ public EditConfigPropertySheetEditor( if (credentialParams.contains(paramName)) { CredentialEditor credential = fb.getCredential( paramName); + + String username = + credential.getUsername(); + String password = + credential.getPassword(); - request.addCredentialParameter(paramName, - credential.getUsername(), - credential.getPassword()); + String credentialReference = credential.getCredentialReference(); + + if (!StringUtil.isEmpty(credentialReference)) { + + request.addCredentialReferenceParameter( + paramName, + credentialReference); + request.addActualParameter(paramName, + paramName); + } + else { + request.addCredentialParameter(paramName, username, + password); + } } else { request.addActualParameter(paramName, @@ -179,7 +196,8 @@ private void waitForJob(final String jobId) } if (responseString.startsWith("Success")) { - EditConfigPropertySheetEditor.super.submit(); + EditConfigPropertySheetEditor.super.cancel(); + // EditConfigPropertySheetEditor.super.submit(); // super.submit(); } else { diff --git a/src/main/resources/project/WebSphereCreateConfigForm.xml b/src/main/resources/project/WebSphereCreateConfigForm.xml index 22699d0f..b64d211d 100644 --- a/src/main/resources/project/WebSphereCreateConfigForm.xml +++ b/src/main/resources/project/WebSphereCreateConfigForm.xml @@ -68,6 +68,7 @@ credential + true credential diff --git a/src/main/resources/project/WebSphereEditConfigForm.xml b/src/main/resources/project/WebSphereEditConfigForm.xml index 04d38d50..15bcb558 100644 --- a/src/main/resources/project/WebSphereEditConfigForm.xml +++ b/src/main/resources/project/WebSphereEditConfigForm.xml @@ -61,6 +61,7 @@ credential + true credential diff --git a/src/main/resources/project/conf/createConfiguration.pl b/src/main/resources/project/conf/createConfiguration.pl new file mode 100644 index 00000000..14cd59c3 --- /dev/null +++ b/src/main/resources/project/conf/createConfiguration.pl @@ -0,0 +1,283 @@ +## === createConfiguration template === +# Please do not edit this file +use ElectricCommander; +use ElectricCommander::PropDB; +use JSON; +use Data::Dumper; + +use constant { + SUCCESS => 0, + ERROR => 1, +}; + + + +## get an EC object +my $ec = new ElectricCommander(); + +my $projName = '$[/myProject/name]'; +my $configPropertySheet; +eval { + $configPropertySheet = $ec->getPropertyValue('/myProject/ec_configPropertySheet'); + 1; +} or do { + $configPropertySheet = 'websphere_cfgs'; + # $configPropertySheet = 'ec_plugin_cfgs'; +}; + +eval { + createConfigurationPropertySheet($configPropertySheet); + 1; +} or do { + my $err = $@; + print $err; + rollback($configPropertySheet, $err); + $ec->setProperty("/myJob/configError", $err); + exit 1; +}; + +my $steps = []; +my $stepsJSON = eval { $ec->getPropertyValue("/projects/$projName/procedures/CreateConfiguration/ec_stepsWithAttachedCredentials") }; +if ($stepsJSON) { + $steps = decode_json($stepsJSON); +} + +my $configName = '$[config]'; + +eval { + my $opts = getActualParameters(); + + for my $param ($ec->getFormalParameters({ + projectName => $projName, + procedureName => 'CreateConfiguration', + })->findnodes('//formalParameter')) { + my $type = $param->findvalue('type') . ''; + if ($type eq 'credential') { + my $required = $param->findvalue('required') . ''; + my $fieldName = $param->findvalue('formalParameterName') . ''; + my $credentialName = $opts->{$fieldName}; + + eval { + my $createEmpty = 0; + if (!$credentialName) { + # next; + $createEmpty = 1; + $credentialName = $fieldName; + } + my $ref = createAndAttachCredential($credentialName, $configName, $configPropertySheet, $steps, $createEmpty); + 1; + } or do { + my $err = $@; + if ($required) { + die $err; + } + else { + print "Failed to create credential $credentialName: $err\n"; + } + }; + } + } + 1; +} or do { + my $err = $@; + print $err; + rollback($configPropertySheet, $err); + $ec->setProperty("/myJob/configError", $err); + exit 1; +}; + + + + +sub createAndAttachCredential { + my ($credName, $configName, $configPropertySheet, $steps, $createEmpty) = @_; + + # if ($createEmpty) { + # print "CREATING EMPTY CREDENTIAL '$projName' : '$credName'\n"; + # $ec->createCredential($projName, $credName, '', ''); + # } + + my $xpath; + my $errors; + my $clientID = ''; + my $clientSecret = ''; + unless ($createEmpty) { + $xpath = $ec->getFullCredential($credName); + $errors = $ec->checkAllErrors($xpath); + $clientID = $xpath->findvalue("//userName"); + $clientSecret = $xpath->findvalue("//password"); + } + + my ($existingCredRef, $existingCredProjectName, $existingCredName); + eval { + $existingCredRef = $xpath->findvalue("//credentialReference")->string_value(); + $existingCredName = $xpath->findvalue("//credentialName")->string_value(); + # here we have the credential that has been passed as a reference. + $existingCredProjectName = $1 if $existingCredRef =~ m|\/projects\/(.*?)\/|s; + # now we have all three of them. And if these values are defined - we have + # existing credential that we just need to attach instead of create. + } unless $createEmpty; + my $projName = '$[/myProject/projectName]'; + + my $credObjectName = $credName eq 'credential' ? $configName : "${configName}_${credName}"; + # die $credObjectName; + my $configPath = "/projects/$projName/$configPropertySheet/$configName/$credName"; + if (!$existingCredRef) { + print "No existing credential reference... Creating...\n"; + # Create credential + $ec->deleteCredential($projName, $credObjectName); + $xpath = $ec->createCredential($projName, $credObjectName, $clientID, $clientSecret); + $errors .= $ec->checkAllErrors($xpath); + + # Give config the credential's real name + + $xpath = $ec->setProperty($configPath, $credObjectName); + $errors .= $ec->checkAllErrors($xpath); + + # Give job launcher full permissions on the credential + my $user = '$[/myJob/launchedByUser]'; + $xpath = $ec->createAclEntry("user", $user, { + projectName => $projName, + credentialName => $credObjectName, + readPrivilege => 'allow', + modifyPrivilege => 'allow', + executePrivilege => 'allow', + changePermissionsPrivilege => 'allow' + }); + $errors .= $ec->checkAllErrors($xpath); + } + # Attach credential to steps that will need it + for my $step( @$steps ) { + if ($existingCredRef) { + $credObjectName = $existingCredRef; + } + print "Attaching credential to procedure " . $step->{procedureName} . " at step " . $step->{stepName} . "\n"; + my $apath = $ec->attachCredential( + $projName, + $credObjectName, { + procedureName => $step->{procedureName}, + stepName => $step->{stepName} + }); + $errors .= $ec->checkAllErrors($apath); + } + + if ("$errors" ne "") { + # Cleanup the partially created configuration we just created + $ec->deleteProperty($configPath); + $ec->deleteCredential($projName, $credObjectName); + my $errMsg = "Error creating configuration credential: " . $errors; + $ec->setProperty("/myJob/configError", $errMsg); + die $errMsg; + } +} + +sub rollback { + my ($configPropertySheet, $error) = @_; + + if ($error !~ /already exists/) { + my $configName = '$[config]'; + $ec->deleteProperty("/myProject/$configPropertySheet/$configName"); + } +} + + +sub getActualParameters { + my $x = $ec->getJobDetails($ENV{COMMANDER_JOBID}); + my $nodeset = $x->find('//actualParameter'); + my $opts; + + foreach my $node ($nodeset->get_nodelist) { + my $parm = $node->findvalue('actualParameterName'); + if ($parm =~ m/credential$/s) { + my $value = $node->findvalue('value'); + unless ($value) { + # return undef; + # $opts->{$parm} = $parm; + # no cred ref here, we can next; + next; + } + my $credRef = getCredentialReference($parm); + if ($credRef) { + my $key = $parm . '_ref'; + $opts->{$key} = $credRef; + } + } + my $val = $node->findvalue('value'); + $opts->{$parm} = "$val"; + } + return $opts; +} + + +sub getCredentialReference { + my ($credName) = @_; + + if (!$credName) { + die "Cred name is mandatory to get credential reference...\n"; + } + my $xpath = $ec->getFullCredential($credName); + my $existingCredRef = undef; + eval { + $existingCredRef = $xpath->findvalue("//credentialReference")->string_value(); + }; + + return $existingCredRef; +} + + +sub createConfigurationPropertySheet { + my ($configPropertySheet) = @_; + + ## load option list from procedure parameters + my $ec = ElectricCommander->new; + $ec->abortOnError(0); + my $x = $ec->getJobDetails($ENV{COMMANDER_JOBID}); + my $nodeset = $x->find('//actualParameter'); + my $opts = getActualParameters(); + + print "Got actual parameters\n"; + if (!defined $opts->{config} || "$opts->{config}" eq "") { + die "config parameter must exist and be non-blank\n"; + } + + # check to see if a config with this name already exists before we do anything else + my $xpath = $ec->getProperty("/myProject/$configPropertySheet/$opts->{config}"); + my $property = $xpath->findvalue("//response/property/propertyName"); + + if (defined $property && "$property" ne "") { + my $errMsg = "A configuration named '$opts->{config}' already exists."; + $ec->setProperty("/myJob/configError", $errMsg); + die $errMsg; + } + + my $cfg = new ElectricCommander::PropDB($ec, "/myProject/$configPropertySheet"); + + # add all the options as properties + foreach my $key (keys %{$opts}) { + if ("$key" eq "config" || $key =~ m/_?credential_ref$/s) { + next; + } + + my $t = $opts->{"$key" . "_ref"}; + if ("$key" =~ m/credential$/s && $t) { + $opts->{$key} = $t; + } + $cfg->setCol("$opts->{config}", "$key", "$opts->{$key}"); + } +} + + +sub gen_credential_name { + my ($config_name, $credential_name) = @_; + + if ($credential_name eq 'credential') { + return $config_name; + } + + return $config_name . '_' . $credential_name; +} + + +## === createConfiguration template ends === +## === createConfiguration ends === +# Please do not edit this file diff --git a/src/main/resources/project/conf/editConfiguration.pl b/src/main/resources/project/conf/editConfiguration.pl new file mode 100644 index 00000000..d6e6dfc2 --- /dev/null +++ b/src/main/resources/project/conf/editConfiguration.pl @@ -0,0 +1,255 @@ +use strict; +use warnings; +## === createConfiguration template === +# Please do not edit this file +use ElectricCommander; +use ElectricCommander::PropDB; +use JSON; +use Data::Dumper; +# exit 0; +use constant { + SUCCESS => 0, + ERROR => 1, +}; +local $| = 1; + +my $projName = '@PLUGIN_KEY@-@PLUGIN_VERSION@'; +my $ec = ElectricCommander->new(); + +my $configPropertySheet; +eval { + $configPropertySheet = $ec->getPropertyValue('/myProject/ec_configPropertySheet'); + 1; +} or do { + $configPropertySheet = 'websphere_cfgs'; + # $configPropertySheet = 'ec_plugin_cfgs'; +}; + +my $steps = []; +my $stepsJSON = eval { + $ec->getPropertyValue("/projects/$projName/procedures/CreateConfiguration/ec_stepsWithAttachedCredentials") +}; +if ($stepsJSON) { + $steps = decode_json($stepsJSON); +} + +my $opts = getActualParameters(); + +my $configuration_name = $opts->{config}; +my $configName = $configuration_name; + +# print "PROJECT NAME: $projName\n"; +# print Dumper $opts; +# print Dumper $steps; + +# 1. Check whether configuration property sheet exists. Procedure should be failed if it does not. + +my $propertySheetFullPath = '/projects/' . $projName . '/' . $configPropertySheet . '/' . $configuration_name; +# print "Full Path To Config Property Sheet: $propertySheetFullPath\n"; + + +eval { + $ec->getPropertyValue($propertySheetFullPath); + 1; +} or do { + print "Config property sheet $propertySheetFullPath does not exist. Can't edit.\n"; + exit 1; +}; + +# now we have a path to the propety sheet where our config is stored. +# we're handling properties, credentials will go next. + +for my $k (keys %$opts) { + if ($k =~ m/_?credential$/s) { + my $key_ref = $k . '_ref'; + unless ($opts->{$key_ref}) { + # Deleting credential + # push @$credentials_to_delete, gen_credential_name($configuration_name, $k); + # print "Full path of credential: $propertySheetFullPath/$k\n"; + + my $generated_cred_name = gen_credential_name($configuration_name, $k); + $ec->setProperty("$propertySheetFullPath/$k", gen_credential_name($configuration_name, $k)); + my $rr = $ec->getPropertyValue("$propertySheetFullPath/$k"); + # print "PROP: $k, VALUE: $rr\n", Dumper $rr; + } + else { + # it has the credential reference, so the runtime credential should be deleted. + # TODO: Add deletion of runtime credential. + # print "SETTING REFERENCE: $propertySheetFullPath/$k, $opts->{$key_ref}\n"; + my $credential_to_delete = gen_credential_name($configuration_name, $k); + $ec->deleteCredential($projName, $credential_to_delete); + $ec->setProperty("$propertySheetFullPath/$k", $opts->{$key_ref}); + } + next; + } + my $propPath = $propertySheetFullPath . '/' . $k; + # print "Setting '$propPath' => $opts->{$k}\n"; + $ec->setProperty($propPath, $opts->{$k}); +} + +# deleting ref keys +for my $k (keys %$opts) { + if ($k =~ m/credential_ref$/s) { + $ec->deleteProperty("$propertySheetFullPath/$k"); + } +} + +eval { + my $opts = getActualParameters(); + # print "OPTS2: ", Dumper $opts; + for my $param ($ec->getFormalParameters({ + projectName => $projName, + procedureName => 'CreateConfiguration', + })->findnodes('//formalParameter')) { + my $type = $param->findvalue('type') . ''; + if ($type eq 'credential') { + my $required = $param->findvalue('required') . ''; + my $fieldName = $param->findvalue('formalParameterName') . ''; + my $credentialName = $opts->{$fieldName}; + + eval { + my $ref = createAndAttachCredential($credentialName, $configName, $configPropertySheet, $steps); + 1; + } or do { + my $err = $@; + if ($required) { + die $err; + } + else { + print "Failed to create credential $credentialName: $err\n"; + } + }; + } + } + 1; +} or do { + my $err = $@; + print $err; + rollback($configPropertySheet, $err); + $ec->setProperty("/myJob/configError", $err); + exit 1; +}; + + +# Handling credentials here +### Service subroutines + +sub getActualParameters { + my $x = $ec->getJobDetails($ENV{COMMANDER_JOBID}); + my $nodeset = $x->find('//actualParameter'); + my $opts; + + foreach my $node ($nodeset->get_nodelist) { + my $parm = $node->findvalue('actualParameterName'); + if ($parm =~ m/credential$/s) { + my $credRef = getCredentialReference($parm); + if ($credRef) { + my $key = $parm . '_ref'; + $opts->{$key} = $credRef; + } + } + my $val = $node->findvalue('value'); + $opts->{$parm} = "$val"; + } + return $opts; +} + + +sub getCredentialReference { + my ($credName) = @_; + + if (!$credName) { + die "Cred name is mandatory to get credential reference...\n"; + } + my $xpath = $ec->getFullCredential($credName); + my $existingCredRef = undef; + eval { + $existingCredRef = $xpath->findvalue("//credentialReference")->string_value(); + }; + + return $existingCredRef; +} + + +sub createAndAttachCredential { + my ($credName, $configName, $configPropertySheet, $steps) = @_; + + my $xpath = $ec->getFullCredential($credName); + my $errors = $ec->checkAllErrors($xpath); + + my $clientID = $xpath->findvalue("//userName"); + my $clientSecret = $xpath->findvalue("//password"); + my ($existingCredRef, $existingCredProjectName, $existingCredName); + eval { + $existingCredRef = $xpath->findvalue("//credentialReference")->string_value(); + $existingCredName = $xpath->findvalue("//credentialName")->string_value(); + # here we have the credential that has been passed as a reference. + $existingCredProjectName = $1 if $existingCredRef =~ m|\/projects\/(.*?)\/|s; + # now we have all three of them. And if these values are defined - we have + # existing credential that we just need to attach instead of create. + }; + my $projName = '$[/myProject/projectName]'; + + my $credObjectName = $credName eq 'credential' ? $configName : "${configName}_${credName}"; + # die $credObjectName; + my $configPath = "/projects/$projName/$configPropertySheet/$configName/$credName"; + if (!$existingCredRef) { + print "Credential reference is not present. Creating runtime credential.\n"; + # Create credential + $ec->deleteCredential($projName, $credObjectName); + $xpath = $ec->createCredential($projName, $credObjectName, $clientID, $clientSecret); + $errors .= $ec->checkAllErrors($xpath); + + # Give config the credential's real name + + # DEBUG + # $xpath = $ec->setProperty($configPath, $credObjectName); + # $errors .= $ec->checkAllErrors($xpath); + # END OF DEBUG + # print "SET PROPERTY: setProperty($configPath, $credObjectName);\n"; + # Give job launcher full permissions on the credential + my $user = '$[/myJob/launchedByUser]'; + $xpath = $ec->createAclEntry("user", $user, { + projectName => $projName, + credentialName => $credObjectName, + readPrivilege => 'allow', + modifyPrivilege => 'allow', + executePrivilege => 'allow', + changePermissionsPrivilege => 'allow' + }); + $errors .= $ec->checkAllErrors($xpath); + } + # Attach credential to steps that will need it + for my $step( @$steps ) { + if ($existingCredRef) { + $credObjectName = $existingCredRef; + } + print "Attaching credential to procedure " . $step->{procedureName} . " at step " . $step->{stepName} . "\n"; + my $apath = $ec->attachCredential( + $projName, + $credObjectName, { + procedureName => $step->{procedureName}, + stepName => $step->{stepName} + }); + $errors .= $ec->checkAllErrors($apath); + } + + if ("$errors" ne "") { + # Cleanup the partially created configuration we just created + $ec->deleteProperty($configPath); + $ec->deleteCredential($projName, $credObjectName); + my $errMsg = "Error creating configuration credential: " . $errors; + $ec->setProperty("/myJob/configError", $errMsg); + die $errMsg; + } +} + +sub gen_credential_name { + my ($config_name, $credential_name) = @_; + + if ($credential_name eq 'credential') { + return $config_name; + } + + return $config_name . '_' . $credential_name; +} diff --git a/src/main/resources/project/ec_setup.pl b/src/main/resources/project/ec_setup.pl index df618340..611c361d 100644 --- a/src/main/resources/project/ec_setup.pl +++ b/src/main/resources/project/ec_setup.pl @@ -13,7 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # - +use ElectricCommander::Util; +# External Credential Manageent Update: +# We're retrieving the steps with attached creds from property sheet +use JSON; +my $stepsWithCredentials = getStepsWithCredentials(); # Data that drives the create step picker registration for this plugin. my %checkPageStatus = ( label => "WebSphere - Check Page Status", @@ -711,298 +715,70 @@ }); } - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopServer', - stepName => 'StopInstance' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'RunCustomJob', - stepName => 'RunJob' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeployApp', - stepName => 'DeployApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'UndeployApp', - stepName => 'UndeployApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StartApp', - stepName => 'StartApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopApp', - stepName => 'StopApp' - }); - - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CheckServerStatus', - stepName => 'CheckServerStatus' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CheckApp', - stepName => 'CheckApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateDatasource', - stepName => 'CreateDatasource' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteDatasource', - stepName => 'DeleteDatasource' - }); - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateJDBCProvider', - stepName => 'CreateJDBCProvider' - }); - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJDBCProvider', - stepName => 'DeleteJDBCProvider' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeployEnterpriseApp', - stepName => 'DeployEnterpriseApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ConfigEJBContainer', - stepName => 'ConfigEJBContainer' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'UpdateApp', - stepName => 'UpdateApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateEndToEndMailProvider', - stepName => 'CreateEndToEndMailProvider' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeployOSGiApp', - stepName => 'DeployOSGiApp' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'PublishWSDL', - stepName => 'PublishWSDL' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'RemoveClusterMembers', - stepName => 'RemoveClusterMembers' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteCluster', - stepName => 'DeleteCluster' - }); - - - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateCluster', - stepName => 'CreateCluster' - }); - - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StartCluster', - stepName => 'StartCluster' - }); - - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopCluster', - stepName => 'StopCluster' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ConfigureSession', - stepName => 'ConfigureSession' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateJMSProvider', - stepName => 'CreateJMSProvider' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ListClusterMembers', - stepName => 'ListClusterMembers' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateMailSession', - stepName => 'CreateMailSession' - }); - - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'Discover', - stepName => 'DiscoverResources' - }); - # Attach the credential to the appropriate steps - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DiscoverResource', - stepName => 'DiscoverResource' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'MapSharedLibrary', - stepName => 'MapSharedLibrary' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ModifyApplicationClassLoader', - stepName => 'ModifyApplicationClassLoader' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'SyncNodes', - stepName => 'SyncNodes' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CheckNodeStatus', - stepName => 'CheckNodeStatus' - }); - - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateJMSQueue', - stepName => 'CreateOrUpdateJMSQueue' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateJMSTopic', - stepName => 'CreateOrUpdateJMSTopic' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJMSQueue', - stepName => 'DeleteJMSQueue' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJMSTopic', - stepName => 'DeleteJMSTopic' - }); - - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateWMQJMSActivationSpec', - stepName => 'CreateOrUpdateWMQJMSActivationSpec' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateSIBJMSActivationSpec', - stepName => 'CreateOrUpdateSIBJMSActivationSpec' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJMSActivationSpec', - stepName => 'DeleteJMSActivationSpec' - }); + for my $step (@$stepsWithCredentials) { + # Attach the credential to the appropriate steps + $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { + procedureName => $step->{procedureName}, + stepName => $step->{stepName} + }); + } + } + } +} - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateWMQJMSConnectionFactory', - stepName => 'CreateOrUpdateWMQJMSConnectionFactory' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateOrUpdateSIBJMSConnectionFactory', - stepName => 'CreateOrUpdateSIBJMSConnectionFactory' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJMSConnectionFactory', - stepName => 'DeleteJMSConnectionFactory' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteJMSProvider', - stepName => 'DeleteJMSProvider' - }); - # CreateApplicationServer - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateApplicationServer', - stepName => 'CreateApplicationServer' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateApplicationServerTemplate', - stepName => 'CreateApplicationServerTemplate' - }); +sub reattachExternalCredentials { + my ($otherPluginName) = @_; + + my $configName = getConfigLocation($otherPluginName); + my $configsPath = "/plugins/$otherPluginName/project/$configName"; + + my $xp = $commander->getProperty($configsPath); + + my $id = $xp->findvalue('//propertySheetId')->string_value(); + my $props = $commander->getProperties({propertySheetId => $id}); + for my $node ($props->findnodes('//property/propertySheetId')) { + my $configPropertySheetId = $node->string_value(); + my $config = $commander->getProperties({propertySheetId => $configPropertySheetId}); + + # iterate through props to get credentials. + for my $configRow ($config->findnodes('//property')) { + my $propName = $configRow->findvalue('propertyName')->string_value(); + my $propValue = $configRow->findvalue('value')->string_value(); + # print "Name $propName, value: $propValue\n"; + if ($propName =~ m/credential$/s && $propValue =~ m|^\/|s) { + for my $step (@$stepsWithCredentials) { + $batch->attachCredential({ + projectName => $pluginName, + procedureName => $step->{procedureName}, + stepName => $step->{stepName}, + credentialName => $propValue, + }); + # debug "Attached credential to $step->{stepName}"; + } + print "Reattaching $propName with val: $propValue\n"; + } + } + # exit 0; + } +} - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteApplicationServerTemplate', - stepName => 'DeleteApplicationServerTemplate' - }); +sub getConfigLocation { + my ($otherPluginName) = @_; - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StartApplicationServers', - stepName => 'StartApplicationServers' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopApplicationServers', - stepName => 'StopApplicationServers' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ExportApplicationServer', - stepName => 'ExportApplicationServer' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'ImportApplicationServer', - stepName => 'ImportApplicationServer' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'DeleteApplicationServer', - stepName => 'DeleteApplicationServer' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopDeploymentManager', - stepName => 'StopDeploymentManager' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StartDeploymentManager', - stepName => 'StartDeploymentManager' - }); + my $configName = 'websphere_cfgs'; + # my $configName = eval { + # $commander->getProperty("/plugins/$otherPluginName/project/ec_configPropertySheet")->findvalue('//value')->string_value + # } || 'ec_plugin_cfgs'; + return $configName; +} - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StopNode', - stepName => 'StopNode' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'StartNode', - stepName => 'StartNode' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateFirstClusterMember', - stepName => 'CreateFirstClusterMember' - }); - $batch->attachCredential("\$[/plugins/$pluginName/project]", $cred, { - procedureName => 'CreateClusterMembers', - stepName => 'CreateClusterMembers' - }); - } - } +sub getStepsWithCredentials { + my $retval = []; + eval { + my $pluginName = '@PLUGIN_NAME@'; + my $stepsJson = $commander->getProperty("/projects/$pluginName/procedures/CreateConfiguration/ec_stepsWithAttachedCredentials")->findvalue('//value')->string_value; + $retval = decode_json($stepsJson); + }; + return $retval; } diff --git a/src/main/resources/project/manifest.xml b/src/main/resources/project/manifest.xml index abb7e10b..e3e77062 100644 --- a/src/main/resources/project/manifest.xml +++ b/src/main/resources/project/manifest.xml @@ -367,12 +367,19 @@ //procedure[procedureName="CreateConfiguration"]/step[stepName="CreateConfiguration"]/command - conf/createcfg.pl + + conf/createConfiguration.pl //procedure[procedureName="CreateConfiguration"]/step[stepName="CreateAndAttachCredential"]/command conf/createAndAttachCredential.pl + + + //procedure[procedureName="CreateConfiguration"]/propertySheet/property[propertyName="ec_stepsWithAttachedCredentials"]/value + procedures_with_credentials.json + + conf/attemptConnection.pl //procedure[procedureName="CreateConfiguration"]/step[stepName="AttemptConnection"]/command @@ -381,6 +388,10 @@ conf/attemptConnection.pl //procedure[procedureName="EditConfiguration"]/step[stepName="AttemptConnection"]/command + + conf/editConfiguration.pl + //procedure[procedureName="EditConfiguration"]/step[stepName="EditConfiguration"]/command + //procedure[procedureName="DeleteConfiguration"]/step[stepName="DeleteConfiguration"]/command conf/deletecfg.pl @@ -926,4 +937,250 @@ server/Cluster/stopCluster.pl + + + + + pdk/Bytes/Random/Secure/Tiny.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="Bytes"]/propertySheet/property[propertyName="Random"]/propertySheet/property[propertyName="Secure"]/propertySheet/property[propertyName="Tiny.pm"]/value + + + pdk/FlowPDF.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF.pm"]/value + + + pdk/FlowPDF/Devel/Stacktrace.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Devel"]/propertySheet/property[propertyName="Stacktrace.pm"]/value + + + pdk/FlowPDF/Exception.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception.pm"]/value + + + pdk/FlowPDF/StepParameters.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="StepParameters.pm"]/value + + + pdk/FlowPDF/BaseClass.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="BaseClass.pm"]/value + + + pdk/FlowPDF/Types/Scalar.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="Scalar.pm"]/value + + + pdk/FlowPDF/Types/Regexp.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="Regexp.pm"]/value + + + pdk/FlowPDF/Types/ArrayrefOf.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="ArrayrefOf.pm"]/value + + + pdk/FlowPDF/Types/Reference.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="Reference.pm"]/value + + + pdk/FlowPDF/Types/Any.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="Any.pm"]/value + + + pdk/FlowPDF/Types/Enum.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types"]/propertySheet/property[propertyName="Enum.pm"]/value + + + pdk/FlowPDF/Log.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Log.pm"]/value + + + pdk/FlowPDF/Config.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Config.pm"]/value + + + pdk/FlowPDF/Throwable.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Throwable.pm"]/value + + + pdk/FlowPDF/Constants.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Constants.pm"]/value + + + pdk/FlowPDF/Component/EF.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF.pm"]/value + + + pdk/FlowPDF/Component/Proxy.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="Proxy.pm"]/value + + + pdk/FlowPDF/Component/CLI/Command.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="CLI"]/propertySheet/property[propertyName="Command.pm"]/value + + + pdk/FlowPDF/Component/CLI/ExecutionResult.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="CLI"]/propertySheet/property[propertyName="ExecutionResult.pm"]/value + + + pdk/FlowPDF/Component/CLI.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="CLI.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Metadata.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Metadata.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/MetadataFactory.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="MetadataFactory.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Payloadset.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Payloadset.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Engine.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Engine.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Dataset.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Dataset.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Payload.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Payload.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Transformer.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Transformer.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting/Data.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting"]/propertySheet/property[propertyName="Data.pm"]/value + + + pdk/FlowPDF/Component/EF/Reporting.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="Reporting.pm"]/value + + + pdk/FlowPDF/Component/OAuth.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component"]/propertySheet/property[propertyName="OAuth.pm"]/value + + + pdk/FlowPDF/Types.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Types.pm"]/value + + + pdk/FlowPDF/Context.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Context.pm"]/value + + + pdk/FlowPDF/BaseClass2.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="BaseClass2.pm"]/value + + + pdk/FlowPDF/ContextFactory.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="ContextFactory.pm"]/value + + + pdk/FlowPDF/ComponentManager.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="ComponentManager.pm"]/value + + + pdk/FlowPDF/Log/FW.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Log"]/propertySheet/property[propertyName="FW.pm"]/value + + + pdk/FlowPDF/StepResult/Action.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="StepResult"]/propertySheet/property[propertyName="Action.pm"]/value + + + pdk/FlowPDF/EF/PostP.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="PostP.pm"]/value + + + pdk/FlowPDF/EF/OutputParameters.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="EF"]/propertySheet/property[propertyName="OutputParameters.pm"]/value + + + pdk/FlowPDF/Component.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Component.pm"]/value + + + pdk/FlowPDF/StepResult.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="StepResult.pm"]/value + + + pdk/FlowPDF/Parameter.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Parameter.pm"]/value + + + pdk/FlowPDF/Service/Bootstrap.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Service"]/propertySheet/property[propertyName="Bootstrap.pm"]/value + + + pdk/FlowPDF/Service/RSA.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Service"]/propertySheet/property[propertyName="RSA.pm"]/value + + + pdk/FlowPDF/Exception/ConfigDoesNotExist.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="ConfigDoesNotExist.pm"]/value + + + pdk/FlowPDF/Exception/WrongFunctionArgumentType.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="WrongFunctionArgumentType.pm"]/value + + + pdk/FlowPDF/Exception/UnexpectedEmptyValue.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="UnexpectedEmptyValue.pm"]/value + + + pdk/FlowPDF/Exception/MissingFunctionArgument.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="MissingFunctionArgument.pm"]/value + + + pdk/FlowPDF/Exception/RuntimeException.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="RuntimeException.pm"]/value + + + pdk/FlowPDF/Exception/EntityDoesNotExist.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="EntityDoesNotExist.pm"]/value + + + pdk/FlowPDF/Exception/EntityAlreadyExists.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="EntityAlreadyExists.pm"]/value + + + pdk/FlowPDF/Exception/MissingFunctionDefinition.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="MissingFunctionDefinition.pm"]/value + + + pdk/FlowPDF/Exception/WrongFunctionArgumentValue.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="WrongFunctionArgumentValue.pm"]/value + + + pdk/FlowPDF/Exception/UnexpectedMissingValue.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Exception"]/propertySheet/property[propertyName="UnexpectedMissingValue.pm"]/value + + + pdk/FlowPDF/Client/REST.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Client"]/propertySheet/property[propertyName="REST.pm"]/value + + + pdk/FlowPDF/Client/REST/Auth.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Client"]/propertySheet/property[propertyName="REST"]/propertySheet/property[propertyName="Auth.pm"]/value + + + pdk/FlowPDF/Helpers.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Helpers.pm"]/value + + + pdk/FlowPDF/Credential.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="FlowPDF"]/propertySheet/property[propertyName="Credential.pm"]/value + + + pdk/Try/Tiny.pm + //property[propertyName="pdk"]/propertySheet/property[propertyName="Try"]/propertySheet/property[propertyName="Tiny.pm"]/value + + + + diff --git a/src/main/resources/project/pdk/Bytes/Random/Secure/Tiny.pm b/src/main/resources/project/pdk/Bytes/Random/Secure/Tiny.pm new file mode 100644 index 00000000..c14f0d1f --- /dev/null +++ b/src/main/resources/project/pdk/Bytes/Random/Secure/Tiny.pm @@ -0,0 +1,384 @@ +## no critic (ProhibitMultiplePackages,RequireFilenameMatchesPackage) + +# Bytes::Random::Secure::Tiny: A single source file implementation of +# Bytes::Random::Secure, and its dependencies. + +# Crypt::Random::Seed::Embedded, adapted with consent from # +# Crypt::Random::Seed, by Dana Jacobson. # + +package Crypt::Random::Seed::Embedded; +use strict; +use warnings; +use Fcntl; +use Carp qw/croak/; + +## no critic (constant) +our $VERSION = '1.008'; +use constant UINT32_SIZE => 4; + +sub new { + my ($class, %params) = @_; + $params{lc $_} = delete $params{$_} for keys %params; + $params{nonblocking} + = defined $params{nonblocking} ? $params{nonblocking} : 1; + my $self = {}; + my @methodlist + = ( \&_try_win32, \&_try_dev_random, \&_try_dev_urandom ); + foreach my $m (@methodlist) { + my ($name, $rsub, $isblocking, $isstrong) = $m->(); + next unless defined $name; + next if $isblocking && $params{nonblocking}; + @{$self}{qw( Name SourceSub Blocking Strong )} + = ( $name, $rsub, $isblocking, $isstrong ); + last; + } + return defined $self->{SourceSub} ? bless $self, $class : (); +} + +sub random_values { + my ($self, $nvalues) = @_; + return unless defined $nvalues && int($nvalues) > 0; + my $rsub = $self->{SourceSub}; + return unpack( 'L*', $rsub->(UINT32_SIZE * int($nvalues)) ); +} + +sub _try_dev_urandom { + return unless -r "/dev/urandom"; + return ('/dev/urandom', sub { __read_file('/dev/urandom', @_); }, 0, 0); +} + +sub _try_dev_random { + return unless -r "/dev/random"; + my $blocking = $^O eq 'freebsd' ? 0 : 1; + return ('/dev/random', sub {__read_file('/dev/random', @_)}, $blocking, 1); +} + +sub __read_file { + my ($file, $nbytes) = @_; + return unless defined $nbytes && $nbytes > 0; + sysopen(my $fh, $file, O_RDONLY); + binmode $fh; + my($s, $buffer, $nread) = ('', '', 0); + while ($nread < $nbytes) { + my $thisread = sysread $fh, $buffer, $nbytes-$nread; + croak "Error reading $file: $!\n" + unless defined $thisread && $thisread > 0; + $s .= $buffer; + $nread += length($buffer); + } + croak "Internal file read error: wanted $nbytes, read $nread" + unless $nbytes == length($s); # assert + return $s; +} + +sub _try_win32 { + return unless $^O eq 'MSWin32'; + eval { require Win32; require Win32::API; require Win32::API::Type; 1; } + or return; + use constant CRYPT_SILENT => 0x40; # Never display a UI. + use constant PROV_RSA_FULL => 1; # Which service provider. + use constant VERIFY_CONTEXT => 0xF0000000; # Don't need existing keepairs + use constant W2K_MAJOR_VERSION => 5; # Windows 2000 + use constant W2K_MINOR_VERSION => 0; + my ($major, $minor) = (Win32::GetOSVersion())[1, 2]; + return if $major < W2K_MAJOR_VERSION; + + if ($major == W2K_MAJOR_VERSION && $minor == W2K_MINOR_VERSION) { + # We are Windows 2000. Use the older CryptGenRandom interface. + my $crypt_acquire_context_a = + Win32::API->new('advapi32', 'CryptAcquireContextA', 'PPPNN','I'); + return unless defined $crypt_acquire_context_a; + my $context = chr(0) x Win32::API::Type->sizeof('PULONG'); + my $result = $crypt_acquire_context_a->Call( + $context, 0, 0, PROV_RSA_FULL, CRYPT_SILENT | VERIFY_CONTEXT ); + return unless $result; + my $pack_type = Win32::API::Type::packing('PULONG'); + $context = unpack $pack_type, $context; + my $crypt_gen_random = + Win32::API->new( 'advapi32', 'CryptGenRandom', 'NNP', 'I' ); + return unless defined $crypt_gen_random; + return ('CryptGenRandom', + sub { + my $nbytes = shift; + my $buffer = chr(0) x $nbytes; + my $result = $crypt_gen_random->Call($context, $nbytes, $buffer); + croak "CryptGenRandom failed: $^E" unless $result; + return $buffer; + }, 0, 1); # Assume non-blocking and strong + } else { + my $rtlgenrand = Win32::API->new( 'advapi32', <<'_RTLGENRANDOM_PROTO_'); +INT SystemFunction036( + PVOID RandomBuffer, + ULONG RandomBufferLength +) +_RTLGENRANDOM_PROTO_ + return unless defined $rtlgenrand; + return ('RtlGenRand', + sub { + my $nbytes = shift; + my $buffer = chr(0) x $nbytes; + my $result = $rtlgenrand->Call($buffer, $nbytes); + croak "RtlGenRand failed: $^E" unless $result; + return $buffer; + }, 0, 1); # Assume non-blocking and strong + } + return; +} + +1; + +# Math::Random::ISAAC::PP::Embedded: Adapted from # +# Math::Random::ISAAC and Math::Random::ISAAC::PP. # + +## no critic (constant,unpack) + +package Math::Random::ISAAC::PP::Embedded; + +use strict; +use warnings; + +our $VERSION = '1.008'; +use constant { + randrsl => 0, randcnt => 1, randmem => 2, + randa => 3, randb => 4, randc => 5, +}; + +sub new { + my ($class, @seed) = @_; + my $seedsize = scalar(@seed); + my @mm; + $#mm = $#seed = 255; # predeclare arrays with 256 slots + $seed[$_] = 0 for $seedsize .. 255; # Zero-fill unused seed space. + my $self = [ \@seed, 0, \@mm, 0, 0, 0 ]; + bless $self, $class; + $self->_randinit; + return $self; +} + +sub irand { + my $self = shift; + if (!$self->[randcnt]--) { + $self->_isaac; + $self->[randcnt] = 255; + } + return sprintf('%u', $self->[randrsl][$self->[randcnt]]); +} + +## no critic (RequireNumberSeparators,ProhibitCStyleForLoops) + +sub _isaac { + my $self = shift; + use integer; + my($mm, $r, $aa) = @{$self}[randmem,randrsl,randa]; + my $bb = ($self->[randb] + (++$self->[randc])) & 0xffffffff; + my ($x, $y); # temporary storage + for (my $i = 0; $i < 256; $i += 4) { + $x = $mm->[$i ]; + $aa = (($aa ^ ($aa << 13)) + $mm->[($i + 128) & 0xff]); + $aa &= 0xffffffff; # Mask out high bits for 64-bit systems + $mm->[$i ] = $y = ($mm->[($x >> 2) & 0xff] + $aa + $bb) & 0xffffffff; + $r->[$i ] = $bb = ($mm->[($y >> 10) & 0xff] + $x) & 0xffffffff; + + $x = $mm->[$i+1]; + $aa = (($aa ^ (0x03ffffff & ($aa >> 6))) + $mm->[($i+1+128) & 0xff]); + $aa &= 0xffffffff; + $mm->[$i+1] = $y = ($mm->[($x >> 2) & 0xff] + $aa + $bb) & 0xffffffff; + $r->[$i+1] = $bb = ($mm->[($y >> 10) & 0xff] + $x) & 0xffffffff; + + $x = $mm->[$i+2]; + $aa = (($aa ^ ($aa << 2)) + $mm->[($i+2 + 128) & 0xff]); + $aa &= 0xffffffff; + $mm->[$i+2] = $y = ($mm->[($x >> 2) & 0xff] + $aa + $bb) & 0xffffffff; + $r->[$i+2] = $bb = ($mm->[($y >> 10) & 0xff] + $x) & 0xffffffff; + + $x = $mm->[$i+3]; + $aa = (($aa ^ (0x0000ffff & ($aa >> 16))) + $mm->[($i+3 + 128) & 0xff]); + $aa &= 0xffffffff; + $mm->[$i+3] = $y = ($mm->[($x >> 2) & 0xff] + $aa + $bb) & 0xffffffff; + $r->[$i+3] = $bb = ($mm->[($y >> 10) & 0xff] + $x) & 0xffffffff; + } + @{$self}[randb, randa] = ($bb,$aa); + return; +} + +sub _randinit { + my $self = shift; + use integer; + my ($c, $d, $e, $f, $g, $h, $j, $k) = (0x9e3779b9)x8; # The golden ratio. + my ($mm, $r) = @{$self}[randmem,randrsl]; + for (1..4) { + $c ^= $d << 11; $f += $c; $d += $e; + $d ^= 0x3fffffff & ($e >> 2); $g += $d; $e += $f; + $e ^= $f << 8; $h += $e; $f += $g; + $f ^= 0x0000ffff & ($g >> 16); $j += $f; $g += $h; + $g ^= $h << 10; $k += $g; $h += $j; + $h ^= 0x0fffffff & ($j >> 4); $c += $h; $j += $k; + $j ^= $k << 8; $d += $j; $k += $c; + $k ^= 0x007fffff & ($c >> 9); $e += $k; $c += $d; + } + for (my $i = 0; $i < 256; $i += 8) { + $c += $r->[$i ]; $d += $r->[$i+1]; + $e += $r->[$i+2]; $f += $r->[$i+3]; + $g += $r->[$i+4]; $h += $r->[$i+5]; + $j += $r->[$i+6]; $k += $r->[$i+7]; + $c ^= $d << 11; $f += $c; $d += $e; + $d ^= 0x3fffffff & ($e >> 2); $g += $d; $e += $f; + $e ^= $f << 8; $h += $e; $f += $g; + $f ^= 0x0000ffff & ($g >> 16); $j += $f; $g += $h; + $g ^= $h << 10; $k += $g; $h += $j; + $h ^= 0x0fffffff & ($j >> 4); $c += $h; $j += $k; + $j ^= $k << 8; $d += $j; $k += $c; + $k ^= 0x007fffff & ($c >> 9); $e += $k; $c += $d; + $mm->[$i ] = $c; $mm->[$i+1] = $d; + $mm->[$i+2] = $e; $mm->[$i+3] = $f; + $mm->[$i+4] = $g; $mm->[$i+5] = $h; + $mm->[$i+6] = $j; $mm->[$i+7] = $k; + } + for (my $i = 0; $i < 256; $i += 8) { + $c += $mm->[$i ]; $d += $mm->[$i+1]; + $e += $mm->[$i+2]; $f += $mm->[$i+3]; + $g += $mm->[$i+4]; $h += $mm->[$i+5]; + $j += $mm->[$i+6]; $k += $mm->[$i+7]; + $c ^= $d << 11; $f += $c; $d += $e; + $d ^= 0x3fffffff & ($e >> 2); $g += $d; $e += $f; + $e ^= $f << 8; $h += $e; $f += $g; + $f ^= 0x0000ffff & ($g >> 16); $j += $f; $g += $h; + $g ^= $h << 10; $k += $g; $h += $j; + $h ^= 0x0fffffff & ($j >> 4); $c += $h; $j += $k; + $j ^= $k << 8; $d += $j; $k += $c; + $k ^= 0x007fffff & ($c >> 9); $e += $k; $c += $d; + $mm->[$i ] = $c; $mm->[$i+1] = $d; + $mm->[$i+2] = $e; $mm->[$i+3] = $f; + $mm->[$i+4] = $g; $mm->[$i+5] = $h; + $mm->[$i+6] = $j; $mm->[$i+7] = $k; + } + $self->_isaac; + $self->[randcnt] = 256; + return; +} + +1; + +package Math::Random::ISAAC::Embedded; + +use strict; +use warnings; + +our $VERSION = '1.008'; +use constant _backend => 0; + +my %CSPRNG = ( + XS => 'Math::Random::ISAAC::XS', + PP => 'Math::Random::ISAAC::PP', + EM => 'Math::Random::ISAAC::PP::Embedded', +); + +sub new { + my ($class, @seed) = @_; + our $EMBEDDED_CSPRNG = + defined $EMBEDDED_CSPRNG ? $EMBEDDED_CSPRNG : + defined $ENV{'BRST_EMBEDDED_CSPRNG'} ? $ENV{'BRST_EMBEDDED_CSPRNG'} : 0; + my $DRIVER = + $EMBEDDED_CSPRNG ? $CSPRNG{'EM'} : + eval {require Math::Random::ISAAC::XS; 1} ? $CSPRNG{'XS'} : + eval {require Math::Random::ISAAC::PP; 1} ? $CSPRNG{'PP'} : + $CSPRNG{'EM'}; + return bless [$DRIVER->new(@seed)], $class; +} + +sub irand {shift->[_backend]->irand} + +1; + +package Bytes::Random::Secure::Tiny; + +use strict; +use warnings; +use 5.006000; +use Carp qw(croak); +use Hash::Util; + +our $VERSION = '1.008'; + +# See Math::Random::ISAAC https://rt.cpan.org/Public/Bug/Display.html?id=64324 +use constant SEED_SIZE => 256; # bits; eight 32-bit words. + +sub new { + my($self, $class, %args) = ({}, @_); + $args{lc $_} = delete $args{$_} for keys %args; # Convert args to lc names + my $bits = SEED_SIZE; # Default: eight 32bit words. + $bits = delete $args{bits} if exists $args{bits}; + croak "Number of bits must be 64 <= n <= 8192, and a multipe in 2^n: $bits" + if $bits < 64 || $bits > 8192 || !_ispowerof2($bits); + return Hash::Util::lock_hashref bless { + bits => $bits, + _rng => Math::Random::ISAAC::Embedded->new(do{ + my $source = Crypt::Random::Seed::Embedded->new(%args) + or croak 'Could not get a seed source.'; + $source->random_values($bits/32); + }), + }, $class; +} + +sub _ispowerof2 {my $n = shift; return ($n >= 0) && (($n & ($n-1)) ==0 )} +sub irand {shift->{'_rng'}->irand} +sub bytes_hex {unpack 'H*', shift->bytes(shift)} # lc Hex digits only, no '0x' + +sub bytes { + my($self, $bytes) = @_; + $bytes = defined $bytes ? int abs $bytes : 0; # Default 0, coerce to UINT. + my $str = q{}; + while ($bytes >= 4) { # Utilize irand()'s 32 bits. + $str .= pack("L", $self->irand); + $bytes -= 4; + } + if ($bytes > 0) { # Handle 16b and 8b respectively. + $str .= pack("S", ($self->irand >> 8) & 0xFFFF) if $bytes >= 2; + $str .= pack("C", $self->irand & 0xFF) if $bytes % 2; + } + return $str; +} + +sub string_from { + my($self, $bag, $bytes) = @_; + $bag = defined $bag ? $bag : q{}; + $bytes = defined $bytes ? int abs $bytes : 0; + my $range = length $bag; + croak 'Bag size must be at least one character.' unless $range; + my $rand_bytes = q{}; # We need an empty, defined string. + $rand_bytes .= substr $bag, $_, 1 for @{$self->_ranged_randoms($range, $bytes)}; + return $rand_bytes; +} + +sub shuffle { + my($self, $aref) = @_; + croak 'Argument must be an array reference.' unless 'ARRAY' eq ref $aref; + return $aref unless @$aref; + for (my $i = @$aref; --$i;) { + my $r = $self->_ranged_randoms($i+1, 1)->[0]; + ($aref->[$i],$aref->[$r]) = ($aref->[$r], $aref->[$i]); + } + return $aref; +} + +sub _ranged_randoms { + my ($self, $range, $count) = @_; + $_ = defined $_ ? $_ : 0 for $count, $range; + croak "$range exceeds irand max limit of 2^^32." if $range > 2**32; + # Find nearest factor of 2**32 >= $range. + my $divisor = do { + my ($n, $d) = (0,0); + while ($n <= 32 && $d < $range) {$d = 2 ** $n++} + $d; + }; + my @randoms; + $#randoms = $count-1; @randoms = (); # Microoptimize: Preextend & purge. + for my $n (1 .. $count) { # re-roll if r-num is out of bag range (modbias) + my $rand = $self->irand % $divisor; + $rand = $self->irand % $divisor while $rand >= $range; + push @randoms, $rand; + } + return \@randoms; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF.pm b/src/main/resources/project/pdk/FlowPDF.pm new file mode 100644 index 00000000..4314bcd3 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF.pm @@ -0,0 +1,430 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF; + +=head1 NAME + +FlowPDF + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +FlowPDF is an Flow Plugin Development Framework. + +This tool has been created to make plugin development easier. + +To use it one should extend this class and define pluginInfo which should return a hash reference with following fields: + +=over 4 + +=item * B + +A name of the plugin. @PLUGIN_KEY@ could be used to be replaced with plugin name during plugin build-time. + +=item * B + +A version of the plugin. @PLUGIN_VERSION@ could be used to be replaced with version during build-time. + +=item * B + +An array reference, that represents fields that would be used by plugin as a reference to plugin configurations. +For example, one could use ['config', 'configName'] to say that config name could be found in these parameter values. + +B This list will be used from left to right, so, in example above configName will be used only if there is no procedure parameter with name 'config'. + +=item * B + +An array reference with locations of plugin configurations. In all new plugins it will be set to ['ec_plugin_cfgs']. Precedence is the same, as in configFields. + +=back + +=head1 SYNOPSIS + +Example of a plugin main class: + +%%%LANG=perl%%% + + package EC::Plugin::NewRest; + use strict; + use warnings; + use base qw/FlowPDF/; + # Service function that is being used to set some metadata for a plugin. + sub pluginInfo { + return { + pluginName => '@PLUGIN_KEY@', + pluginVersion => '@PLUGIN_VERSION@', + configFields => ['config'], + configLocations => ['ec_plugin_cfgs'] + }; + } + sub step_do_something { + my ($pluginObject) = @_; + my $context = $pluginObject->newContext(); + # This will show where we are. It could be procedure, pipeline or schedule + print "Current context is: ", $context->getRunContext(), "\n"; + # This will get a step parameters. + # $params now will be an L object. + my $params = $context->getStepParameters(); + # This gets $headers parameter that is being stored under request_headers field of procedure. + # To get value of this parameter one should 1. get parameter object 2. get a value if it is defined + my $headers = $params->getParameter('request_headers'); + # This will return a config values for current procedure including credentials. + # For configuration lookup see section above. + my $configValues = $context->getConfigValues(); + # This creates a step result object, which handles actions that should be done during or after step execution + my $stepResult = $context->newStepResult(); + # schedule setting a job step outcome to warning + $stepResult->setJobStepOutcome('warning'); + # schedule setting a whole job summary: + $stepResult->setJobSummary("See, this is a whole job summary"); + # schedule setting a current jobstep summary + $stepResult->setJobStepSummary('And this is a job step summary'); + # abd, finally, apply all scheduled settings. + $stepResult->apply(); + } + +%%%LANG%%% + +=head1 METHODS + +=cut + +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + pluginName => FlowPDF::Types::Scalar(), + pluginVersion => FlowPDF::Types::Scalar(), + configFields => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + configLocations => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + contextFactory => FlowPDF::Types::Reference('FlowPDF::ContextFactory'), + pluginValues => FlowPDF::Types::Reference('HASH'), + contextObject => FlowPDF::Types::Reference('FlowPDF::Context'), + defaultConfigValues => FlowPDF::Types::Reference('HASH') +}); + +use strict; +use warnings; + +use Carp; +use Data::Dumper; +use Try::Tiny; + +use FlowPDF::Service::Bootstrap; +use FlowPDF::ContextFactory; +use FlowPDF::ComponentManager; +use FlowPDF::Helpers qw/inArray/; +use FlowPDF::Log; +use FlowPDF::Log::FW; + +use FlowPDF::Exception::MissingFunctionDefinition; +use FlowPDF::Exception::MissingFunctionArgument; + +our $VERSION = '1.3.4'; + +# We need to do an autoflush for STDOUT and STDERR to not mess up output streams. +# $| is a local variable for currently selected file descriptor. +# we're selecting STDOUT and enabling autoflush, and the same thing is being performed for STDERR. +BEGIN { + select (STDERR); + $| = 1; + select (STDOUT); + $| = 1; +}; + +sub classDefinition { + return { + + }; +} + +=head2 newContext() + +=head3 Description + +Creates L object. Does not require any additional parameters. + +Please, note, that this function always creates a new context object. + +If you want to use already existing context object, consider to use a getContext() method. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +%%%LANG=perl%%% + + my $context = $pluginObject->newContext(); + +%%%LANG%%% + +=cut + + +sub newContext { + my ($pluginObject) = @_; + + my $context = $pluginObject->getContextFactory()->newContext($pluginObject); + return $context; +} + + +=head2 getContext() + +=head3 Description + +This method returns already created L object. Does not require any additional parameters. + +If this method is being used first time, it creates new context object and returns it. Each next call will return exactly this object. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +%%%LANG=perl%%% + + my $context = $pluginObject->getContext(); + +%%%LANG%%% + +=cut + +sub getContext { + my ($pluginObject) = @_; + + my $context = $pluginObject->getContextObject(); + if ($context) { + return $context; + } + $context = $pluginObject->getContextFactory()->newContext($pluginObject); + $pluginObject->setContextObject($context); + return $context; +} + + +# this function is here to be a placeholder for real pluginInfo function that is being defined by plugin object. +sub pluginInfo {} + +sub showEnvironmentInfo { + my ($class, $procedureName, $stepName) = @_; + try { + require ElectricCommander; + my $ec = ElectricCommander->new(); + $ec->abortOnError(0); + my $xpath = $ec->getServerStatus(); + + my $version = $xpath->findvalue('//serverVersion/version')->string_value(); + if (!$version) { + $version = $ElectricCommander::VERSION; + } + my $delimiter = '=' x 60; + my $messageTemplate = qq|$delimiter + +Plugin Name : %s +Plugin Version : %s +Procedure Name : %s +Step Name : %s +CloudBees CD version : $version +FlowPDF-Perl version : $VERSION + +$delimiter + +|; + my $pluginInfo = $class->pluginInfo(); + my $message = sprintf( + $messageTemplate, + $pluginInfo->{pluginName}, + $pluginInfo->{pluginVersion}, + $procedureName, + $stepName + ); + logInfo $message; + }; +} + + +sub runStep { + my ($class, $procedureName, $stepName, $function) = @_; + + $class->showEnvironmentInfo($procedureName, $stepName); + fwLogTrace("Running runStep function"); + + if (!$class->can($function)) { + FlowPDF::Exception::MissingFunctionDefinition->new({ + class => $class, + function => $function + })->throw(); + } + if (!$class->can('pluginInfo')) { + FlowPDF::Exception::MissingFunctionDefinition->new({ + class => $class, + function => 'pluginInfo' + })->throw(); + } + fwLogTrace("Executing pluginInfo()"); + my $pluginInfo = $class->pluginInfo(); + + my $flowpdf = $class->new({ + pluginName => $pluginInfo->{pluginName}, + pluginVersion => $pluginInfo->{pluginVersion}, + configFields => $pluginInfo->{configFields}, + configLocations => $pluginInfo->{configLocations}, + contextFactory => FlowPDF::ContextFactory->new({ + procedureName => $procedureName, + stepName => $stepName + }) + }); + fwLogTrace("Setting default config values."); + if ($pluginInfo->{defaultConfigValues}) { + $flowpdf->setDefaultConfigValues($pluginInfo->{defaultConfigValues}); + } + fwLogTrace("Getting context object."); + my $context = $flowpdf->getContext(); + fwLogTrace("Getting runtime parameters."); + my $runtimeParameters = $context->getRuntimeParameters(); + fwLogTrace("Creating stepResult object"); + my $stepResult = $context->newStepResult(); + + # if pluginvalues has been passed, it will be added to plugin object. + if ($pluginInfo->{pluginValues}) { + fwLogTrace("Setting pluginValues"); + $flowpdf->setPluginValues($pluginInfo->{pluginValues}); + } + + # From now control is passed to the user functions. + my $retval; + # This handles an exception from plugin code that was not handled for any reason. + # It is the default handler for exceptions. It will propagate an err + try { + $retval = $flowpdf->$function($runtimeParameters, $stepResult); + } catch { + my ($e) = @_; + + $stepResult->flush(); + my $fullExceptionString; + my $briefExceptionString; + # this handler for FlowPDF::Exception::* + if (ref($e) && ref($e) =~ m/^FlowPDF::Exception/s) { + $fullExceptionString = $e->toString(); + $briefExceptionString = $e->toString({dropStackTrace => 1}); + } + # This for regular die/croak + else { + $fullExceptionString = $e; + $briefExceptionString = $e; + } + logErrorDiag($fullExceptionString); + if ($context->getRunContext() eq 'pipeline') { + $stepResult->setPipelineSummary('Unhandled Exception:', $briefExceptionString); + } + $stepResult->setJobStepOutcome('error'); + $stepResult->setJobStepSummary($briefExceptionString); + } finally { + $stepResult->applyIfNotApplied(); + }; + return $retval; +} + + +=head2 getPluginProjectName() + +=head3 Description + +This method returns a complete name of your plugin with version as string. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) PluginName-PluginVersion; + +=back + +%%%LANG=perl%%% + + my $pluginProjectName = $pluginObject->getPluginProjectName(); + +%%%LANG%%% + +=cut + + +sub getPluginProjectName { + my ($self) = @_; + + my $pluginProjectName = sprintf( + '%s-%s', + $self->getPluginName(), + $self->getPluginVersion() + ); + + return $pluginProjectName; +} + +=head1 SEE ALSO + +=head2 L + +=head2 L + +=head2 L + +=cut + + +# a private method to get is that field name is a field name for a config. +sub isConfigField { + my ($self, $field) = @_; + + if (!$field) { + FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'field', + function => 'isConfigField' + })->throw(); + } + + my $configFields = $self->getConfigFields(); + if (inArray($field, @$configFields)) { + return 1; + } + + return 0; +} +1; diff --git a/src/main/resources/project/pdk/FlowPDF/BaseClass.pm b/src/main/resources/project/pdk/FlowPDF/BaseClass.pm new file mode 100644 index 00000000..104c8d97 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/BaseClass.pm @@ -0,0 +1,195 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 DEPRECATION NOTE + +This class has been deprecated and L should be used instead. + +This class works aroung perl AUTOLOAD mechanism, which is extremely hard to debug. + +=head1 NAME + +FlowPDF::BaseClass + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +FlowPDF::BaseClass is the base class for the classes across FlowPDF SDK. + +This class creates in runtime accessors for class properties and creates a new() method as constructor. + +This class was designed for internal usage for developers of FlowPDF Perl SDK. + +=head1 USAGE + +To use base class one need to: + +=over 4 + +=item Create a class + +=item Make this class as base using use base + +=item Create classDefinition() method which returns a hashref with class definition. + +=back + +=head1 USAGE + +%%%LANG=perl%%% + + package MyClass; + use base qw/FlowPDF::BaseClass/; + use strict; + sub classDefinition { + return { + name => 'str', + value => 'str' + }; + } + + 1; + +%%%LANG%%% + +After this class has been created, you can use it and have an accessors/constructors. + +%%%LANG=perl%%% + + use MyClass; + my $object = MyClass->new({name => 'one', value => 'two'}); + # name = one + my $name = $object->getName(); + # value = two + my $value = $object->getValue(); + +%%%LANG%%% + +=cut + +package FlowPDF::BaseClass; + +use strict; +use warnings; +use Data::Dumper; +use Carp; +use FlowPDF::Log; +use FlowPDF::Helpers qw/bailOut/; + +our $AUTOLOAD; + +sub AUTOLOAD { + my ($class, @args) = @_; + + # if (!$class) { + # bailOut("Method $AUTOLOAD does not exist in the current scope"); + # } + if (!$class->can('classDefinition')) { + bailOut("classDefinition method should be set to make this working."); + } + my $method = $AUTOLOAD; + $method =~ s/.*:://; + my $definition = $class->classDefinition(); + if ($method eq 'new') { + my $object = __checkParams($class, $definition, @args); + + bless $object, $class; + return $object; + } + if ($method eq 'get' || $method eq 'set') { + my $msg = "$method is not defined. "; + if ($method eq 'get' && $args[0]) { + my $method = ucfirst($args[0]); + $method = "get$method()"; + $msg .= sprintf(q|To get a value of '%s' field of '%s' %s->%s should be used.|, $args[0], ref $class, ref $class, $method); + } + elsif ($method eq 'set' && $args[0] && $args[1]) { + my $method = ucfirst($args[0]); + $method = "set$method"; + $msg .= sprintf('To get a value of %s field of class, %s(%s) should be used', $args[0], $method, $args[1]); + } + bailOut($msg); + } + if ($method =~ m/^get(.*?)$/s) { + my $field = $1; + + $field = __returnFieldName($class, $field, $definition); + return __get($class, $definition, $field, @args); + } + if ($method =~ m/^set(.*?)$/s) { + my $field = $1; + + $field = __returnFieldName($class, $field, $definition); + return __set($class, $definition, $field, @args); + } + + bailOut("Unknown method '$method' in class '$class'"); + +} + +# This function is empty for a reason, please, see https://www.perlmonks.org/?node_id=1124504 +sub DESTROY {} +sub import {} +sub __get { + my ($object, $definition, $field, $opts) = @_; + + if (!$field) { + bailOut("Field $field is mandatory."); + } + my $rv = undef; + if (defined $object->{$field}) { + $rv = $object->{$field}; + return $rv; + } + return undef; +} + +sub __set { + my ($object, $definition, $field, $value, $opts) = @_; + + if (!$field) { + croak "Field is mandatory"; + } + if (!$definition->{$field}) { + croak "Field $field is not allowed in " . ref $object . "\n"; + } + + if ($definition->{$field} =~ m/^[A-Z]/s && (!ref $value || ref $value ne $definition->{$field})) { + croak "Value for $field is expected to be a $definition->{field}, but not a " . ref $value; + } + $object->{$field} = $value; + return $object; +} + +sub __checkParams { + my ($class, $definition, $params) = @_; + for my $k (keys %$params) { + if (!$definition->{$k}) { + croak "Key $k is not defined for $class\n"; + } + my $value = $params->{$k}; + if ($definition->{$k} =~ m/^[A-Z]/s && (!ref $value || ref $value ne $definition->{$k})) { + my $ref = ref $value || 'unblessed reference'; + croak "Value for $k is expected to be a type of $definition->{$k}, but not a " . $ref; + } + } + return $params; +} + +sub __returnFieldName { + my ($class, $field, $definition) = @_; + + $field = lcfirst $field; + if (!$definition->{$field}) { + croak "Field $field does not exist in class $class"; + } + + return $field; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/BaseClass2.pm b/src/main/resources/project/pdk/FlowPDF/BaseClass2.pm new file mode 100644 index 00000000..3d4499ac --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/BaseClass2.pm @@ -0,0 +1,207 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::BaseClass2; + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class is desined to be the base class for an internal classes of FlowPDF. Using this class gives following benefits: + +=over + +=item Automatic generation of constructor. + +=item Automatic generation of getters/setters. + +=item Types validation for setters/constructors. + +=item Inheritance support. + +=back + +=head1 USAGE + +To use this class, following 2 conditions should be met. + +=over + +=item Your class should be inherited from this class. + +=item defineClass method should be called. + +=back + +=head2 defineClass method + +defineClass is a method that is being used to generate type checkers, getters, setters and constructor for your class. +This mehod accepts as single parameter a hash reference with where keys are the field names and values are types for these fields. + +To get information about type validators see L documentation. + +Also, note that this class was designed with camelCase in mind, so if you defining field "one" and field twoThree for YourClass, +following getters/setters will be generated alongside with new() function: + +=over + +=item getOne() + +=item setOne() + +=item getTwoThree() + +=item setTwoThree() + +=back + +As you see, first letter of field was capitalized, and get/set prepended to this field name. + +=head3 Parameters + +=over 4 + +=item (Required)(HASH reference) A hash reference in format field => type. + +=back + +=head2 Example of a class + +Following example demonstrates this approach: + +%%%LANG=perl%%% + + package YourClass; + use base FlowPDF::BaseClass2; + use strict; + use warnings; + + # if you're not a perl expert, __PACKAGE__ is a kinda macro, + # which is being replaced with package name during compile time. + # so, __PACKAGE__->method() and YourClass->method() are the same calls. + __PACKAGE__->defineClass({ + one => FlowPDF::Types::Scalar(), + two => FlowPDF::Types::Reference('HASH') + }); + + 1; + +%%%LANG%%% + +After your class is defined as above, you can use a benefits from this package. + +To create an object of YourClass; + +%%%LANG=perl%%% + + use YourClass; + my $o = YourClass->new({ + one => 'hello', + two => { + three => 'four' + } + }); + + print $o->getOne(); + $o->setOne('world'); + print $o->getOne(), "\n"; + +%%%LANG%%% + +=cut + +package FlowPDF::BaseClass2; +use strict; +use warnings; +use Data::Dumper; +use Carp; + + +sub defineClass { + my ($class, $definitions) = @_; + + for my $k (keys %$definitions) { + my $field = ucfirst $k; + my $getter = "get$field"; + my $setter = "set$field"; + my $code = sprintf q| + *{%s::%s} = sub { + my ($self) = @_; + return __get($self, $definitions, $k); + }; + *{%s::%s} = sub { + my ($self, $value) = @_; + return __set($self, $definitions, $k, $value); + }; +|, $class, $getter, $class, $setter; + # print "Code: $code\n"; + eval $code or do { + croak "Error during method creation: $!\n"; + }; + } + return 1; +} + + +sub __get { + my ($self, $definitions, $field) = @_; + if (defined $self->{$field}) { + return $self->{$field}; + } + return undef; +} + + +sub __set { + my ($self, $definitions, $field, $value) = @_; + + if (ref $definitions->{$field}) { + my $matcher = $definitions->{$field}; + if (!$matcher->match($value)) { + if ($matcher->can('describe')) { + my $msg = sprintf( + 'Value for %s->{%s} should be: %s, but got: %s', + ref $self, $field, $matcher->describe(), + ref $value ? Dumper($value) : $value + ); + croak $msg; + } + else { + croak "Value for $self : $field should be a " . Dumper($matcher) . ", got: " . Dumper($value) . "\n"; + } + } + } + else { + print "[DEVWARNING] $field from " . ref $self . " does not have proper definition.\n"; + } + $self->{$field} = $value; + return $self; +} + + +sub new { + my ($class, $opts) = @_; + + my $self = {}; + bless $self, $class; + for my $k (keys %$opts) { + my $setter = 'set' . ucfirst($k); + my $getter = 'get' . ucfirst($k); + + if ($class->can($setter) && $class->can($getter)) { + $self->$setter($opts->{$k}); + } + else { + croak "Field '$k' does not exist and was not defined\n"; + } + } + + return $self; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Client/REST.pm b/src/main/resources/project/pdk/FlowPDF/Client/REST.pm new file mode 100644 index 00000000..2eef15ff --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Client/REST.pm @@ -0,0 +1,397 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Client::REST + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This module provides a simple rest client for various HTTP interactions. +It has been designed to be as closest as possible to HTTP::Request and LWP::UserAgent object methods. + +=head1 USAGE + +You can get FlowPDF::Client::REST object using regular constructor: new(), or through L object, +using newRESTClient() methods. + +Retrieving FlowPDF::Client::REST object from L is preferred, because during retrieval from context, +some components may be applied automatically to FlowPDF::Client::REST object, like proxy and L. + +%%%LANG=perl%%% + + sub stepGetContent { + my ($pluginObject) = @_; + + # retrieving context object + my $context = $pluginObject->getContext(); + # creating new FlowPDF::Client::REST object + my $rest = $context->newRESTClient(); + # creatung new HTTP::Request object using FlowPDF APIs + my $request = $rest->newRequest(GET => 'http://electric-cloud.com'); + # performing request and getting HTTP::Response object. + my $response = $rest->doRequest($request); + # printing response content + print "Content: ", $response->decoded_content(); + } + +%%%LANG%%% + +=head1 METHODS + +=cut + +package FlowPDF::Client::REST; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + ua => FlowPDF::Types::Reference('LWP::UserAgent'), + proxy => FlowPDF::Types::Reference('HASH'), + auth => FlowPDF::Types::Reference('FlowPDF::Client::REST::Auth') +}); + +use FlowPDF::Client::REST::Auth; +use FlowPDF::ComponentManager; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use strict; +use warnings; +use LWP::UserAgent; +use HTTP::Request; +use Data::Dumper; +use Carp; +use URI::Escape qw/uri_escape/; + +=head2 new($parameters) + +=head3 Description + +Constructor. Creates new FlowPDF::Client::REST object. + +It has internal support of L. + +To use FlowPDF::Client::REST with proxy you need to provide a proxy parameters to constructor. They are: + +=over 4 + +=item B + +An address of the proxy to be used as http proxy. + +=item B + +The username that is being used for proxy authorization. + +=item B + +The password that is being used for username for proxy authorization. + +=item B + +Debug enabling switch. Debug output for FlowPDF::Proxy will be enabled if this is passed as true. + +=back + +=head3 Parameters + +=over 4 + +=item (Optional)(HASH ref) A parameters that are required to get additional things from FlowPDF::Client::REST. Details above. + +=back + +=head3 Returns + +=over + +=item FlowPDF::Client::REST + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $rest = FlowPDF::Client::REST->new({ + proxy => { + url => 'http://squid:3128', + username => 'user1', + password => 'user2' + } + }); + +%%%LANG%%% + +In that example FlowPDF::Rest loads automatically L and creates new FlowPDF::Client::REST. + +=cut + +sub new { + my ($class, $params) = @_; + + # validating parameters + # auth section + if ($params->{auth} && (!ref $params->{auth} || ref $params->{auth} ne 'HASH')) { + croak "Auth section should be a HASH reference."; + } + if ($params->{auth} && !$params->{auth}->{type}) { + croak "Auth type is expected for auth section."; + } + + # proxy section + if ($params->{proxy} && (!ref $params->{proxy} || ref $params->{proxy} ne 'HASH')) { + croak 'Proxy section should be a HASH reference.'; + } + # end of validation + + fwLogDebug("Creating FlowPDF::Client::Rest with params: ", Dumper $params); + + my $restAuth = FlowPDF::Client::REST::Auth->new({ + authValues => {}, + authType => '', + }); + my $creationParams = { + auth => $restAuth, + ua => $params->{ua} || LWP::UserAgent->new() + }; + if ($params->{proxy}) { + fwLogDebug("Loading Proxy Component on demand."); + my $proxy = FlowPDF::ComponentManager->loadComponent('FlowPDF::Component::Proxy', $params->{proxy}); + fwLogDebug("Proxy component has been loaded."); + $proxy->apply(); + $creationParams->{ua} = $proxy->augment_lwp($creationParams->{ua}); + $creationParams->{proxy} = $params->{proxy}; + } + + + my $self = $class->SUPER::new($creationParams); + my $restAuthValues = $restAuth->getAuthValues(); + my $oauth = undef; + + if ($params->{auth} && $params->{auth}->{type}) { + my $auth = $params->{auth}; + + if ($auth->{type} eq 'oauth') { + $restAuth->setAuthType('oauth'); + delete $auth->{type}; + # op stands for ouathParams + my $op = $auth; + + if ($op->{oauth_version} ne '1.0') { + croak "Currently OAuth version $op->{oauth_version} is not supported. Suported versions: 1.0"; + } + + # request_method is removed from mandatory fields list for now. + for my $p (qw/oauth_signature_method oauth_version/) { + if (!defined $op->{$p}) { + croak "$p is mandatory for oauth component"; + } + } + fwLogDebug("Loading FlowPDF::Component::OAuth"); + $oauth = FlowPDF::ComponentManager->loadComponent('FlowPDF::Component::OAuth', $auth); + fwLogDebug("OAuth component has been loaded."); + $restAuthValues->{oauthComponent} = $oauth; + } + elsif ($auth->{type} eq 'basic') { + $restAuth->setAuthType('basic'); + # TODO: Remove later one of these options and keep only one. + if ($auth->{userName} || $auth->{username}) { + $restAuthValues->{username} = $auth->{userName} || $auth->{username}; + } + + if ($auth->{password}) { + $restAuthValues->{password} = $auth->{password}; + } + } + elsif ($auth->{type} eq 'bearer') { + logWarning("Bearer auth type is not implemented yet"); + } + else { + if (keys %$auth) { + logWarning("Following auth keys are not supported: " . join(", ", keys(%$auth))); + } + } + } + + return $self; + +} + + +=head2 newRequest(@parameters) + +Creates new HTTP::Request object. + +This wrapper has been created to implement request augmenations using components during request object creation. + +For example, if FlowPDF::Client::Rest has been created with proxy support, it will return HTTP::Request object with applied proxy fields. + +This method has the same interface and usage as as HTTP::Request::new(); + +=head3 Parameters + +=over 4 + +=item HTTP::Request::new() parameters. + +=back + +=head3 Returns + +=over 4 + +=item HTTP::Request + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $request = $rest->newRequest(GET => 'https://electric-cloud.com'); + +%%%LANG%%% + +=cut + +sub newRequest { + my ($self, @params) = @_; + + my $req = HTTP::Request->new(@params); + my $proxy = $self->getProxy(); + if ($proxy) { + my $proxyComponent = FlowPDF::ComponentManager->getComponent('FlowPDF::Component::Proxy'); + $req = $proxyComponent->augment_request($req); + } + + my $auth = $self->getAuth(); + + if (my $authType = $auth->getAuthType()) { + my $values = $auth->getAuthValues(); + if ($authType eq 'basic') { + $req->authorization_basic($values->{username}, $values->{password}); + } + } + return $req; +} + + +=head2 doRequest($httpRequest) + +=head3 Description + +Performs HTTP request, using HTTP::Request object as parameter. + +Also, this method supports API of LWP::UserAgent::request() method. + +This method returns HTTP::Response object. + +=head3 Parameters + +=over 4 + +=item LWP::UserAgent::request() parameters + +=back + +=head3 Returns + +=over 4 + +=item HTTP::Response + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $request = $rest->newRequest(GET => 'https://electric-cloud.com'); + my $response = $rest->doRequest($request); + print $response->decoded_content(); + +%%%LANG%%% + +=cut + +sub doRequest { + my ($self, @params) = @_; + + my $ua = $self->getUa(); + return $ua->request(@params); +} + + +=head2 augmentUrlWithParams($url, $arguments) + +=head3 Description + +Helper method, that provides a mechanism for adding query parameters to URL, with proper escaping. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Url that should be augmented with query parameters. + +=item (Required)(HASH ref) hash of parameters to be escaped and added to the query string. + +=back + +=head3 Returns + +=over 4 + +=item (String) Url with added query parameters. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $url = 'http://localhost:8080; + + $url = $rest->augmentUrlWithParams($url, {one=>'two'}); + # url = http://localhost:8080?one=two + +%%%LANG%%% + +=cut + +sub augmentUrlWithParams { + my ($self, $url, $params) = @_; + + if (!$url) { + croak "URL expected"; + } + if (!ref $params) { + croak "Required HASH reference for params"; + } + + $url =~ s|\/*?$||gs; + my $gs = ''; + for my $k (keys %$params) { + $gs .= uri_escape($k) . '=' . uri_escape($params->{$k}) . '&'; + } + $gs =~ s/&$//s; + if ($url =~ m|\?|s) { + $gs = '&' . $gs; + } + else { + $gs = '?' . $gs; + } + $url .= $gs; + + # $url =~ s/\?$//; + return $url; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Client/REST/Auth.pm b/src/main/resources/project/pdk/FlowPDF/Client/REST/Auth.pm new file mode 100644 index 00000000..25fbe5e1 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Client/REST/Auth.pm @@ -0,0 +1,18 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Client::REST::Auth; +use base qw/FlowPDF::BaseClass2/; +use strict; +use warnings; + +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + authType => FlowPDF::Types::Scalar(), + authValues => FlowPDF::Types::Reference('HASH') +}); + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component.pm b/src/main/resources/project/pdk/FlowPDF/Component.pm new file mode 100644 index 00000000..1168866e --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component.pm @@ -0,0 +1,106 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This module provides a base class for FlowPDF Components. + +Each FlowPDF Component is a perl module which should have init($initParams) method and be a subclass of FlowPDF::Component. + +=head1 USAGE + +To create a component one should define a class that inherits this class and define an init($class, $params) method to make it working. +Also, components should be loading using L, please, avoid direct usage of components modules. + +Direct usage of components will be prohibited in the next release. + +Example of a simple component: + +%%%LANG=perl%%% + + package FlowPDF::Component::MyComponent + use base qw/FlowPDF::Component/; + use strict; + use warnings; + + sub init { + my ($class, $initParams) = @_; + my ($initParams) = @_; + my $retval = {%$initParams}; + bless $retval, $class; + return $retval; + } + + sub action { + my ($self) = @_; + print "Doing Action!"; + } + +%%%LANG%%% + +Then, to load this component using L one should use its loadComponent method. + +Please, note, that loadComponent loads component globally, that is, you don't need to do loadComponent with parameters again and again. + +You need to call getComponent('FlowPDF::Component::YourComponent') of L. + +Please, note, that in that case getComponent() will return exactly the same object that was created during component loading. + +To get more details about component loading see L + +Example: + +%%%LANG=perl%%% + + my $component = FlowPDF::ComponentManager->loadComponent('FlowPDF::Component::MyComponent', $initParams); + # then you can use your component across your code. + # to do that, you need to get this component from anywere in current runtime. + ...; + sub mySub { + # the same component object. + my $component = FlowPDF::ComponentManager->getComponent('FlowPDF::Component::MyComponent'); + } + +%%%LANG%%% + +=head1 AVAILABLE COMPONENTS + +Currently there are 3 components that are going with L: + +=over 4 + +=item L + +=item L + +=item L + +=back + +=cut + +package FlowPDF::Component; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + componentInitParams => FlowPDF::Types::Reference('HASH') +}); + +use strict; +use warnings; + +sub isEFComponent { + return 0; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/CLI.pm b/src/main/resources/project/pdk/FlowPDF/Component/CLI.pm new file mode 100644 index 00000000..8cbd97af --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/CLI.pm @@ -0,0 +1,207 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +=head1 FlowPDF::Component::CLI + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +FlowPDF::Component::CLI is an FlowPDF::Component that is responsible for command-line execution. + +=head1 INIT PARAMS + +To read more about init params see L. + +This component support following init params: + +=over 4 + +=item (Required) workingDirectory + +A parameter for working directory. CLI executor will chdir to this directory before commands execution. + +=item (Optional) resultsDirectory + +A parameter for output directory. Logs are being stored at this directory. + +If no resultsDirectory parameter, defaults to workingDirectory parameter. + +=back + +=head1 USAGE + +This component should be used in the following sequence: + +=over 4 + +=item FlowPDF::Component::CLI creation. + +=item FlowPDF::Component::CLI command creation. + +=item Command execution. + +=item Results procession. + +=back + +=head1 METHODS + +=cut + +package FlowPDF::Component::CLI; +use base qw/FlowPDF::Component/; + +__PACKAGE__->defineClass({ + workingDirectory => FlowPDF::Types::Scalar(), + resultsDirectory => FlowPDF::Types::Scalar(), + componentInitParams => FlowPDF::Types::Reference('HASH'), +}); + +use strict; +use warnings; +use FlowPDF::Helpers qw/isWin genRandomNumbers/; +use FlowPDF::Component::CLI::Command; +use FlowPDF::Component::CLI::ExecutionResult; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use Carp; + + +sub init { + my ($class, $params) = @_; + + if (!$params->{workingDirectory}) { + croak "Working Directory is expected for CLI interface initialization\n"; + } + + if (!$params->{resultsDirectory}) { + $params->{resultsDirectory} = $params->{workingDirectory}; + } + my $retval = $class->new($params); + $retval->setComponentInitParams($params); + + return $retval; +} + + +=head2 newCommand($shell, $args) + +=head3 Description + +Creates an L object that represents command line and being used by FlowPDF::Component::CLI executor. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Shell for the command, or full path to the command that should be executed. + +=item (Required)(ARRAY ref) An arguments that will be escaped and added to the command. + +=back + +=head3 Returns + +=over 4 + +=item L object + +=back + +=cut + +sub newCommand { + my ($self, $shell, $args) = @_; + + my $command = FlowPDF::Component::CLI::Command->new($shell, @$args); + + return $command; +} + + +=head2 runCommand() + +=head3 Description + +Executes provided command and returns an L object. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +=cut + +sub runCommand { + my ($self, $command, $mergeOut) = @_; + + $mergeOut ||= 0; + logInfo("Running command: " . $command->renderCommand()); + if (my $wd = $self->getWorkingDirectory()) { + chdir($wd) or croak "Can't chdir to $wd"; + } + return $self->_syscall($command, $mergeOut); + +} + +sub _syscall { + my ($self, $commandObject, $mergeOut) = @_; + + my $command = $commandObject->renderCommand(); + my $result_folder = $self->getResultsDirectory(); + my $stderr_filename = 'command_' . genRandomNumbers(42) . '.stderr'; + my $stdout_filename = 'command_' . genRandomNumbers(42) . '.stdout'; + $command .= qq| 1> "$result_folder/$stdout_filename" 2> "$result_folder/$stderr_filename"|; + if (isWin) { + logDebug("MSWin32 detected"); + $ENV{NOPAUSE} = 1; + } + + my $pid = system($command); + my $retval = { + stdout => '', + stderr => '', + code => $? >> 8, + errmsg => '', + }; + if ($!) { + $retval->{errmsg} = "$!"; + } + + open (my $stderr, "$result_folder/$stderr_filename") or croak "Can't open stderr file ($stderr_filename) : $!"; + open (my $stdout, "$result_folder/$stdout_filename") or croak "Can't open stdout file ($stdout_filename) : $!"; + $retval->{stdout} = join '', <$stdout>; + $retval->{stderr} = join '', <$stderr>; + close $stdout; + close $stderr; + + # Cleaning up + unlink("$result_folder/$stderr_filename"); + unlink("$result_folder/$stdout_filename"); + + my $result = FlowPDF::Component::CLI::ExecutionResult->new($retval); + return $result; +} + + + + +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/Component/CLI/Command.pm b/src/main/resources/project/pdk/FlowPDF/Component/CLI/Command.pm new file mode 100644 index 00000000..f4333703 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/CLI/Command.pm @@ -0,0 +1,189 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::CLI::Command + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class represents a system command that is being used by L. + +=head1 METHODS + +=cut + +package FlowPDF::Component::CLI::Command; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + shell => FlowPDF::Types::Scalar(), + args => FlowPDF::Types::Scalar(), +}); + +use strict; +use warnings; + +use FlowPDF::Helpers qw/isWin/; +use FlowPDF::Log; +use FlowPDF::Log::FW; + +use Carp; + + +=head2 new($shell, @args) + +=head3 Description + +This method returns an FlowPDF::Component::CLI::Command object. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Command to be executed + +=item (Optional)(list of Strings) Arguments to be added to the command. + +=back + +=head3 Returns + +=head3 Usage + +%%%LANG=perl%%% + + my $command = FlowPDF::Component::CLI::Command->new('ls', '-la'); + +%%%LANG%%% + +=head3 Note + +It is much better to use newCommand metod from L + +=cut + +sub new { + my ($class, $shell, @args) = @_; + + fwLogDebug("Creating $class ...\n"); + + @args = escapeArgs(@args); + $shell = escapeArgs($shell); + + my $self = { + args => \@args, + shell => $shell + }; + bless $self, $class; + return $self; + # return $class->SUPER::new({ + # shell => $shell, + # args => \@args + # }); +} + +sub escapeArgs { + my (@args) = @_; + + # TODO: Add croak if 1st argument is a reference, to be sure that this method is being used as static one.; + @args = map { + my $escapeCharacter = isWin() ? q|"| : q|'|; + s/$escapeCharacter/\\$escapeCharacter/gs; + $_ = sprintf('%s%s%s', $escapeCharacter, $_, $escapeCharacter); + $_; + } @args; + return $args[0] unless wantarray(); + return @args; +} + + +=head2 addArguments(@args) + +=head3 Description + +Adds a new arguments to the command. + +=head3 Parameters + +=over 4 + +=item (Required)(list of String) arguments to be added + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::Component::CLI::Command self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $command = FlowPDF::Component::CLI->newCommand('ls'); + $command->addArguments('-l', '-a'); +%%%LANG%%% + +=cut + +sub addArguments { + my ($self, @args) = @_; + + logDebug("Adding arguments: ". join(', ', @args)); + my $cmdArgs = $self->getArgs(); + for my $arg (escapeArgs(@args)) { + push @$cmdArgs, $arg; + } + + return $self; +} + +=head2 renderCommand() + +=head3 Description + +Returns a rendered command with its arguments. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Rendered command. + +=back + +=cut + +sub renderCommand { + my ($self, $opts) = @_; + + my $shell = $self->getShell(); + my $args = $self->getArgs(); + + my $command = "$shell "; + + my $joinedArgs = join ' ', @$args; + + return $command . $joinedArgs; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/CLI/ExecutionResult.pm b/src/main/resources/project/pdk/FlowPDF/Component/CLI/ExecutionResult.pm new file mode 100644 index 00000000..79b3dfa0 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/CLI/ExecutionResult.pm @@ -0,0 +1,101 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::CLI::ExecutionResult + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class represents a command-line execution result with exit code, stdout and stderr. + +=head1 METHODS + +=head2 getStdout() + +=head3 Description + +Returns STDOUT of executed command. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) STDOUT + +=back + +=head2 getStderr() + +=head3 Description + +Returns STDERR of executed command. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) STDERR + +=back + +=head2 getCode() + +=head3 Description + +Returns an exit code of executed command. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Exit code. + +=back + +=cut + +package FlowPDF::Component::CLI::ExecutionResult; +use strict; +use warnings; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; +__PACKAGE__->defineClass({ + stdout => FlowPDF::Types::Scalar(), + stderr => FlowPDF::Types::Scalar(), + code => FlowPDF::Types::Scalar(), + errmsg => FlowPDF::Types::Scalar(), +}); +use Carp; + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF.pm new file mode 100644 index 00000000..78382dc3 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF.pm @@ -0,0 +1,21 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Component::EF; +use base qw/FlowPDF::Component/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + pluginObject => FlowPDF::Types::Any(), +}); + +use strict; +use warnings; + +sub isEFComponent { + return 1; +} + +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting.pm new file mode 100644 index 00000000..cdc6e9f3 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting.pm @@ -0,0 +1,921 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting + +=head1 AUTHOR + +CloudBees + +=head1 COMPONENT STATE + +Current state of this component is late alpha version. Drop 1. + +Currently, the state of this component allows you to implement CollectReportingData procedure for single payload-type per module. + +However, multiple payload are designed, but not implemented yet. This will be a goal for the Drop 2. + +=head1 DESCRIPTION + +This module provides a component for Release Command Center (RCC) integration. + +Before this component created, implementation of RCC integration was very complex and hard to setup. + +This component provides a unified interface for RCC integrations using FlowPDF-Perl toolkit. + +=head1 TERMINOLOGY + +=over 4 + +=item Devops Insight Center + +DevOps Insight provides dashboards that give you insights into deployment and release activities over time. + +The ability to visualize this information as dashboards enables enterprises to understand the overall status of their processes, +identify hotspots that need action, understand trends, and find opportunities for further improvement. +DevOps Insight provides several dashboards as well as the ability to create custom dashboards. + +These dashboards include the Release Command Center dashboard, which provides a centralized view of all activities and processes related to a release. + +These include key metrics from the tools used across the end-to-end process, from work item tracking and build automation to test and operations tools. + +The Release Command Center dashboard helps you to understand how many user stories are planned, +how many of them are "dev complete", how many are tested, what is the success rate of each of them, and other metrics that can help you better manage software production. + +=item Release Command Center + +Release Command Center is a part of Devops Insight Center and it shows a metrics that are gathered from different datasource of different types. + +=item Data source + +A system from where we're retrieving data for Devops Insight Center to shot them in Release Command Center. + +It could be, basically, any kind of third-party software. For example, Jenkins, Jira, ServiceNow, SonarQube, etc. + +=item Report Object Type + +Each kind of report has it's own object type. Report object type defines a place where collected data will be shown. + +For example, Jenkins datasource has report object type "build" for builds and "quality" for test reports. + +JIRA has 'feature' for improvement tickets, and "defect" for bug issues. ServiceNow has an "incident" report object type. + +=item Payload + +Payload is a data that represents single entity for each report object type. For example, if we're collecting reporting data from jenkins + +for HelloWorld project, we will have a payload object of a build type for each build that were already built. + +So, if we have 10 builds, we should send 10 payloads. + +Each payload of certain report object type has its own set of defined fields that should be sent. + +We're building payloads from the data, that is being retrieved from data source. + +=item Records set + +Records set is a raw data that is retrieved from data source. It should be an array of hashes. + +=item Data set + +Data set is an array of hashes (dicts) that is created from records set. In that case it should be a flat array of a flat hashes. + +So, each of hashes should have only a scalar values for its keys. + +=item Payload set + +Payload set is a set of payloads, that are already prepared to be sent to the reporting system. + +=item Transform script + +A script that is provided by user using procedure form or directly to be applied to each record in records set. + +=item Metadata + +An information that allows reporting system to know last reported object. It is being built from latest payload that was sent. + +Metadata is being stored as JSON in the property. The address of these property is could be default or set by user. + +Default place of property is depends on the context. For regular context it will be set to the current project. + +In context of schedule it will be stored in the schedule properties. + +=back + +=head1 Data Flow + +Datasource => Records Set => Transformed Records Set => Data Set => Payload Set + +The key idea of reporting is: + +=over 4 + +=item Read data from datasource (jira, jenkins, etc) about some metric (issues count, build status, etc). + +=item Create a set of payloads from retrieved dataset. + +=item Send it to EF instance. + +=item Write a fingerprint (we call it metadata) of latest payload and store it somewhere. + +=item On the next run, validate metadata to make sure that we need or need no of new reports. + +=back + +=head1 WHAT DO YOU NEED TO IMPLEMENT REPORTING? + +To implement reporting you need to have the following things (if you have all of them, reporting implementation for your plugin is simple enough). + +=over 4 + +=item An unique key/metric/value of each record/payload. + +This value will be your keypoint of reporting. This value should be unique and you should have a way of comparison between two values, to get which is later. +For example, in Jenkins it is a build number. Build number is an unique value of each build inside a jenkins project. +Let's say, that we did a successful reporting of set of jenkins builds, and latest was 42. Then, someone triggering a new build, and latest build number is 43 now. +That is, we can easily compare 42 and 43 and understand, that if new build number is more than latest stored, we need to report. + +=item An API that allows you to get latest record. + +When it is possible to get a latest record by your criteria from datasource, you can + +=back + +=head1 How to implement reporting. + +To get reporting one need to create a subclass of FlowPDF::Component::EF::Reporing within your project and implement following functions: + +=over 4 + +=item compareMetadata($localMetadata, $latestRemoteMetadata); + +A metadata comparator. It should work exactly as cmp, <=> or any other sort function. + +If your metadata that is stored on EF side is pointing on non-latest data, simply return 1, it will trigger all logic. + +Note: You don't have to create metadata object by yourself. This part is being handled by this component behind the scene. +For list of available methods of metadata object refer to: L. + +Note: Result of all getter functions, that return an array reference should be ordered from older to newer. +This will be checked during validation and procedure will fail if records are not sorted in proper order. +For this validation function that has been written for metadata comparison by user will be used. +For example, if you have a set of builds with 10, 11, and 48, they should go in the following order: [10, 11, 48], otherwise procedure will raise an exception. + +=item initialGetRecords($pluginObject, $limit); + +Function that is responsible for initial data retrieval. It will have as parameter $limit. +If limit is not passed or it is equals to 0, no limit is to be applied. + +=item getRecordsAfter($pluginObject, $metadata); + +A function that retrieves a newer records than a record that is stored on the EF side in metadata. + +=item getLastRecord($pluginObject); + +A function that always return a last record. This function should returh a hash reference instead of array of hash references. + +=item buildDataset($pluginObject, $records); + +A function that gets records set as parameter and builds a dataset from them. + +Note, that transformation script is being applied right before this function automatically. + +=item buildPayloadset($pluginObject, $dataset); + +This function builds a payload set from dataset. + +Note, that after this function validation of each payload will be performed, and if something is not correct, procedure will bail out. + +=back + +=head1 HOW TO IMPLEMENT REPORTING? + +There are few steps to achieve that: + +=over 4 + +=item Inherit this class. + +%%%LANG=perl%%% + + package EC::Plugin::YourPlugin::Reporting; + use base qw/FlowPDF::Component::EF::Reporting/; + +%%%LANG%%% + +=item Define a procedure for reporting (now manually, in the drop2 - using ecpdk). + +=item Load component that you just created and define it: + +%%%LANG=perl%%% + + my $reporting = FlowPDF::ComponentManager->loadComponent('EC::Plugin::YourPlugin::Reporting', { + reportObjectTypes => ['build'], + metadataUniqueKey => $params->{jobName}, + payloadKeys => ['buildNumber'] + }, $pluginObject); + +%%%LANG%%% + +Where: + +=over 8 + +=item reportObjectTypes + +An array reference of report object types that are supported by your component. + +=item metadataUniqueKey + +An unique key for metadata. It will be used to store metadata for different datasource entities in the different paths. + +It should be set to some value. For example, if you have a parameter for the jenkins job, that should be reported, you may set this to it's value, +like HelloWorld. Basically, you can use any string here. But you need to be sure, that your unique key is really unique and you can use it for further +metadata retrieval. So, do not use any random values there. + +=item payloadKeys + +The fields of payload that will be used for metadata creation. An array reference of scalars. These fields should be present in payload. + +If not, procedure will be failed. For example, if you have in payload buildNumber field, and you want to have this number as identifier, provide +just ['buildNumber']. + +=back + +=item Call CollectReportingData() from your component + +%%%LANG=perl%%% + + $reporting->collectReportingData(); + +%%%LANG%%% + +=back + +=head1 EXAMPLE + +This example demonstrates how it is possible to create CollectReportingData using this component manually. + +%%%LANG=perl%%% + + package EC::Plugin::NewJenkins::Reporting; + use Data::Dumper; + use base qw/FlowPDF::Component::EF::Reporting/; + use FlowPDF::Log; + use strict; + use warnings; + + sub compareMetadata { + my ($self, $metadata1, $metadata2) = @_; + my $value1 = $metadata1->getValue(); + my $value2 = $metadata2->getValue(); + # Implement here logic of metadata values comparison. + # Return 1 if there are newer records than record to which metadata is pointing. + return 1; + } + + + sub initialGetRecords { + my ($self, $pluginObject, $limit) = @_; + + # build records and return them + my $records = $pluginObject->yourMethodTobuildTheRecords($limit); + return $records; + } + + + sub getRecordsAfter { + my ($self, $pluginObject, $metadata) = @_; + + # build records using metadata as start point using your functions + my $records = $pluginObject->yourMethodTobuildTheRecordsAfter($metadata); + return $records; + } + + sub getLastRecord { + my ($self, $pluginObject) = @_; + + my $lastRecord = $pluginObject->yourMethodToGetLastRecord(); + return $lastRecord; + } + + sub buildDataset { + my ($self, $pluginObject, $records) = @_; + + my $dataset = $self->newDataset(['yourReportObjectType']); + for my $row (@$records) { + # now, data is a pointer, you need to populate it by yourself using it's methods. + my $data = $dataset->newData({ + reportObjectType => 'yourReportObjectType', + }); + for my $k (keys %$row) { + $data->{values}->{$k} = $row->{$k}; + } + } + return $dataset; + } + +%%%LANG%%% + +=head1 METHODS + +=cut + +package FlowPDF::Component::EF::Reporting; +use strict; +use warnings; +use base qw/FlowPDF::Component::EF/; +use FlowPDF::Types; + +our $VERSION = 1.2.0; + +our $PREVIEW_MODE_ENABLED = 0; + +__PACKAGE__->defineClass({ + metadataUniqueKey => FlowPDF::Types::Scalar(), + # an array reference of strings for report object types, like ['build', 'quality']; + reportObjectTypes => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + initialRecordsCount => FlowPDF::Types::Scalar(), + pluginName => FlowPDF::Types::Scalar(), + pluginObject => FlowPDF::Types::Any(), + transformer => FlowPDF::Types::Reference('FlowPDF::Component::EF::Reporting::Transformer'), + payloadKeys => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), +}); + +use Data::Dumper; +use Carp; +use Scalar::Util qw/reftype/; +use FlowPDF::Component::EF::Reporting::Dataset; +use FlowPDF::Component::EF::Reporting::Payloadset; +use FlowPDF::Component::EF::Reporting::Engine; +use FlowPDF::Helpers qw/inArray/; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use FlowPDF::Component::EF::Reporting::Metadata; +use FlowPDF::Component::EF::Reporting::MetadataFactory; +use FlowPDF::Component::EF::Reporting::Transformer; + +use FlowPDF::Exception::RuntimeException; +use FlowPDF::Exception::WrongFunctionArgumentValue; +use FlowPDF::Exception::WrongFunctionArgumentType; +use FlowPDF::Exception::MissingFunctionArgument; + +sub init { + my ($class, $pluginObject, $initParams) = @_; + + my $self = FlowPDF::Component::EF::Reporting->new(); + $self->setPluginName($pluginObject->getPluginName()); + + my $c = $pluginObject->getContext(); + if (!$initParams->{reportObjectTypes}) { + FlowPDF::Exception::WrongFunctionArgumentValue->new( + "Init parameters should have non-empty reportObjectType key." + )->throw(); + } + + if (!ref $initParams->{reportObjectTypes} || ref $initParams->{reportObjectTypes} ne 'ARRAY') { + FlowPDF::Exception::WrongFunctionArgumentValue->new( + "reportObjectTypes key should be an ARRAY reference. Got: " . Dumper($initParams->{reportObjectTypes}) + )->throw(); + } + $self->setReportObjectTypes($initParams->{reportObjectTypes}); + + $self->setPluginObject($pluginObject); + if ($initParams->{metadataUniqueKey}) { + $self->setMetadataUniqueKey($initParams->{metadataUniqueKey}); + } + if ($initParams->{payloadKeys}) { + $self->setPayloadKeys($initParams->{payloadKeys}); + } + + if ($class ne __PACKAGE__) { + bless $self, $class; + }; + + my $runtimeParameters = $pluginObject->getContext()->getRuntimeParameters(); + + if ($runtimeParameters->{initialRecordsCount}) { + $self->setInitialRecordsCount($runtimeParameters->{initialRecordsCount}); + } + elsif ($initParams->{initialRecordsCount}) { + $self->setInitialRecordsCount($initParams->{initialRecordsCount}); + } + else { + $self->setInitialRecordsCount(0); + } + + if ($runtimeParameters->{transformScript}) { + my $transformer = FlowPDF::Component::EF::Reporting::Transformer->new({ + pluginObject => $pluginObject, + transformScript => $runtimeParameters->{transformScript} + }); + $transformer->load(); + $self->setTransformer($transformer); + } + + if ($runtimeParameters->{previewMode}) { + $PREVIEW_MODE_ENABLED = 1; + } + return $self; +} + +sub isPreview { + return $PREVIEW_MODE_ENABLED; +} + +sub buildMetadataLocation { + my ($self) = @_; + + my $po = $self->getPluginObject(); + my $context = $po->getContext(); + + my $runtimeParameters = $context->getRuntimeParameters(); + if ($runtimeParameters->{metadataPropertyPath}) { + logInfo("Metadata location was set in the procedure parameters to: $runtimeParameters->{metadataPropertyPath}\n"); + return $runtimeParameters->{metadataPropertyPath}; + } + my $runContext = $context->getRunContext(); + my $projectName = $context->getCurrentProjectName(); + + my $location = ''; + logInfo("Current run context is: '$runContext'"); + if ($runContext eq 'schedule') { + my $scheduleName = $context->getCurrentScheduleName(); + $location = sprintf('/projects/%s/schedules/%s/ecreport_data_tracker', $projectName, $scheduleName); + } + else { + $location = sprintf('/projects/%s/ecreport_data_tracker', $projectName); + } + + logInfo "Built metadata location: $location"; + return $location; +} + + +=head2 CollectReportingData() + +=head3 Description + +Executes CollectReportingData logic and sends a reports to the Devops Insight Center. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item None + +=back + +=head3 Exceptions + +Throws a fatal error and exits with code 1 if something went wrong. + +=head3 Usage + +%%%LANG=perl%%% + + $reporting->CollectReportingData(); + +%%%LANG%%% + +=cut + +sub CollectReportingData { + my ($self) = @_; + + my $metadataFactory = FlowPDF::Component::EF::Reporting::MetadataFactory->new({ + pluginObject => $self->getPluginObject(), + reportObjectTypes => $self->getReportObjectTypes(), + propertyPath => $self->buildMetadataLocation(), + payloadKeys => $self->getPayloadKeys(), + uniqueKey => $self->getMetadataUniqueKey() + }); + $metadataFactory->setPropertyPath($metadataFactory->getPropertyPath . '/' . $metadataFactory->buildMetadataName()); + logInfo("Metadata Property Path: " . $metadataFactory->getPropertyPath()); + fwLogDebug("Reference inside of CollectReportingData: ", ref $self); + my $pluginObject = $self->getPluginObject(); + my $stepResult = $pluginObject->getContext()->newStepResult(); + if (FlowPDF::Component::EF::Reporting->isPreview()) { + $stepResult->setJobStepSummary("Preview mode is in effect. Without it you would have:"); + } + # my $runtimeParameters = $pluginObject->getContext()->getRuntimeParameters(); + # if (!$runtimeParameters->{initialRecordsCount}) { + # $runtimeParameters->{initialRecordsCount} = 0; + # } + # 1. Getting metadata from location. + logDebug("Checking for metadata"); + my $metadata = $metadataFactory->newFromLocation(); + logDebug("Metadata from property: ", Dumper $metadata); + if ($metadata) { + logInfo("Metadata exists!"); + my $lastRecord = $self->getLastRecord($pluginObject); + $lastRecord = [$lastRecord]; + my $transformer = $self->getTransformer(); + if ($transformer) { + logInfo "Transformer is present."; + for my $r (@$lastRecord) { + $transformer->transform($r); + } + } + my $dataset = $self->buildDataset($pluginObject, $lastRecord); + my $payloadset; + if ($self->can('buildPayloadset')) { + $payloadset = $self->buildPayloadset($pluginObject, $dataset); + } + else { + $payloadset = $self->defaultBuildPayloadset($pluginObject, $dataset); + } + my $lastMetadata = $metadataFactory->newMetadataFromPayload($payloadset->getLastPayload()); + + if ($self->compareMetadata($metadata, $lastMetadata) == 0) { + logInfo("Up to date, nothing to sync."); + $stepResult->setJobStepSummary("Up to date, nothing to sync."); + $stepResult->apply(); + return 1; + } + } + + my $records; + if ($metadata) { + $records = $self->getRecordsAfter($pluginObject, $metadata); + } + else { + logDebug("No metadata, retrieving records"); + $records = $self->initialGetRecords($pluginObject, $self->getInitialRecordsCount()); + logDebug("Records:", Dumper $records); + } + + # FLOWPDF-108: if metadata is empty, and records are empty too, we need to handle it. + if (!$records || ref $records ne 'ARRAY' || !@$records) { + $stepResult->setJobStepSummary("No records were retrieved. Nothing to sync."); + $stepResult->apply(); + return 0; + } + + # now, we're applying transform script + my $transformer = $self->getTransformer(); + if ($transformer) { + logInfo "Transformer is present."; + for my $r (@$records) { + $transformer->transform($r); + } + } + # end of transformation. + + # 2. get records after date, or all records, or with limit + + # 3. build dataset from records to be used as source for payloadset + my $dataset = $self->buildDataset($pluginObject, $records); + + # 4. Create payloadset. + # transform script will be applied to each payload object. + my $payloads; + if ($self->can('buildPayloadset')) { + $payloads = $self->buildPayloadset($pluginObject, $dataset); + } + else { + logDebug("buildPayloadSet function has not been defined, using defaultBuildPayloadset"); + $payloads = $self->defaultBuildPayloadset($pluginObject, $dataset); + } + $self->prepareAndValidatePayloads($payloads); + # 4.1. Now we need to make sure that payloads are ok and they are in the right order. + my $preparedPayloads = $payloads->getPayloads(); + # logTrace("Got prepared payloads: ", Dumper $preparedPayloads); + for (my $i = 0; $i < scalar(@$preparedPayloads); $i++) { + if (defined($preparedPayloads->[$i]) && defined($preparedPayloads->[$i + 1])) { + my $tm1 = $metadataFactory->newMetadataFromPayload($preparedPayloads->[$i]); + my $tm2 = $metadataFactory->newMetadataFromPayload($preparedPayloads->[$i + 1]); + + if ($self->compareMetadata($tm2, $tm1) != 1) { + my $exceptionMessage = "Wrong order of payloads detected. Payload2 should be after Payload1."; + logInfoDiag("Payload1: ", Dumper $preparedPayloads->[$i]); + logInfoDiag("Payload2: ", Dumper $preparedPayloads->[$i + 1]); + FlowPDF::Exception::RuntimeException($exceptionMessage); + } + else { + logTrace(sprintf("Payload %s is going after %s, which is the right order.", $i + 1, $i)); + } + } + } + # 5. finally report + my $reportingResult = $payloads->report(); + logDebug("Reporting result: ", Dumper $reportingResult); + $stepResult->setJobStepSummary("Payloads sent:"); + for my $reportType (keys %$reportingResult) { + $stepResult->setJobStepSummary("Payloads of type $reportType sent: $reportingResult->{$reportType}"); + } + $stepResult->apply(); + my $newMetadata = $metadataFactory->newMetadataFromPayload($payloads->getLastPayload()); + # 6. Write new metadata. + if ($self->isPreview()) { + logInfo("Preview mode is enabled, metadata is not going to be written"); + } + else { + $newMetadata->writeIt(); + } + + return 1; +} + + +sub defaultBuildPayloadset { + my ($self, $pluginObject, $dataset) = @_; + + my $payloadSet = $self->newPayloadset($dataset->getReportObjectTypes()); + + # my $payloads = $payloadSet->getPayloads(); + my $data = $dataset->getData(); + for my $row (@$data) { + my $values = $row->getValues(); + # from now, values should be scalars or scalar references. + for my $kv (keys %$values) { + if (ref($values->{$kv}) && reftype($values->{$kv}) ne 'SCALAR') { + FlowPDF::Exception::RuntimeException->new( + "Field $kv should be a SCALAR or SCALAR reference. Got: " . Dumper $values->{$kv} + )->throw(); + } + } + my $pl = $payloadSet->newPayload({ + values => $values, + reportObjectType => $row->getReportObjectType() + }); + # TODO: Add here setting of releaseName, releaseProjectName and pluginName, if it is not set. + $self->convertDataToPayloadRecursive($pl, $row); + } + + return $payloadSet; +} + + +sub convertDataToPayloadRecursive { + my ($self, $payload, $data) = @_; + + my $dependentData = $data->getDependentData(); + for my $row (@$dependentData) { + my $dependentPayload = $payload->createNewDependentPayload($row->getReportObjectType(), $row->getValues()); + $self->convertDataToPayloadRecursive($dependentPayload, $row); + } +} + + +sub prepareAndValidatePayloads { + my ($self, $payloadSet) = @_; + + my $c = $self->getPluginObject->getContext(); + if (ref $payloadSet ne 'FlowPDF::Component::EF::Reporting::Payloadset') { + FlowPDF::Exception::WrongFunctionArgumentValue->new({ + function => 'prepareAndValidatePayloads', + argument => 'payloadSet', + got => ref $payloadSet, + expected => 'FlowPDF::Component::EF::Reporting::Payloadset' + })->throw(); + } + + my $pluginObject = $self->getPluginObject(); + my $ec = $pluginObject->getContext()->getEc(); + my $reportingEngine = FlowPDF::Component::EF::Reporting::Engine->new({ + ec => $ec + }); + + my $preparedPayloads = $payloadSet->getPayloads(); + for my $row (@$preparedPayloads) { + $self->prepareAndValidateSinglePayload($row, $reportingEngine); + }; + return $self; +} + + +sub prepareAndValidateSinglePayload { + my ($self, $payload, $reportingEngine) = @_; + + my $c = $self->getPluginObject->getContext(); + if (!ref $payload) { + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'prepareAndValidateSinglePayload', + argument => 'payload' + })->throw(); + } + if (!ref $payload || ref $payload ne 'FlowPDF::Component::EF::Reporting::Payload') { + FlowPDF::Exception::WrongFunctionArgumentType->new({ + function => 'prepareAndValidateSinglePayload', + argument => 'payload', + got => ref $payload, + expected => 'FlowPDF::Component::EF::Reporting::Payload', + })->throw(); + } + + # validating and converting payload + logDebug "Payload BEFORE conversion: " . Dumper $payload; + my $type = $payload->getReportObjectType(); + my $values = $payload->getValues(); + my $definition = $reportingEngine->getPayloadDefinition($type); + + # now we're checking for: pluginConfiguration pluginName releaseName releaseProjectName to propagate them with default + # values if it is not done already. + my $po = $self->getPluginObject(); + if ($definition->{pluginName} && !defined $values->{pluginName}) { + logTrace("Setting pluginName of payload to default: " . $po->getPluginName()); + $values->{pluginName} = $po->getPluginName(); + } + if ($definition->{pluginConfiguration} && !defined $values->{pluginConfiguration}) { + logTrace("Setting pluginConfiguration of payload to default: " . $po->getContext()->getRuntimeParameters()->{config}); + $values->{pluginConfiguration} = $po->getContext()->getRuntimeParameters()->{config}; + } + if ($definition->{releaseName} && !defined $values->{releaseName}) { + logTrace("Setting releaseName of payload to default: " . $po->getContext()->getRuntimeParameters()->{releaseName}); + $values->{releaseName} = $po->getContext()->getRuntimeParameters()->{releaseName}; + } + if ($definition->{releaseProjectName} && !defined $values->{releaseProjectName}) { + logTrace("Setting releaseProjectName of payload to default: " . $po->getContext()->getRuntimeParameters()->{releaseProjectName}); + $values->{releaseProjectName} = $po->getContext()->getRuntimeParameters()->{releaseProjectName}; + } + # end of default values propagation. + + for my $k (keys %$values) { + if (!$definition->{$k}) { + logWarning("$k that is present in payload is not present in $type object definition. Removing it from payload."); + delete $values->{$k}; + next; + } + $values->{$k} = $self->validateAndConvertRow($k, $definition->{$k}->{type}, $values->{$k}, $definition->{$k}->{enumerationValues}); + } + logDebug "Payload AFTER conversion: " . Dumper $payload->{values}; + + # end of validation and conversion of payload + my $dependentPayloads = $payload->getDependentPayloads(); + if (!@$dependentPayloads) { + return $self; + } + + for my $dp (@$dependentPayloads) { + logInfo("Validating dependent payload..."); + $self->prepareAndValidateSinglePayload($dp, $reportingEngine); + } +} + + +sub validateAndConvertRow { + my ($self, $field, $type, $value, $enums) = @_; + + logTrace("Got following parameter for validation: field '$field' with value '" . Dumper($value) . "', enums: " . Dumper $enums); + $enums = [] unless defined $enums; + my $c = $self->getPluginObject->getContext(); + if ($type eq 'STRING') { + if (scalar @$enums) { + if (!inArray($value, @$enums)) { + FlowPDF::Exception::RuntimeException->new( + "STRING field $field has incorrect value: $value. Expected one of: " . join(', ', @$enums) + )->throw(); + } + } + return $value; + } + elsif ($type eq 'NUMBER') { + # TODO: Improve validation here + if ($value !~ m/^[0-9\-]+$/) { + FlowPDF::Exception::RuntimeException->new("Expected a number value, got: $value")->throw(); + } + return $value +0; + } + elsif ($type eq 'DATETIME') { + if ($value !~ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,4})?Z$/) { + FlowPDF::Exception::RuntimeException->new( + "DATETIME field $field has incorrect value: $value. Expected value in Zulu timezone, like:YYYY-MM-DDTHH:MM:SS.sssZ" + )->throw(); + } + return $value; + } + else { + logInfo("Validation of field '$field' with type '$type' is not supported yet by FlowPDF-SDK."); + } + return $value; +} + +=head2 newDataset($reportObjectTypes, $records); + +=head3 Description + +Creates a new L object from records set. + +=head3 Parameters + +=over 4 + +=item (Required)(ARRAY ref of scalars) A report object types to be used for dataset creation. + +=item (Optional)(ARRAY ref or records) A list of L objects. + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +=head3 Exceptions + +Throws a missing parameters exception. + +=head3 Usage + +%%%LANG=perl%%% + + my $dataset = $reporting->newDataset(['build']); + +%%%LANG%%% + +=cut + +sub newDataset { + my ($self, $reportObjectTypes, $data) = @_; + + $data ||= []; + if (!$reportObjectTypes) { + croak "Missing reportObjectTypes for newDataset"; + } + + my $dataset = FlowPDF::Component::EF::Reporting::Dataset->new({ + reportObjectTypes => $reportObjectTypes, + data => $data + }); + + return $dataset; +}; + + +=head2 newPayloadset($reportObjectTypes, $payloads); + +=head3 Description + +Creates a new L object from records set. + +=head3 Parameters + +=over 4 + +=item (Required)(ARRAY ref of scalars) A report object types to be used for payload creation. + +=item (Optional)(ARRAY ref or records) A list of L objects. + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +=head3 Exceptions + +Throws a missing parameters exception. + +=head3 Usage + +%%%LANG=perl%%% + + my $payloadset = $reporting->newPayloadset(['build']); + +%%%LANG%%% + +=cut + +sub newPayloadset { + my ($self, $reportObjectTypes, $payloads) = @_; + + $payloads ||= []; + if (!$reportObjectTypes) { + croak "Missing reportObjectTypes for newPayloadset"; + } + + my $pluginObject = $self->getPluginObject(); + my $ec = $pluginObject->getContext()->getEc(); + + my $payloadset = FlowPDF::Component::EF::Reporting::Payloadset->new({ + reportObjectTypes => $reportObjectTypes, + payloads => $payloads, + ec => $ec, + }); + + return $payloadset; +} + +# TODO: remove this later during cleanup of Drop1. +sub newMetadata {}; + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Data.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Data.pm new file mode 100644 index 00000000..2abe94bb --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Data.pm @@ -0,0 +1,325 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting::Data + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A data object. + +=head1 METHODS + +=head2 getReportObjectType() + +=head3 Description + +Returns a report object type for current data. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Report object type for current data. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $reportObhectType = $data->getReportObjectType(); + +%%%LANG%%% + + + +=head2 getValues() + +=head3 Description + +Returns a values for the current data. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (HASH ref) A values for the current data. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $values = $data->getValues(); + +%%%LANG%%% + + +=cut + +package FlowPDF::Component::EF::Reporting::Data; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + reportObjectType => FlowPDF::Types::Scalar(), + values => FlowPDF::Types::Reference('HASH'), + dependentData => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('FlowPDF::Component::EF::Reporting::Data')), +}); + +use strict; +use warnings; +use FlowPDF::Log; +use FlowPDF::Exception::MissingFunctionArgument; +use FlowPDF::Exception::EntityAlreadyExists; +use FlowPDF::Exception::EntityDoesNotExist; + +sub createNewDependentData { + my ($self, $reportObjectType, $values) = @_; + # TODO: Add validation of reportobjectype. + # TODO: Replace it with exception. + if (!$reportObjectType) { + FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'reportObjectType', + function => 'createNewDependentData' + })->throw(); + } + if (!$values) { + $values = {}; + } + my $dep = $self->getDependentData(); + if (!ref $dep) { + my $depData = []; + $self->setDependentData($depData); + $dep = $depData; + } + my $data = __PACKAGE__->new({ + reportObjectType => $reportObjectType, + values => $values, + dependentData => [], + }); + push @$dep, $data; + return $data; +} + +sub addDependentData { + my ($self, $data) = @_; + + if (!$data || ref $data ne __PACKAGE__) { + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'addDependentData', + argument => 'data', + })->throw(); + } + + my $dep = $self->getDependentData(); + push @$dep, $data; + + return $self; +} + +=head2 addOrUpdateValue + +=head3 Description + +Adds or updates a value for the current data object. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Key for the data. + +=item (Required)(String) Value for the data. + +=back + +=head3 Returns + +=over 4 + +=item Reference to the current FlowPDF::Component::EF::Reporting::Data + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $data->addOrUpdateValue('key', 'value') + +%%%LANG%%% + +=cut + + +sub addOrUpdateValue { + my ($self, $key, $value) = @_; + + my $currentValues = $self->getValues(); + + $currentValues->{$key} = $value; + return $self; +} + + +=head2 addValue + +=head3 Description + +Adds a new value to the data values, falls with exceptions if provided key already exists. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Key for the data. + +=item (Required)(String) Value for the data. + +=back + +=head3 Returns + +=over 4 + +=item Reference to the current FlowPDF::Component::EF::Reporting::Data + +=back + +=head3 Exceptions + +=over 4 + +=item Fatal error if field already exists. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $data->addValue('key', 'value') + +%%%LANG%%% + +=cut + +sub addValue { + my ($self, $key, $value) = @_; + + my $currentValues = $self->getValues(); + + if (exists $currentValues->{$key}) { + FlowPDF::Exception::EntityAlreadyExists->new({ + entity => "key $key", + in => 'data values', + function => 'addValue' + })->throw(); + } + $currentValues->{$key} = $value; + return $self; +} + + +=head2 updateValue + +=head3 Description + +Updates a value for current data values. Fatal error if value does not exist. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Key for the data. + +=item (Required)(String) Value for the data. + +=back + +=head3 Returns + +=over 4 + +=item Reference to the current FlowPDF::Component::EF::Reporting::Data + +=back + +=head3 Exceptions + +=over 4 + +=item Fatal exception if value does not exist. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $data->updateValue('key', 'value') + +%%%LANG%%% + +=cut + + +sub updateValue { + my ($self, $key, $value) = @_; + + my $currentValues = $self->getValues(); + + if (!exists $currentValues->{$key}) { + FlowPDF::Exception::EntityDoesNotExist->new({ + entity => "key $key", + in => 'data values', + function => 'updateValue' + })->throw(); + } + $currentValues->{$key} = $value; + return $self; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Dataset.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Dataset.pm new file mode 100644 index 00000000..380a914d --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Dataset.pm @@ -0,0 +1,185 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting::Dataset + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A dataset object. + +=head1 METHODS + +=head2 getReportObjectTypes() + +=head3 Description + +Returns a report object types for current dataset. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (ARRAY ref) Report object types for current dataset + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $reportObjectTypes = $dataset->getReportObjectTypes(); + +%%%LANG%%% + +=head2 getData() + +=head3 Description + +Returns an ARRAY ref with data objects for current dataset. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (ARRAY ref of L) An array reference of Data object for the current Dataset object. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $data = $dataset->getData(); + +%%%LANG%%% + +=cut + +package FlowPDF::Component::EF::Reporting::Dataset; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + reportObjectTypes => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + data => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('FlowPDF::Component::EF::Reporting::Data')), +}); + +use strict; +use warnings; + +use Data::Dumper; + +use FlowPDF::Helpers qw/inArray/; +use FlowPDF::Component::EF::Reporting::Data; +use FlowPDF::Log; + + +=head2 newData($params) + +=head3 Description + +Creates a new data object and adds it to the current dataset and returns a reference for it. + +=head3 Parameters + +A hash reference with following fields + +=over 4 + +=item (Required)(String) reportObjectType: a report object type for the current data + +=item (Optional)(HASH ref) values: a values from which data object will be created. + +=back + +=head3 Returns + +=over 4 + +=item (L) A reference to newly created data. + +=back + +=head3 Exceptions + +=over 4 + +=item Fatal error if required fields are missing. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $data = $dataset->newData({ + reportObjectType => 'build', + values => { + buildNumber => '2', + status => 'success', + } + }); + +%%%LANG%%% + +=cut + + +sub newData { + my ($self, $params) = @_; + + if (!$params->{values}) { + $params->{values} = {}; + } + if (!$params->{dependentData}) { + $params->{dependentData} = []; + } + my $data = FlowPDF::Component::EF::Reporting::Data->new($params); + logTrace("Data object address: $data"); + my $dataRef = $self->getData(); + logTrace("Dataset object BEFORE inserting into dataset: ", Dumper $dataRef); + push @$dataRef, $data; + logTrace("Dataset object AFTER inserting into dataset: ", Dumper $dataRef); + return $data; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Engine.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Engine.pm new file mode 100644 index 00000000..c2aa71bb --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Engine.pm @@ -0,0 +1,91 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Component::EF::Reporting::Engine; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + ec => FlowPDF::Types::Reference('ElectricCommander') +}); + +use strict; +use warnings; +use Carp; +use Data::Dumper; + +use FlowPDF::Log; + +use FlowPDF::Exception::MissingFunctionArgument; +use FlowPDF::Exception::EntityDoesNotExist; + +sub getReportObjectTypes { + my ($self, $reportObjectType) = @_; + + my $ec = $self->getEc(); + my $resp = $ec->getReportObjectTypes(); + my $retval = []; + for my $node ($resp->findnodes('//reportObjectTypeName')) { + push @$retval, $node->string_value(); + } + + return $retval; +} + +sub getPayloadDefinition { + my ($self, $reportObjectType) = @_; + + if (!$reportObjectType) { + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'getPayloadDefinition', + argument => 'reportObjectType' + })->throw(); + } + my $ec = $self->getEc(); + my $reportObjectTypes = $self->getReportObjectTypes(); + + my $ok = 0; + for my $row (@$reportObjectTypes) { + $ok++ && last if $reportObjectType eq $row; + } + + unless ($ok) { + FlowPDF::Exception::EntityDoesNotExist->new({ + entity => "report object type $reportObjectType", + in => 'available report object types', + function => 'getPayloadDefinition', + })->throw(); + } + + my $payloadDefinition = {}; + + my $xpath = $ec->getReportObjectAttributes($reportObjectType); + + for my $node ($xpath->findnodes('//reportObjectAttribute')) { + my $attributeName = $node->findvalue('reportObjectAttributeName')->string_value(); + my $dataType = $node->findvalue('type')->string_value(); + my $isRequired = $node->findvalue('required')->string_value() + 0; + + # getting enumerations if present + my $enumerations = $node->find("enumerationValue"); + # it returns 0 if no enumerations were found. + # if this list is not empty, we have enumerations + $payloadDefinition->{$attributeName}->{enumerationValues} = []; + if ($enumerations->size()) { + for my $enum ($enumerations->get_nodelist()) { + push (@{$payloadDefinition->{$attributeName}->{enumerationValues}}, $enum->string_value()); + } + } + $payloadDefinition->{$attributeName}->{name} = $attributeName; + $payloadDefinition->{$attributeName}->{type} = $dataType; + $payloadDefinition->{$attributeName}->{required} = $isRequired; + } + logTrace("Got payload of $reportObjectType type definition: ", Dumper $payloadDefinition); + return $payloadDefinition; +} + + + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Metadata.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Metadata.pm new file mode 100644 index 00000000..b8c3eb3f --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Metadata.pm @@ -0,0 +1,151 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting::Metadata + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A metadata object for FlowPDF::Component::EF::Reporting system. + +=head1 METHODS + + +=head2 getValue() + +=head3 Descripton + +Returns decoded metadata value. + +=head3 Parameters + +=head3 Returns + +=head3 Exceptions + +=head3 Usage + + +=head2 getUniqueKey() + +=head3 Descripton + +Returns unique key for current metadata object. + +=head3 Parameters + +=head3 Returns + +=head3 Exceptions + +=head3 Usage + + + +=head2 getReportObjectTypes() + +=head3 Descripton + +Returns report object types for current metadata object. + +=head3 Parameters + +=head3 Returns + +=head3 Exceptions + +=head3 Usage + + +=head2 getPropertyPath() + +=head3 Descripton + +Returns property path where metadata is stored or is to be stored. + +=head3 Parameters + +=head3 Returns + +=head3 Exceptions + +=head3 Usage + + + +=cut + +package FlowPDF::Component::EF::Reporting::Metadata; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + reportObjectTypes => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + uniqueKey => FlowPDF::Types::Scalar(), + propertyPath => FlowPDF::Types::Scalar(), + value => FlowPDF::Types::Reference('HASH'), + pluginObject => FlowPDF::Types::Any() +}); + +use strict; +use warnings; +use FlowPDF::Log; +use FlowPDF::Log::FW; + +use JSON; +use Carp; + + +sub build { + my ($class, $values) = @_; +} + + +sub newFromLocation { + my ($class, $pluginObject, $location) = @_; + + fwLogDebug("Got metadata location: $location"); + my $ec = $pluginObject->getContext()->getEc(); + my $metadata = undef; + + my $retval = undef; + eval { + fwLogDebug("Retrieving metadata from $location"); + $metadata = $ec->getProperty($location)->findvalue('//value')->string_value(); + fwLogDebug("Retrieval result: $metadata"); + if ($metadata) { + fwLogDebug("Metadata found: '$metadata', decoding..."); + $metadata = decode_json($metadata); + fwLogDebug("Decoded metadata"); + $retval = __PACKAGE__->new({ + value => $metadata, + propertyPath => $location + }); + } + else { + fwLogDebug("No metadata found at '$location'"); + } + }; + + logTrace("Returning created metadata"); + return $retval; +} + + +sub writeIt { + my ($self) = @_; + + my $pluginObject = $self->getPluginObject(); + my $ec = $pluginObject->getContext()->getEc(); + my $location = $self->getPropertyPath(); + my $values = $self->getValue(); + $ec->setProperty($location => encode_json($values)); + return 1; +} +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/MetadataFactory.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/MetadataFactory.pm new file mode 100644 index 00000000..132d7d4f --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/MetadataFactory.pm @@ -0,0 +1,99 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Component::EF::Reporting::MetadataFactory; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + pluginObject => FlowPDF::Types::Any(), + reportObjectTypes => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + propertyPath => FlowPDF::Types::Scalar(), + payloadKeys => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + uniqueKey => FlowPDF::Types::Scalar(), +}); + +use strict; +use warnings; +use FlowPDF::Component::EF::Reporting::Metadata; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use Carp; +use Data::Dumper; + +use FlowPDF::Exception::UnexpectedEmptyValue; + +sub newMetadataFromPayload { + my ($self, $payload) = @_; + + # TODO: Add class fields validation here. + my $keys = $self->getPayloadKeys(); + my $uniqueKey = $self->getUniqueKey(); + + my $values = {}; + my $payloadValues = $payload->getValues(); + for my $key (@$keys) { + if (!exists $payloadValues->{$key}) { + FlowPDF::Exception::UnexpectedEmptyValue->new("Key $key does not exist in payload, can't create metadata.")->throw(); + } + $values->{$key} = $payloadValues->{$key}; + } + my $metadata = FlowPDF::Component::EF::Reporting::Metadata->new({ + reportObjectTypes => $self->getReportObjectTypes(), + uniqueKey => $self->getUniqueKey(), + propertyPath => $self->getPropertyPath(), + value => $values, + pluginObject => $self->getPluginObject() + }); + + return $metadata; +} + +sub buildMetadataName { + my ($self) = @_; + + my $reportObjectTypes = $self->getReportObjectTypes(); + # TODO: Move this validation to validate() function later, during cleanup phase. + if (ref $reportObjectTypes ne 'ARRAY') { + croak "Array reference is required"; + } + my $po = $self->getPluginObject(); + if (!$po) { + croak "Missing plugin object for metadata name."; + } + my $pluginName = $po->getPluginName(); + my $uniqueKey = $self->getUniqueKey(); + my $reportObjectTypeString = join('-', sort {$a cmp $b} @$reportObjectTypes); + + my $metadataName = sprintf('%s-%s-%s', $pluginName, $uniqueKey, $reportObjectTypeString); + + return $metadataName; +} + + +sub newFromLocation { + my ($self) = @_; + + my $location = $self->getPropertyPath(); + fwLogDebug("Got property path: $location"); + my $metadata = FlowPDF::Component::EF::Reporting::Metadata->newFromLocation( + $self->getPluginObject(), $location + ); + fwLogDebug("Metadata:", Dumper $metadata); + if (!$metadata) { + return undef; + } + + my $payloadKeys = $self->getPayloadKeys(); + my $metadataValue = $metadata->getValue(); + + for my $k (@$payloadKeys) { + if (!exists $metadataValue->{$k}) { + FlowPDF::Exception::UnexpectedEmptyValue->new("Declared metadata key '$k' is not present in metadata.")->throw(); + } + } + return $metadata; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payload.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payload.pm new file mode 100644 index 00000000..5ef5b34d --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payload.pm @@ -0,0 +1,291 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting::Payload + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A payload object. + +=head1 METHODS + +=head2 getReportObjectType() + +=head3 Description + +Returns a report object type for current payload. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Report object type for current payload + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $reportObhectType = $payload->getReportObjectType(); + +%%%LANG%%% + + + +=head2 getValues() + +=head3 Description + +Returns a values that will be sent for the current payload. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (HASH ref) A values for the current payload to be sent. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $values = $payload->getValues(); + +%%%LANG%%% + +=head2 getDependentPayloads() + +=head3 Note + +B + +=head3 Description + +This method returns a dependent payloads for the current payload. + +This method may be used when there is more than one report object type should be send in the context of a single payload. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (ARRAY ref of FlowPDF::Component::EF::Reporting::Payload) + +=back + +=head3 Exceptions + +=head3 Usage + +%%%LANG=perl%%% + + my $payloads = $payload->getDependentPayloads(); + +%%%LANG%%% + +=cut + + +package FlowPDF::Component::EF::Reporting::Payload; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + reportObjectType => FlowPDF::Types::Scalar(), + values => FlowPDF::Types::Reference('HASH'), + dependentPayloads => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('FlowPDF::Component::EF::Reporting::Payload')), +}); + +use strict; +use warnings; +use JSON; +use ElectricCommander; +use FlowPDF::Log; +use FlowPDF::Log::FW; + +use FlowPDF::Exception::MissingFunctionArgument; +use FlowPDF::Exception::WrongFunctionArgumentType; + +# local $| = 1; + +my $ELECTRIC_COMMANDER_OBJECT; + +sub setEc { + my ($ec) = @_; + + if (!$ec) { + FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'ElectricCommander object', + function => 'setEc' + })->throw(); + } + if (ref $ec ne 'ElectricCommander') { + FlowPDF::Exception::WrongFunctionArgumentType->new({ + function => 'setEc', + argument => 'ec', + got => ref $ec, + expected => 'ElectricCommander' + })->throw(); + } + + $ELECTRIC_COMMANDER_OBJECT = $ec; + return $ec; +} + + +sub getEc { + return $ELECTRIC_COMMANDER_OBJECT if $ELECTRIC_COMMANDER_OBJECT; + + fwLogDebug "ElectricCommander object has not been set for " . __PACKAGE__ . ", creating default object."; + my $ec = ElectricCommander->new(); + return setEc($ec); +} + + +sub encode { + my ($self) = @_; + + my $encodedPayload = encode_json($self->getValues()); + return $encodedPayload; +} + +# TODO: Switch logic to this method. +sub sendAllReportsToEF { + my ($self) = @_; + + my $result = $self->sendReportToEF(); + + my $dependentPayloads = $self->getDependentPayloads(); + + unless (@$dependentPayloads) { + return $result; + } + + my $result2 = []; + for my $dp (@$dependentPayloads) { + my $tempResult = $dp->sendReportToEF(); + push @$result2, $tempResult; + } + + # TODO: add error handling here. + return $result2; +} +sub sendReportToEF { + my ($self) = @_; + + my $ec = $self->getEc(); + my $retval = { + ok => 1, + message => '', + }; + + my $payload = $self->getValues(); + my $reportObjectType = $self->getReportObjectType(); + my $encodedPayload = $self->encode(); + fwLogInfo "Encoded payload to send: $encodedPayload"; + + if (FlowPDF::Component::EF::Reporting->isPreview()) { + fwLogInfo("Preview mode is enabled, nothing to send"); + return 1; + } + + my $xpath = $ec->sendReportingData({ + payload => $encodedPayload, + reportObjectTypeName => $reportObjectType + }); + + my $errorCode = $xpath->findvalue('//error/code')->string_value(); + if ($errorCode) { + $retval->{ok} = 0; + $retval->{message} = $errorCode; + logError "Error occured during reporting: " . Dumper $retval; + if (!$retval->{message}) { + logError "No error message found. Full error xml: $xpath->{_xml}"; + } + } + return $retval; +} + +# TODO: Implement addition of dependent payload. + +sub createNewDependentPayload { + my ($self, $reportObjectType, $values) = @_; + + if (!$reportObjectType) { + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'createNewDependentPayload', + argument => 'reportObjectType' + })->throw(); + } + if (!$values) { + $values = {}; + } + my $dep = $self->getDependentPayloads(); + my $payload = __PACKAGE__->new({ + reportObjectType => $reportObjectType, + values => $values, + dependentPayloads => [], + }); + push @$dep, $payload; + return $payload; +} + + +sub addDependentPayload { + my ($self, $payload) = @_; + if (!$payload || ref $payload ne __PACKAGE__) { + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'addDependentPayload', + argument => 'payload', + })->throw(); + } + + my $dep = $self->getDependentPayloads(); + push @$dep, $payload; + + return $self; +} + +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payloadset.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payloadset.pm new file mode 100644 index 00000000..2dc1b67e --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Payloadset.pm @@ -0,0 +1,316 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::EF::Reporting::Payloadset + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A payloadset object. + +=head1 METHODS + + +=head2 getReportObjectTypes() + +=head3 Description + +Returns an array reference of string report object types for current set of payloads + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (ARRAY ref) Report object types + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $reportObjectTypes = $payloadSet->getReportObjectTypes(); + +%%%LANG%%% + + +=head2 getPayloads() + +=head3 Description + +Returns an array references to the payloads. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (ARRAY ref) of L + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $payloads = $payloadset->getPayloads(); + +%%%LANG%%% + +=head2 newPayload($params) + +=head3 Description + +Creates a new payload and adds it to current payload set and returns a reference for it. + +=head3 Parameters + +A hash reference with following fields + +=over 4 + +=item (Required)(String) reportObjectType: a report object type for the current payload + +=item (Optional)(HASH ref) values: a values that will be send to the Devops Insight Center. An actual payload. + +=back + +=head3 Returns + +=over 4 + +=item (L) A reference to newly created payload. + +=back + +=head3 Exceptions + +=over 4 + +=item Fatal error if required fields are missing. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $payload = $payloadSet->newPayload({ + reportObjectType => 'build', + values => { + buildNumber => '2', + status => 'success', + } + }); + +%%%LANG%%% + +=cut + +package FlowPDF::Component::EF::Reporting::Payloadset; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + ec => FlowPDF::Types::Reference('ElectricCommander'), + reportObjectTypes => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + payloads => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('FlowPDF::Component::EF::Reporting::Payload')) +}); + +use strict; +use warnings; +use JSON; + +use FlowPDF::Helpers qw/inArray/; +use FlowPDF::Component::EF::Reporting::Payload; +use FlowPDF::Log; + + +=head2 newPayload($params) + +=head3 Description + +Returns an array reference of string report object types for current set of payloads + +=head3 Parameters + +A hash reference with following fields + +=over 4 + +=item (Required)(String) reportObjectType: a report object type for the current payload + +=item (Optional)(HASH ref) values: a values that will be send to the Devops Insight Center. An actual payload. + +=back + +=head3 Returns + +=over 4 + +=item (L) A reference to newly created payload. + +=back + +=head3 Exceptions + +=over 4 + +=item Fatal error if required fields are missing. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $payload = $payloadSet->newPayload({ + reportObjectType => 'build', + values => { + buildNumber => '2', + status => 'success', + } + }); + +%%%LANG%%% + +=cut + +sub newPayload { + my ($self, $params) = @_; + + if (!$params->{dependentPayloads}) { + $params->{dependentPayloads} = []; + } + my $payload = FlowPDF::Component::EF::Reporting::Payload->new($params); + + my $payloads = $self->getPayloads(); + push @$payloads, $payload; + return $payload; +} + + +# private function +sub report { + my ($self) = @_; + + my $retval = {}; + my $payloads = $self->getPayloads(); + reportRecursive($payloads, $retval); + return $retval; +} + + +sub reportOld { + my ($self) = @_; + + my $payloads = $self->getPayloads(); + + my $retval = {}; + for my $row (@$payloads) { + $row->sendReportToEF(); + $retval->{$row->getReportObjectType()}++; + } + return $retval; +} + +sub reportRecursive { + my ($payloads, $retval) = @_; + # use Data::Dumper; + # print Dumper \@_; + for my $row (@$payloads) { + $row->sendReportToEF(); + $retval->{$row->getReportObjectType()}++; + my $dep = $row->getDependentPayloads(); + if (@$dep) { + reportRecursive($dep, $retval); + } + } +} + +=head2 getLastPayload() + +=head3 Description + +Returns the last payload from current Payloadset. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (L) A reference to the last payload. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $lastPayload = $payloadSet->getLastPayload(); + +%%%LANG%%% + +=cut + +sub getLastPayload { + my ($self) = @_; + + my $payloads = $self->getPayloads(); + return $payloads->[-1]; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Transformer.pm b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Transformer.pm new file mode 100644 index 00000000..b54a23ea --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/EF/Reporting/Transformer.pm @@ -0,0 +1,59 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Component::EF::Reporting::Transformer; +use base qw/FlowPDF::BaseClass2/; +no warnings qw/redefine/; +use FlowPDF::Types; +use FlowPDF::Exception::RuntimeException; + +__PACKAGE__->defineClass({ + pluginObject => FlowPDF::Types::Any(), + transformScript => FlowPDF::Types::Scalar(), + transformer => FlowPDF::Types::Reference('EC::Mapper::Transformer'), +}); + + +use strict; +use warnings; +use FlowPDF::Log; + +sub load { + my ($self) = @_; + + my $transformScript = $self->getTransformScript(); + if (!$transformScript) { + logInfo("No transform script has been provided"); + return $self; + } + + my $tempTransformer = "package EC::Mapper::Transformer;\n" . + q|sub transform {my ($payload) = @_; return $payload}| . "\n" . + q|no warnings 'redefine';| . + $transformScript . + "1;\n"; + + + eval $tempTransformer; + if ($@) { + FlowPDF::Exception::RuntimeException->new("Error occured during loading of transform script: $@")->throw(); + } + my $transformer = {}; + my $blessedTransformer = bless $transformer, "EC::Mapper::Transformer"; + + $self->setTransformer($blessedTransformer); + return $self; +} + + +sub transform { + my ($self, $record) = @_; + + logInfo("Transformer object:", Dumper $self); + my $blessedTransformer = $self->getTransformer(); + return $blessedTransformer->transform($record); +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/OAuth.pm b/src/main/resources/project/pdk/FlowPDF/Component/OAuth.pm new file mode 100644 index 00000000..997c5032 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/OAuth.pm @@ -0,0 +1,435 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::OAuth; + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A component to integrate with OAuth 1.0 + +=head1 INIT PARAMS + +To read more about init params see L. + +This component support following init params: + +=over 4 + +=item (Required) base_url + +=item (Required) oauth_consumer_key + +=item (Required) oauth_signature_method + +=item (Required) oauth_version + +=item (Optional) oauth_nonce + +=item (Optional) oauth_timestamp + +=item (Optional) oauth_version + +=item (Optional) request_method + +=item (Optional) oauth_token + +=item (Optional) oauth_verifier + +=item (Optional) oauth_callback + +=item (Optional) oauth_signature + +=back + + +=head1 USAGE + +%%%LANG=perl%%% + + my $rest = FlowPDF::Client::REST->new({ + oauth => { + private_key=> $privateKey, + oauth_token => $token, + oauth_consumer_key => $oauthConsumerKey, + oauth_version => '1.0' + } + }); + my $jiraUrl = 'http://jira:8080'; + # rest client will automatically load FlowPDF::Component::OAuth. You just need to get it. + my $oauth = FlowPDF::ComponentManager->getComponent('FlowPDF::Component::OAuth'); + # create a hash reference request params, using oauth component + my $requestParams = $oauth->augment_params_with_oauth('GET', $jiraUrl, {}); + # add these parameters to the request URL. + $jiraUrl = $rest->augmentUrlWithParams($jiraUrl, $requestParams); + # create request + my $request = $rest->newRequest(GET => $jiraUrl); + my $response = $rest->doRequest($request); + +%%%LANG%%% + +=over + +=cut + +package FlowPDF::Component::OAuth; +use base qw/FlowPDF::Component/; +use strict; +# use warnings; +use warnings FATAL => 'all'; + + + +use Data::Dumper; +use Carp; + +use URI; +use URI::Escape qw/uri_escape/; +use MIME::Base64 qw/encode_base64/; + +use LWP::UserAgent; +use HTTP::Request; +use JSON qw/encode_json/; + +# TODO: implement dependencies system +use Bytes::Random::Secure::Tiny; + +my @oauth_keys = qw/oauth_consumer_key oauth_nonce oauth_signature_method oauth_timestamp oauth_version request_method/; +my @optional_oauth_keys = qw/oauth_token oauth_verifier oauth_callback oauth_signature/; + +=item B + +=cut + +sub init { + my ($class, $params) = @_; + + return $class->new($params); +} + + +sub new { + my ($class, $oauth_params) = @_; + + # Checking mandatory fields + for my $cfg_param (qw/base_url oauth_consumer_key oauth_version oauth_signature_method/){ + croak "Missing mandatory OAuth parameter '$cfg_param'.\n" unless $oauth_params->{$cfg_param}; + } + + if ($oauth_params->{oauth_signature_method} eq 'RSA-SHA1' && !$oauth_params->{private_key}){ + croak "Missing mandatory OAuth parameter 'private_key'.\n"; + } + + my $self = { %$oauth_params }; + + # Initializing secure random generator + $self->{rng} = Bytes::Random::Secure::Tiny->new; + + return bless($self, $class); +} + + +=item B + +=cut +sub request { + my ( $self, $method, $url, $request_params ) = @_; + + my $query_params = $self->augment_params_with_oauth($method, $url, $request_params); + + my URI $url_with_oauth = URI->new($url); + + if ('GET' eq $method) { + $url_with_oauth->query_form($query_params); + } + + my HTTP::Request $req = HTTP::Request->new($method, $url_with_oauth); + + if ($method =~ m/POST|PUT|DELETE|OPTIONS/si) { + # Extract oauth params + my %oauth_params = (); + my @oauth_params = (@oauth_keys, @optional_oauth_keys); + + for my $p (@oauth_params){ + if (exists $query_params->{$p}){ + $oauth_params{$p} = $query_params->{$p}; + delete $query_params->{$p}; + } + } + + # $req->header('Authorization', "Bearer " + # . join(",\n", map {_encode($_). "=" . _encode($oauth_params{$_})} keys %oauth_params)); + + $req->uri->query_form(\%oauth_params); + + $req->header('Content-Type', 'application/json'); + $req->content(encode_json($query_params)); + } + + my $ua = $self->ua(); + my HTTP::Response $res = $ua->request($req); + + # All OAuth problems are returned in WWW-Authenticate header or response body + if (my @auth_headers = $res->header('www-authenticate')) { + for my $auth_response (@auth_headers) { + $auth_response =~ /oauth_problem="([a-z_]+)",?/ if $auth_response; + die "OAUTH PROBLEM: " . $1 . "\n" if $1; + } + } + + my $content = $res->decoded_content(); + die 'No content in response' if ! $content; + + return $content; +} + +=item B + +=cut +sub augment_params_with_oauth { + my ( $self, $method, $url, $request_params ) = @_; + + # Clear URL + $url =~ s/\?.*$//; + + my %params = ( %{$request_params ? $request_params : {}} ); + + $self->renew_nonce(); + + # Adding optional keys + # "oauth_token" not exists on first request + # "oauth_verifier" and "oauth_callback" are used only in OAuth 1.0a version + for my $optional_key (@optional_oauth_keys) { + next unless $self->{$optional_key}; + push @oauth_keys, $optional_key; + } + + # OAuth params are stored in self + foreach my $oauth_k (@oauth_keys) { + croak "Missing OAuth parameter $oauth_k" unless $self->{$oauth_k}; + $params{$oauth_k} = $self->{$oauth_k}; + } + + # Calculate signature + my $sign = $self->calculate_the_signature($url, $method, %params); + + # Prepare your content + my %request_params = ( + %params, + oauth_signature => MIME::Base64::encode_base64($sign, ''), + ); + + # Form request parameters from given params hash + for my $k (keys %params) { + croak "Missing value for $k" unless defined $params{$k}; + $request_params{$k} = uri_escape($params{$k}); + } + + return \%request_params; +} + +=item B + +Collect all parameters for signature string: + - Request method + - Request path + - All parameters that will be in query (collect and encode all at once) + +=cut +sub calculate_the_signature { + my ( $self, $url, $method, %request_params ) = @_; + + my @params_for_signature = (); + if ($method eq 'GET'){ + # All parameters will be used for a signature + for my $k (sort keys %request_params) { + push(@params_for_signature, "$k=$request_params{$k}"); + } + } + elsif ($method =~ m/POST|PUT|DELETE|OPTIONS/si) { + # In POST method only oauth parameters are collected to base signature string + my %oauth_lookup = map { $_ => 1 } (@oauth_keys, @optional_oauth_keys); + for my $k (sort keys %request_params) { + if ($oauth_lookup{$k}){ + push(@params_for_signature, "$k=$request_params{$k}") ; + } + } + } + else { + croak "Unsupported method $method"; + } + + my @sign_parameters = (); + push(@sign_parameters, $method); + push(@sign_parameters, _encode($url)); + push(@sign_parameters, _encode(join('&', @params_for_signature))) if (@params_for_signature); + + my $sign_base_string = join('&', @sign_parameters); + + if ('RSA-SHA1' eq $self->{oauth_signature_method}) { + croak("Private key is missing") unless $self->{private_key}; + + # Require only if not already imported + # Should be loaded from property (due to newer Math::BigInt) + if (!$Crypt::Perl::RSA::Parse::VERSION) { + # Forcing Math::BigInt libraries to be loaded from property + $INC{'Math/BigInt'} = $INC[$#INC]; + $INC{'Math/BigInt/Calc'} = $INC[$#INC]; + $INC{'Math/BigInt/Pari'} = $INC[$#INC]; + + # require EC::OAuthDependencies::RSA; + require FlowPDF::Service::RSA; + + Crypt::Perl::RSA::Parse->import(); + Crypt::Perl::RSA::PrivateKey->import(); + } + + my $prv_key = Crypt::Perl::RSA::Parse::private($self->{private_key}); + my $sign = $prv_key->sign_RS1($sign_base_string); + + die "Signature length incorrect \n" unless (length $sign == 128); + + return $sign; + } + if ('HMAC-SHA1' eq $self->{oauth_signature_method}) { + my $secret = $self->{oauth_secret}; + require Digest::SHA; + Digest::SHA->import(qw/hmac_sha1/); + + croak 'Not sure about params for hmac_sha1'; + return Digest::SHA::hmac_sha1($secret . '&' . $sign_base_string); + } + + die "Unknown signature method: $self->{oauth_signature_method}. Supported: RSA-SHA1, HMAC-SHA1\n"; +} + +=item B + +=cut +sub parse_token_response { + my ( $self, $content ) = @_; + + my $resp = _parse_url_encoded($content); + + if ($resp->{oauth_problem}) { + print "OAuth problem: $resp->{oauth_problem}"; + return undef; + } + + if ($self->{oauth_token_secret} && $self->{oauth_token_secret} ne $resp->{oauth_token_secret}) { + croak "Someone has tampered request. OAuth token secrets not are equal" + } + + $self->{oauth_token} = $resp->{oauth_token}; + $self->{oauth_token_secret} = $resp->{oauth_token_secret}; + + return( $resp->{oauth_token}, $resp->{oauth_token_secret} ); +} + +=item B + +=cut +sub request_token { + my ( $self ) = @_; + my $response = $self->request($self->{request_method}, $self->{base_url} . $self->{request_token_path}); + $self->parse_token_response($response); +} + +=item B + +=cut +sub authorize_token { + my ( $self ) = @_; + my $response = $self->request($self->{request_method}, $self->{base_url} . $self->{access_token_path}); + $self->parse_token_response($response); +} + +=item B + +=cut +sub generate_auth_url { + my ( $self, $token, %extra_params ) = @_; + + $token ||= $self->{oauth_token}; + + die 'No request token' unless $token; + + my $oauth_url = URI->new($self->{base_url} . $self->{authorize_token_path}); + $oauth_url->query_form({ + oauth_token => $token, + %{( %extra_params ) ? \%extra_params : {}} + }); + + return $oauth_url; +} + +=item B + +=cut +sub renew_nonce { + my ( $self ) = @_; + + my $ts = time(); + + $self->{oauth_timestamp} = $ts; + $self->{oauth_nonce} = $ts . $self->{rng}->irand(); +} + +=item B<_encode> + +=cut +sub _encode { + my ( $str ) = @_; + return URI::Escape::uri_escape_utf8($str, '^\w.~-') +} + +=item B<_parse_url_encoded> + +=cut +sub _parse_url_encoded { + my ( $query ) = @_; + return unless $query; + + # Parse query + my %query_params = (); + my @pairs = split('&', $query); + + foreach my $pair (@pairs) { + next unless $pair; + my ( $k, $v ) = split('=', $pair); + next unless $k; + $query_params{$k} = $v || ''; + } + + return \%query_params; +} + +=item B + +=cut +sub ua { + my ( $self, $value ) = @_; + + if (defined $value) { + $self->{_ua} = $value; + return 1; + } + + if (! $self->{_ua}) { + $self->{_ua} = LWP::UserAgent->new(); + } + + return $self->{_ua}; +} + +=back + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Component/Proxy.pm b/src/main/resources/project/pdk/FlowPDF/Component/Proxy.pm new file mode 100644 index 00000000..967260bf --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Component/Proxy.pm @@ -0,0 +1,410 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Component::Proxy + +=head1 DESCRIPTION + +This module provides standard mechanism for proxy-handling for ElectricFlow plugins. +This implementation should be used any time when proxy requirement appears. + +=head1 Q&A + +=head2 Why do we need a module, if one can just set environment variables? + +It is a good question. Since our current perl is way too old (5.8.8 now), we have some +outdated modules and bugs, that have been fixed in releases after 5.8.8. For example, +we can't use default LWP functionality for https proxy handling due to bugs in LWP. +But there is a way to deal with that. We have Crypt::SSLeay module installed, +that provides requried functionality by the default way of the *nix OS. It is respects env variables. + +This module does B implementation of all that logic and workarounds and should be used as +said in this help and provides a possibility to developer to change actual implementation of proxy +code without changing the interface. It is mush simpler than fix it in each plugin separately. + + +=head1 AUTHOR + +Dmitriy Shamatrin + +=head1 SYNOPSIS + +%%%LANG=perl%%% + use FlowPDF::Component::Proxy; + + # create proxy dispatcher object + my $proxy = EC::ProxyDriver->new({ + url => 'http://docker:3128', + username => 'user1', + password => 'password1', + debug => 0, + }); + + # apply proxy + + $proxy->apply(); + + # run some proxy related code + ...; + + # detach proxy, if required. + $proxy->detach(); +%%%LANG%%% + +=head1 METHODS + +=over + +=cut + +package FlowPDF::Component::Proxy; +use base qw/FlowPDF::Component/; +use strict; +use warnings; +use Carp; +use Data::Dumper; +use FlowPDF::Log; + +our $VERSION = 0.02; +our $componentName = 'FlowPDF::Component::Proxy'; +our $componentVersion = $VERSION; + +sub init { + my ($class, $params) = @_; + + return $class->new($params); +} + + +=item B + +Constructor method, creates proxy dispatcher object. + +%%%LANG=perl%%% + my $proxy = EC::ProxyDriver->new({ + url => 'http://docker:3128', + username => 'user1', + password => 'password1', + debug => 0, + }); +%%%LANG%%% + +=cut + +sub new { + my ($class, $params) = @_; + + my $self = { + _auth_method => $params->{auth_method} || 'basic', + _proxy_url => $params->{url} || '', + _proxy_username => $params->{username} || '', + _proxy_password => $params->{password} || '', + _debug => ($params->{debug} ? 1 : 0), + __detach_list => [], + }; + + bless $self, $class; + return $self; +} + + +=item B + +Applies proxy changes to whole context in a right way. One should use that function +and be sure that proxy is set. + +%%%LANG=perl%%% + $proxy->apply(); +%%%LANG%%% + +=cut + +sub apply { + my ($self) = @_; + + unless ($self->url()) { + $self->debug_msg("No proxy url has been provided. Nothing to do."); + } + + ## temporary disabled setting of HTTP_PROXY env + # $self->debug_msg("Attaching ENV HTTP_PROXY: ", $self->url()); + # $self->set_env(HTTP_PROXY => $self->url()); + $self->debug_msg("Attaching ENV HTTPS_PROXY: ", $self->url()); + $self->set_env(HTTPS_PROXY => $self->url()); + + if ($self->username()) { + $self->debug_msg("Attaching ENV HTTPS_PROXY_USERNAME: ", $self->username()); + $self->set_env(HTTPS_PROXY_USERNAME => $self->username()); + } + + if ($self->password()) { + $self->debug_msg("Attaching HTTPS_PROXY_PASSWORD: [PROTECTED]"); + $self->set_env(HTTPS_PROXY_PASSWORD => $self->password()); + } + return $self; +} + + +sub set_env { + my ($self, $env_name, $value) = @_; + + $ENV{$env_name} = $value; + push @{$self->{__detach_list}}, $env_name; + return $self; +} + + +=item B + +Disables proxy for a whole context. It could be useful sometimes to revert all changes that was made by apply function. + +%%%LANG=perl%%% + $proxy->detach(); +%%%LANG%%% + +=cut + +sub detach { + my ($self) = @_; + + while (my $e = pop(@{$self->{__detach_list}})) { + $ENV{$e} = '[PROTECTED]' if $e eq 'HTTPS_PROXY_PASSWORD'; + $self->debug_msg("Detaching ENV $e value ($ENV{$e})"); + delete $ENV{$e}; + } + return $self; +} + + +sub getset { + my ($self, $field, $value) = @_; + + if (!exists $self->{$field}) { + croak "Field $field does not exist, aborting..."; + } + if (!defined $value) { + return $self->{$field}; + } + + $self->{$field} = $value; + return 1; +} + + +=item B + +Returns a proxy url if set. Returns empty string if not. + +%%%LANG=perl%%% + my $proxy_url = $proxy->url(); +%%%LANG%%% + +=cut + +sub url { + my ($self, $value) = @_; + + return $self->getset('_proxy_url' => $value); +} + + +=item B + +Returns a proxy auth method that is being used. Currently only basic is supported, +which is set as default. + +%%%LANG=perl%%% + my $auth_method = $proxy->auth_method(); +%%%LANG%%% + +=cut + +sub auth_method { + my ($self, $value) = @_; + + return $self->getset('_auth_method' => $value); +} + + +=item B + +Returns a proxy auth username if set. Returns empty string if not. + +%%%LANG=perl%%% + my $proxy_url = $proxy->username(); +%%%LANG%%% + +=cut + +sub username { + my ($self, $value) = @_; + + return $self->getset('_proxy_username' => $value); +} + + +=item B + +Returns a proxy auth password if set. Returns empty string if not. + +%%%LANG=perl%%% + my $proxy_url = $proxy->password(); +%%%LANG%%% + +=cut + +sub password { + my ($self, $value) = @_; + + return $self->getset('_proxy_password' => $value); +} + + +=item B + +Enables and disables debug mode for module. + +To enable: + +%%%LANG=perl%%% + $proxy->debug(1); +%%%LANG%%% + +To disable + +%%%LANG=perl%%% + $proxy->debug(0); +%%%LANG%%% + +=cut + +sub debug { + my ($self, $value) = @_; + + if (defined $value && $value !~ m/^\d+$/s) { + croak "Debug should be integer, not '$value'"; + } + return $self->getset('_debug' => $value); +} + + +=item B + +Augments HTTP::Request object with proxy headers. + +%%%LANG=perl%%% + my $req = HTTP::Request->new(...); + $req = $proxy->augment_request($req); +%%%LANG%%% + +=cut + +sub augment_request { + my ($self, $request_object) = @_; + + if (!$request_object) { + croak "Request object could not be empty"; + } + if (ref $request_object ne 'HTTP::Request') { + croak "HTTP::Request object expected, got: ", ref $request_object; + } + my ($proxy_username, $proxy_password) = ($self->username(), $self->password()); + if ($proxy_username || $proxy_password) { + $self->debug_msg("Augmenting request object with username: ", $proxy_username, " and password: [PROTECTED]"); + $request_object->proxy_authorization_basic($proxy_username, $proxy_password); + } + return $request_object; +} + + +=item B + +Detaches changes of request and removes added headers. + +%%%LANG=perl%%% + $req = $proxy->detach_request($req); +%%%LANG%%% + +=cut + +sub detach_request { + my ($self, $request_object) = @_; + + return $request_object; +} + + +=item B + +Augments LWP::UserAgent object with proxy information. + +%%%LANG=perl%%% + my $ua = LWP::UserAgent->new(...); + $ua = $proxy->augment_lwp($ua); +%%%LANG%%% + +=cut + +sub augment_lwp { + my ($self, $ua) = @_; + + if (!$ua) { + croak "LWP object could not be empty"; + } + if (ref $ua ne 'LWP::UserAgent') { + croak "LWP::UserAgent object expected, got: ", ref $ua; + } + my $proxy_url = $self->url(); + if ($proxy_url) { + $self->debug_msg("Augmenting LWP object with HTTP proxy settings: ", $proxy_url); + $ua->proxy(['http'] => $proxy_url); + } + + return $ua; +} + + +=item B + +Removes proxy setup from an LWP object. + +%%%LANG=perl%%% + $ua = $proxy->detach_lwp($ua); +%%%LANG%%% + +=cut + +sub detach_lwp { + my ($self, $ua) = @_; + + if (!$ua) { + croak "LWP object could not be empty"; + } + if (ref $ua ne 'LWP::UserAgent') { + croak "LWP::UserAgent object expected, got: ", ref $ua; + } + + $ua->{proxy} = {}; + return $ua; +} + + +sub debug_msg { + my ($self, @msg) = @_; + + if ($self->debug()) { + my $msg = join '', @msg; + $msg = '[DEBUG]: ' . $msg; + print $msg, "\n"; + } + return 1; +} + +1; + +=back + +=cut diff --git a/src/main/resources/project/pdk/FlowPDF/ComponentManager.pm b/src/main/resources/project/pdk/FlowPDF/ComponentManager.pm new file mode 100644 index 00000000..f407c2b8 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/ComponentManager.pm @@ -0,0 +1,303 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::ComponentManager + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +FlowPDF::ComponentManager is a class that provides you an access to FlowPDF Components infrastructure. + +This class allows you to load components depending on you needs. + +Currently, there are 2 components loading strategies supported. + +=over 4 + +=item B + +Local component is being loaded to current FlowPDF::ComponentManager object context. + +So, it is only possible to access it from current object. + +=item B + +This is default strategy, component is being loaded for whole execution context and could be accessed from any FlowPDF::ComponentManager object. + +=back + +=head1 METHODS + +=cut + +package FlowPDF::ComponentManager; +use strict; +use warnings; + +use Data::Dumper; +use Carp; + +use FlowPDF::Log; +use FlowPDF::Helpers qw/bailOut/; + +our $COMPONENTS = {}; + +=head2 new() + +=head3 Description + +This method creates a new FlowPDF::ComponentManager object. It doesn't have parameters. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::ComponentManager + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $componentManager = FlowPDF::ComponentManager->new(); + +%%%LANG%%% + +=cut + +sub new { + my ($class, $pluginObject) = @_; + + if (!$pluginObject) { + logWarning("pluginObject parameter is required for FlowPDF::ComponentManager initialization, consider to add it."); + } + my $self = { + components_local => {}, + }; + + if ($pluginObject) { + $self->{pluginObject} = $pluginObject; + } + bless $self, $class; + return $self; +} + +=head2 loadComponentLocal($componentName, $initParams) + +=head3 Description + +Loads, initializes the component and returns its as FlowPDF::Component:: object in context of current FlowPDF::ComponentManager object. + +=head3 Parameters + +=over 4 + +=item (Required)(String) A name of the component to be loaded + +=item (Required)(HASH ref) An init parameters for the component. + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::Component:: object + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $componentManager->loadComponentLocal('FlowPDF::Component::YourComponent', {one => two}); + +%%%LANG%%% + +Accepts as parameters component name and initialization values. For details about initialization values see L + +=cut + +sub loadComponentLocal { + my ($self, $component, $params, $pluginObject) = @_; + + eval "require $component"; + $component->import(); + + my $o; + if ($component->isEFComponent()) { + if (!$pluginObject) { + bailOut("Plugin Object is required if FlowPDF::Component::EF::* or its subclass is being loaded"); + } + $o = $component->init($pluginObject, $params); + } + else { + $o = $component->init($params); + } + $self->{components_local}->{$component} = $o; + return $o; +} + +=head2 loadComponent($componentName, $initParams) + +=head3 Description + +Loads, initializes the component and returns its as FlowPDF::Component:: object in global context. + +=head3 Parameters + +=over 4 + +=item (Required)(String) A name of the component to be loaded + +=item (Required)(HASH ref) An init parameters for the component. + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::Component:: object + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $componentManager->loadComponentLocal('FlowPDF::Component::YourComponent', {one => two}); + +%%%LANG%%% + +Accepts as parameters component name and initialization values. For details about initialization values see L + +=cut + +sub loadComponent { + my ($self, $component, $params, $pluginObject) = @_; + + logTrace("Loading component $component using params" . Dumper $params); + eval "require $component" or do { + croak "Can't load component $component: $@"; + }; + logTrace("Importing component $component..."); + $component->import(); + logTrace("Imported Ok"); + + logTrace("Initializing $component..."); + my $o; + if ($component->isEFComponent()) { + if (!$pluginObject) { + bailOut("Plugin Object is required if FlowPDF::Component::EF::* or its subclass is being loaded."); + } + $o = $component->init($pluginObject, $params); + } + else { + $o = $component->init($params); + } + + logTrace("Initialized Ok"); + $COMPONENTS->{$component} = $o; + return $o; +} + + +=head2 getComponent($componentName) + +=head3 Description + +Returns an FlowPDF::Component object that was previously loaded globally. For local context see getComponentLocal. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Component to get from global context. + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::Component:: object + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $component = $componentManager->getComponent('FlowPDF::Component::Proxy'); + +%%%LANG%%% + +=cut + +sub getComponent { + my ($self, $component) = @_; + + if (!$COMPONENTS->{$component}) { + croak "Component $component has not been loaded as local component. Please, load it before you can use it."; + } + return $COMPONENTS->{$component}; +} + +=head2 getComponentLocal($componentName) + +=head3 Description + +Returns an FlowPDF::Component object that was previously loaded in local context. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Component to get from local context. + +=back + +=head3 Returns + +=over 4 + +=item FlowPDF::Component:: object + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $component = $componentManager->getComponent('FlowPDF::Component::Proxy'); + +%%%LANG%%% + +=cut + +sub getComponentLocal { + my ($self, $component) = @_; + + if (!$self->{components_local}->{$component}) { + croak "Component $component has not been loaded. Please, load it before you can use it."; + } + return $self->{components_local}->{$component}; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Config.pm b/src/main/resources/project/pdk/FlowPDF/Config.pm new file mode 100644 index 00000000..903f3c41 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Config.pm @@ -0,0 +1,213 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Config; +use ElectricCommander; + +use base qw/FlowPDF::StepParameters/; +use strict; +use warnings; + + +1; + + +=head1 NAME + +FlowPDF::Config + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class represents values of current configuration (global values) that is available in current run context by the name that is provided in procedure config form. + +=head1 SYNOPSIS + +To get an FlowPDF::Config object you need to use getConfigValues() method from L. + +=head1 METHODS + +=head2 isParameterExists() + +=head3 Description + +Returns true if parameter exists in the current configuration. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (Boolean) True if parameter exists. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + if ($configValues->isParameterExists('endpoint')) { + ...; + } + +%%%LANG%%% + +=head2 getParameter($parameterName) + +=head3 Description + +Returns an L object or L object. + +=head3 Parameter + +=over 4 + +=item (String) Name of parameter to get. + +=back + +=head3 Returns + +=over 4 + +=item (L|L) Parameter or credential by it's name + +=back + +=head3 Usage + +To get parameter object: + +%%%LANG=perl%%% + + my $query = $configValues->getParameter('query'); + +%%%LANG%%% + +If your parameter is an L object, you can get its value either by getValue() method, or using string context: + +%%%LANG=perl%%% + + print "Query:", $query->getValue(); + +%%%LANG%%% + +Or: + +%%%LANG=perl%%% + + print "Query: $query" + +%%%LANG%%% + +If your parameter is L, follow its own documentation. + +=head2 getRequiredParameter($parameterName) + +=head3 Description + +Returns an L object or L object if this parameter exists. + +If parameter does not exist, this method aborts execution with exit code 1. + +This exception can't be catched. + +=head3 Parameters + +=over 4 + +=item (String) Name of parameter to get. + +=back + +=head3 Returns + +=over 4 + +=item (L|L) Parameter or credential by it's name + +=back + +=head3 Usage + +To get parameter object: + +%%%LANG=perl%%% + + my $query = $configValues->getRequiredParameter('endpoint'); + +%%%LANG%%% + +If your parameter is an L object, you can get its value either by getValue() method, or using string context: + +%%%LANG=perl%%% + + print "Query:", $query->getValue(); + +%%%LANG%%% + +Or: + +%%%LANG=perl%%% + + print "Query: $query" + +%%%LANG%%% + +If your parameter is L, follow its own documentation. + +=head2 asHashref() + +=head3 Description + +This function returns a HASH reference that is made from FlowPDF::Config object. +Where key is a name of parameter and value is a value of parameter. + +For credentials the same pattern as for getConfigValue() from L is being followed. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (HASH reference) A HASH reference to a HASH with config values. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $config = $context->getConfigValues()->asHashref(); + logInfo("Endpoint is: $config->{endpoint}"); + +%%%LANG%%% + + +=cut diff --git a/src/main/resources/project/pdk/FlowPDF/Constants.pm b/src/main/resources/project/pdk/FlowPDF/Constants.pm new file mode 100644 index 00000000..ba9b1651 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Constants.pm @@ -0,0 +1,40 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Constants; +use base qw/Exporter/; + +use strict; +use warnings; +use constant { + # Property in configuration where debug level is being stored. + # this property is being used for automatic debug level setup. + DEBUG_LEVEL_PROPERTY => 'debugLevel', + + # Proxy related constants + HTTP_PROXY_URL_PROPERTY => 'httpProxyUrl', + PROXY_CREDENTIAL_PROPERTY => 'proxy_credential', + + # auth related constants + AUTH_SCHEME_PROPERTY => 'authScheme', + AUTH_SCHEME_VALUE_FOR_BASIC_AUTH => 'basic', + AUTH_SCHEME_VALUE_FOR_OAUTH_V1 => 'oauth', + AUTH_SCHEME_VALUE_FOR_BEARER => 'bearer', + BASIC_AUTH_CREDENTIAL_PROPERTY => 'basic_credential', + # This is not supported yet, so it is not exposed. + OAUTH_CREDENTIAL_PROPERTY => 'oauth_credential', +}; + +our @EXPORT_OK = qw/ + DEBUG_LEVEL_PROPERTY + HTTP_PROXY_URL_PROPERTY + PROXY_CREDENTIAL_PROPERTY + AUTH_SCHEME_PROPERTY + AUTH_SCHEME_VALUE_FOR_BASIC_AUTH + AUTH_SCHEME_VALUE_FOR_OAUTH_V1 + AUTH_SCHEME_VALUE_FOR_BEARER + BASIC_AUTH_CREDENTIAL_PROPERTY +/; + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Context.pm b/src/main/resources/project/pdk/FlowPDF/Context.pm new file mode 100644 index 00000000..68016be8 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Context.pm @@ -0,0 +1,1196 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Context; + +=head1 NAME + +FlowPDF::Context + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +FlowPDF::Context is a class that represents current running context. + +This class allows user to access procedure parameters, config values and define a step result. + +=head1 METHODS + +=cut + + +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; +__PACKAGE__->defineClass({ + procedureName => FlowPDF::Types::Scalar(), + stepName => FlowPDF::Types::Scalar(), + runContext => FlowPDF::Types::Scalar(), + pluginObject => FlowPDF::Types::Any(), + ec => FlowPDF::Types::Reference('ElectricCommander'), + currentStepParameters => FlowPDF::Types::Reference('FlowPDF::StepParameters'), + currentStepConfigValues => FlowPDF::Types::Reference('FlowPDF::Config'), + currentProjectName => FlowPDF::Types::Scalar(), + hasConfigField => FlowPDF::Types::Enum('1', '0'), +}); + +use strict; +use warnings; + +use FlowPDF::Config; +use FlowPDF::StepParameters; +use FlowPDF::Parameter; +use FlowPDF::Credential; +use FlowPDF::StepResult; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use FlowPDF::Client::REST; +use FlowPDF::Helpers qw/trim/; +use Try::Tiny; + +# Exceptions +use FlowPDF::Exception::ConfigDoesNotExist; +use FlowPDF::Exception::EntityDoesNotExist; +use FlowPDF::Exception::RuntimeException; + +use FlowPDF::Constants qw/ + DEBUG_LEVEL_PROPERTY + HTTP_PROXY_URL_PROPERTY + PROXY_CREDENTIAL_PROPERTY + BASIC_AUTH_CREDENTIAL_PROPERTY + AUTH_SCHEME_PROPERTY + AUTH_SCHEME_VALUE_FOR_BASIC_AUTH +/; + +use Carp; +use Data::Dumper; +use ElectricCommander; + +sub new { + my ($class, @params) = @_; + + my $self = $class->SUPER::new(@params); + my $configValues = undef; + + $configValues = $self->getConfigValues(); + if ($configValues) { + my $debugLevel = $configValues->getParameter(DEBUG_LEVEL_PROPERTY); + if ($debugLevel) { + FlowPDF::Log::setLogLevel($debugLevel->getValue()); + fwLogDebug("Debug level is set to ", $debugLevel->getValue()); + } + } + unless ($self->getEc()) { + $self->setEc(ElectricCommander->new()); + } + + $self->setRunContext($self->buildRunContext()); + $self->setCurrentProjectName($self->retrieveCurrentProjectName()); + return $self; +} + + +=head2 bailOut($params) + +=head3 Description + +An advanced version of bailOut from L::bailOut. +This version has connections with CloudBees Flow and has following benefits: + +=over 4 + +=item Sets a Pipeline Summary. + +=item Sets a JobStep Summary. + +=item Sets outcome to Error. + +=item Adds diagnostic messages to Diagnostic tab of the job. + +=item Add suggestion if provided. + +=back + +=head3 Parameters + +=over 4 + +=item (Required)(HASH ref) A hash reference with message and suggestion fields. Message is mandatory, suggestion is optional + +=cut + +=back + +=head3 Returns + +=over 4 + +=item None + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +This function is being used through context object. Also, note, that this function created it's own L object. +It means, that if this function is being used, no other L objects will be auto-applied. + +This function uses bailOut function from L package and causes an exception, + that could not be handled and your step will exit immedieately with code 1. + +%%%LANG=perl%%% + +# this function will call an exit 1. +$context->bailOut({ + message => "File not found", + suggestion => 'Please, check that you are using correct resource.' +}); + +%%%LANG%%% + +=cut + +sub bailOut { + my ($self, $params) = @_; + + if (!ref $params) { + my $message = $params; + $params = {message => $message}; + } + + if (!$params->{message} && !$params->{suggestion}) { + exit 1; + } + + my $stepResult = $self->newStepResult(); + my $message = $params->{message}; + + if ($self->getRunContext() eq 'pipeline') { + $stepResult->setPipelineSummary("BAILED OUT: ", $message); + } + + $stepResult->setJobStepOutcome('error'); + $stepResult->setJobStepSummary($message); + logErrorDiag("BAILED OUT: $message"); + if ($params->{suggestion}) { + logInfoDiag($params->{suggestion}); + } + $stepResult->apply(); + FlowPDF::Helpers::bailOut($message); +} + +=head2 getRuntimeParameters() + +=head3 Description + +A simplified accessor for the step parameters and config values. +This function returns a regular perl HASH ref from parameters and config values. + +Credentials from 'credential' parameter will be present in this hashref as 'user' and password. +Credentials, that have name like 'proxy_credential' will be mapped to 'proxy_user' and 'proxy_password' parameters. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (HASH ref) A merged parameters from step parameters and config values. + +=back + +=head3 Usage + +For example, you have 'query' parameter and 'location' parameter in your procedure form.xml. +In your configuration you have 'credential', 'proxy_credential', 'contentType' and 'userAgent'. +In that case you can get runtime parameters like: + +%%%LANG=perl%%% + + my $simpleParams = $context->getRuntimeParameters(); + +%%%LANG%%% + +Now, $simpleParams is: + +%%%LANG=perl%%% + + { + # Values from config + user => 'admin', + password => '12345', + proxy_user => 'proxy', + proxy_password => 'qwerty', + contentType => 'application/json', + userAgent => 'Mozilla', + # values from step parameters + location => 'California', + query => 'SELECT * FROM commander.plugins' + } + +%%%LANG%%% + +=cut + +sub getRuntimeParameters { + my ($self) = @_; + + my $p = $self->getStepParameters(); + my $c = undef; + $c = $self->getConfigValues(); + + # eval { + # $c = $self->getConfigValues(); + # 1; + # } or do { + # if ($self->getHasConfigField()) { + # FlowPDF::Helpers::bailOut("Can't get config: $@"); + # } + # }; + + my $retval = {}; + my $stepParametersAsHashref = {}; + my $configValuesAsHashref = {}; + + if ($p) { + $stepParametersAsHashref = $p->asHashref(); + } + if ($c) { + $configValuesAsHashref = $c->asHashref(); + } + $retval = { + %$stepParametersAsHashref, + %$configValuesAsHashref + }; + + return $retval; +} + + +=head2 getStepParameters() + +=head3 Description + +Returns a L object to be used as accessor for current step parameters. +This method does not require parameters. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (L) Parameters for the current step + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $params = $context->getStepParameters(); + # this method returns a L object, or undef, if no parameter with that name has been found. + my $param = $params->getParameter('myStepParameter'); + if ($param) { + print "Param value is:", $param->getValue(), "\n"; + } + +%%%LANG%%% + +=cut + +sub getStepParameters { + my ($context) = @_; + + if (my $retval = $context->getCurrentStepParameters()) { + return $retval; + } + + my $stepParametersHash = $context->getCurrentStepParametersAsHashref(); + my $parametersList = []; + my $parameters = {}; + for my $k (keys %$stepParametersHash) { + if ($context->getPluginObject()->isConfigField($k)) { + $context->setHasConfigField('1'); + } + push @{$parametersList}, $k; + my $p; + if (!ref $stepParametersHash->{$k}) { + $p = FlowPDF::Parameter->new({ + name => $k, + value => $stepParametersHash->{$k} + }); + } + else { + # it is a hash reference, so it is credential + $p = FlowPDF::Credential->new({ + credentialName => $k, + # TODO: Change it to something more reliable later. + # Currently we have support of default credentials only. + credentialType => 'default', + userName => $stepParametersHash->{$k}->{userName}, + secretValue => $stepParametersHash->{$k}->{password}, + }); + } + $parameters->{$k} = $p; + } + + my $stepParameters = FlowPDF::StepParameters->new({ + parametersList => $parametersList, + parameters => $parameters + }); + + # During create configuration we have step parameters instead of config values. + # It happens because CreateConfiguration procedure is special. + # All other procedures, if they have a config, requesting config values and + # FlowPDF goes there and gets FlowPDF::Config object out of them. + # But CreateConfiguration is the procedure that actually creates the config. + # It means that config values are parameters for this procedure. + # This procedure will create config out of them. + # So, if we are in the situation when procedure is "magic" and step name is also "magic" + # we will set config values as parameters and parameters as config values. + if ($context->isCheckConnectionInCreateConfigurationContext()) { + # Creating new step parameters + my $newStepParameters = FlowPDF::StepParameters->new({}); + # This is **not** a clone. In perl we're assigning a reference, + # so configValues is the same variable as stepParameters. + # it is done to make it more readable. + my $configValues = $stepParameters; + # Blessing params to config values. + bless $configValues, 'FlowPDF::Config'; + $context->populateDefaultConfigValues($configValues); + $context->setCurrentStepConfigValues($configValues); + $context->setCurrentStepParameters($newStepParameters); + return $stepParameters; + } + $context->setCurrentStepParameters($stepParameters); + return $stepParameters; +} + + +=head2 getConfigValues() + +=head3 Description + +This method returns a L object that represents plugin configuration. This method does not require parameters. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (L) Plugin configuration for current run context + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $configValues = $context->getConfigValues(); + my $cred = $configValues->getParameter('credential'); + if ($cred) { + print "Secret value is: ", $cred->getSecretValue(), "\n"; + } + +%%%LANG%%% + +=cut + +sub getConfigValues { + my ($context, $optionalConfigName) = @_; + + if (my $retval = $context->getCurrentStepConfigValues()) { + return $retval; + } + + # This case is special. During CreateConfiguration we don't have config itself. + # In this special context config values are yet stored in step parameters. + # After checkConnection is successful these parameters are stored in configuration. + if ($context->isCheckConnectionInCreateConfigurationContext()) { + # This function call sets current step parameters and current step config values. + # After that we can return config values which are already set. + my $stepParameters = $context->getStepParameters(); + my $configValues = $context->getCurrentStepConfigValues(); + $context->populateDefaultConfigValues($configValues); + return $configValues; + } + my $stepParameters = $context->getStepParameters(); + my $po = $context->getPluginObject(); + logTrace("Plugin Object: ", Dumper $po); + my $configLocations = $po->getConfigLocations(); + my $configFields = $po->getConfigFields(); + + my $configField = undef; + for my $field (@$configFields) { + if ($stepParameters->isParameterExists($field)) { + $configField = $field; + last; + } + } + + if (!$configField && $context->getHasConfigField()) { + FlowPDF::Exception::EntityDoesNotExist->new( + "No config field detected in current step parameters" + )->throw(); + } + my $configHash = undef; + if ($context->getHasConfigField()) { + for my $location (@$configLocations) { + my $tempConfig = $context->retrieveConfigByNameAndLocation( + $stepParameters->getParameter($configField)->getValue(), + $location + ); + + if ($tempConfig) { + $configHash = $tempConfig; + last; + } + } + } + # TODO: Improve this error message. + if (!$configHash && $context->getHasConfigField()) { + FlowPDF::Exception::ConfigDoesNotExist->new({ + configName => $stepParameters->getParameter($configField)->getValue() + })->throw(); + } + my $keys = []; + my $configValuesHash = {}; + $context->populateDefaultConfigValues($configHash); + + # handling user defined default config values. + # my $defaultConfigValues = $po->getDefaultConfigValues(); + # $defaultConfigValues ||= {}; + + # for my $cv (keys %$defaultConfigValues) { + # if (defined $configHash->{$cv}) { + # logWarning("The config field '$cv' that was set to default value in plugin code is present in configuration. Default value from plugin code is ignored."); + # next; + # } + # if ($cv =~ m/_credential$/s) { + # if (!defined $defaultConfigValues->{$cv}->{userName} && !defined $defaultConfigValues->{$cv}->{password}) { + # logWarning("Missing userName and password for the default credential"); + # next; + # } + # } + + # $configHash->{$cv} = $defaultConfigValues->{$cv}; + # } + # end of handling default config values + + for my $k (keys %$configHash) { + push @$keys, $k; + + my $tempRow = $configHash->{$k}; + # TODO: Refactor this a bit, move my $value to this line + if (!ref $tempRow) { + my $value = FlowPDF::Parameter->new({ + name => $k, + value => $configHash->{$k} + }); + $configValuesHash->{$k} = $value; + } + else { + my $value = FlowPDF::Credential->new({ + credentialName => $k, + # TODO: Change it to something more reliable later. + credentialType => 'default', + userName => $configHash->{$k}->{userName}, + secretValue => $configHash->{$k}->{password}, + }); + $configValuesHash->{$k} = $value; + } + } + + my $retval = FlowPDF::Config->new({ + parametersList => $keys, + parameters => $configValuesHash + }); + + $context->setCurrentStepConfigValues($retval); + return $retval; +} + +sub retrieveConfigByNameAndLocation { + my ($self, $configName, $configLocation) = @_; + + my $po = $self->getPluginObject(); + my $plugin_project_name = sprintf( + '%s-%s', + $po->getPluginName(), + $po->getPluginVersion() + ); + # my $ec = $self->getEc(); + # Retrieving a places where plugin configs could be stored. They will be queued from first to last. + my $config_locations = $po->getConfigLocations(); + my $config_fields = $po->getConfigFields(); + my $config_property_sheet = sprintf("/projects/%s/%s/%s", $plugin_project_name, $configLocation, $configName); + fwLogDebug("Config property sheet: $config_property_sheet"); + my $property_sheet_id = eval { $self->getEc->getProperty($config_property_sheet)->findvalue('//propertySheetId')->string_value }; + if ($@) { + return undef; + } + + my $properties = $self->getEc->getProperties({propertySheetId => $property_sheet_id}); + my $retval = {}; + for my $node ( $properties->findnodes('//property')) { + my $value = $node->findvalue('value')->string_value; + my $name = $node->findvalue('propertyName')->string_value; + # if ($self->isCredential($node)) { + # my $credential = $self->getCredentialFromConfig($configName, $node); + # $retval->{$name}->{userName} = $credential->{userName}; + # $retval->{$name}->{password} = $credential->{password}; + # if ($credential->{password}) { + # FlowPDF::Log->setMaskPatterns($credential->{password}); + # } + # } + ## Deprecating this if branch + if ($name =~ m/_?credential$/s) { + fwLogTrace("Getting inside of credential section. Name: '$name', value: '$value'"); + # here we're doing a trick. We know, that credential in our config will be always named credential or + # %keyword%_credential. Resulting credential is being stored by plugins as %cofingName%_%credentialField%. + # So, for example, let's say that we have a config named config1, so, + # credential, as exception, will be stored as config1, proxy_credential field will be stored as config1_proxy_credential + # following logic implements this concept. + my $credentialName = $configName; + if ($name =~ m/(.*?_credential)$/m) { + $credentialName = $configName . '_' . $1; + } + + # adding support of external credentials. + if ($value =~ m|^\/|s) { + fwLogInfo("Value of credential field is starts from /. Using external credentials logic..."); + $credentialName = $value; + } + my $credentials = $self->getEc->getFullCredential($credentialName); + my $user_name = $credentials->findvalue('//userName')->string_value; + my $password = $credentials->findvalue('//password')->string_value; + $retval->{$name}->{userName} = $user_name; + $retval->{$name}->{password} = $password; + if ($password) { + FlowPDF::Log->setMaskPatterns($password); + } + } + + ## End of if branch deprecation + else { + if (!defined $value || $value eq '') { + next; + } + $retval->{$name} = $value; + } + + } + + fwLogDebug("Retval", Dumper $retval); + return $retval; +} + + +# TODO: add pod for getConfigValuesAsHashref method +# TODO: add getConfigValuesAsHashref to list of public APIs +# TODO: think about getConfigValues to be present in public APIs list. +sub getConfigValuesAsHashref { + my ($self) = @_; + + my $c = undef; + $c = $self->getConfigValues(); + my $cKeys; + my $retval = {}; + # eval { + # $c = $self->getConfigValues(); + # 1; + # } or do { + # if ($self->getHasConfigField()) { + # FlowPDF::Helpers::bailOut("Can't get config: $@"); + # } + # }; + + if ($c) { + $retval = $c->asHashref(); + } + return $retval; +} + + +=head2 newStepResult() + +=head3 Description + +This method returns an L object, which is being used to work with procedure or pipeline stage output. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (L) Object for manipulation with pipeline/procedure results. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $stepResult = $context->newStepResult(); + ...; + $stepResult->apply(); + +%%%LANG%%% + +=cut + +sub newStepResult { + my ($self) = @_; + + return FlowPDF::StepResult->new({ + context => $self, + actions => [], + cache => {} + }); +} + +# private function for now +sub buildRunContext { + my ($self) = @_; + + my $ec = $self->getEc(); + my $context = 'pipeline'; + my $flowRuntimeId = ''; + + eval { + $flowRuntimeId = $ec->getProperty('/myFlowRuntimeState/id')->findvalue('//value')->string_value; + }; + return $context if $flowRuntimeId; + + eval { + $flowRuntimeId = $ec->getProperty('/myFlowRuntime/id')->findvalue('/value')->string_value(); + }; + return $context if $flowRuntimeId; + + eval { + $flowRuntimeId = $ec->getProperty('/myPipelineStageRuntime/id')->findvalue('/value')->string_value(); + }; + return $context if $flowRuntimeId; + + $context = 'schedule'; + my $scheduleName = ''; + + eval { + $scheduleName = $self->getCurrentScheduleName(); + 1; + } or do { + logError("error occured: $@"); + }; + + if ($scheduleName) { + return $context; + } + $context = 'procedure'; + return $context; +} + +# private +sub getCurrentScheduleName { + my ($self, $jobId) = @_; + + $jobId ||= $ENV{COMMANDER_JOBID}; + + my $scheduleName = ''; + eval { + my $result = $self->getEc()->getJobDetails($jobId); + $scheduleName = $result->findvalue('//scheduleName')->string_value(); + if ($scheduleName) { + # $self->logger()->info('Schedule found: ', $scheduleName); + fwLogDebug("Schedule found: $scheduleName"); + }; + 1; + } or do { + # $self->logger()->error($@); + logError("Error: $@"); + }; + + return $scheduleName; +} + +# private +sub isParameterRequired { + my ($self, $param) = @_; + + if (!$param) { + FlowPDF::Helpers::bailOut("Parameter name is mandatory for isParameterRequired method"); + } + my $procedureName = $self->getProcedureName(); + my $projectName = $self->getPluginObject()->getPluginProjectName(); + my $ec = $self->getEc(); + + my $formalParameter = $ec->getFormalParameter({ + projectName => $projectName, + procedureName => $procedureName, + formalParameterName => $param + }); + + my $required = $formalParameter->findvalue('//required')->string_value(); + + return $required; +} +# private +sub readActualParameter { + my ($self, $param) = @_; + + my $ec = $self->getEc(); + my $retval; + my $xpath; + + + my @subs = (); + push @subs, sub { + my $jobId = $ec->getProperty('/myJob/id')->findvalue('//value')->string_value; + my $xpath = $ec->getActualParameter({ + jobId => $jobId, + actualParameterName => $param + }); + return $xpath; + }; + + push @subs, sub { + my $jobStepId = $ec->getProperty('/myJobStep/id')->findvalue('//value')->string_value; + my $xpath = $ec->getActualParameter({ + jobStepId => $jobStepId, + actualParameterName => $param, + }); + return $xpath; + }; + + push @subs, sub { + my $jobStepId = $ec->getProperty('/myJobStep/parent/id')->findvalue('//value')->string_value; + my $xpath = $ec->getActualParameter({ + jobStepId => $jobStepId, + actualParameterName => $param, + }); + return $xpath; + }; + + + push @subs, sub { + my $jobStepId = $ec->getProperty('/myJobStep/parent/parent/id')->findvalue('//value')->string_value; + my $xpath = $ec->getActualParameter({ + jobStepId => $jobStepId, + actualParameterName => $param, + }); + return $xpath; + }; + + + for my $sub (@subs) { + my $xpath = eval { $sub->() }; + if (!$@ && $xpath && $xpath->exists('//actualParameterName')) { + my $val = $xpath->findvalue('//value')->string_value; + if ($self->isParameterRequired($param)) { + if (!defined $val || $val eq '') { + my $procedureName = $self->getProcedureName(); + FlowPDF::Helpers::bailOut "Parameter '$param' of procedure '$procedureName' is marked as required, but it does not have a value. Aborting with fatal error."; + } + } + return $val; + } + + } + die qq{Failed to get actual parameter $param}; +} + + +# private +sub get_param { + my ($self, $param) = @_; + + my $retval; + eval { + $retval = $self->readActualParameter($param); + logInfo(qq{Got parameter "$param" with value "$retval"}); + 1; + } or do { + logError("Error '$@' was occured while getting property: $param"); + $retval = undef; + }; + return $retval; +} + + +# private +sub getCurrentStepParametersAsHashref { + my ($self) = @_; + + my $params = {}; + + my $procedure_name = $self->getEc()->getProperty('/myProcedure/name')->findvalue('//value')->string_value; + my $po = $self->getPluginObject(); + my $xpath = $self->getEc()->getFormalParameters({ + projectName => sprintf('%s-%s', $po->getPluginName(), $po->getPluginVersion()), + procedureName => $procedure_name + }); + + for my $param ($xpath->findnodes('//formalParameter')) { + my $name = $param->findvalue('formalParameterName')->string_value; + my $value = $self->get_param($name); + + my $name_in_list = $name; + if ($param->findvalue('type')->string_value() eq 'credential') { + + my $cred = undef; + # error handling for credentials: + # TODO: Implement universal way of working with credentials + try { + $cred = $self->readCredential({ + credentialName => $value, + parameterName => $name + }); + # $cred = $self->getEc()->getFullCredential($value); + # my $error_code = $cred->findvalue('//error/code')->string_value(); + # if ($error_code && $self->isParameterRequired($name)) { + # FlowPDF::Exception::RuntimeException->new("Can't get credential $name: $error_code")->throw(); + # } + } catch { + my ($e) = @_; + if ($self->isParameterRequired($name)) { + if (ref $e =~ m/^FlowPDF::Exception/s) { + $e->throw(); + } + else { + croak($e); + } + } + logDebug("Can't get optional credential $name: ", $e); + }; + + if (!$cred){ + next; + } + + my $username = $cred->{userName}; + my $password = $cred->{password}; + $params->{$name_in_list}->{userName} = $username; + $params->{$name_in_list}->{password} = $password; + + # setting mask pattern + if ($password) { + FlowPDF::Log->setMaskPatterns($password); + } + } + else { + $value = trim($value); + if (!defined $value || $value eq '') { + next; + } + $params->{$name_in_list} = $value; + } + } + logInfo "\n"; + return $params; +} + + +=head2 newRESTClient($creationParams) + +=head3 Description + +Creates an L object, applying components and other useful mechanisms to it during creation. + +For now, this method supports following components and tools: + +=over 4 + +=item L + +Proxy can be automatically be enabled. To do that you need to make sure that following parameters are present in your configuration: + +=over 8 + +=item credential with the proxy_credential name. + +=item regular parameter with httpProxyUrl name + +=back + +If your configuration has all fields above, proxy component will be applied silently, +and you can be sure, that all requests that you're doing through L methods already have proxy enabled. + +Also, note that if you have debugLevel parameter in your configuration, and it will be set to debug, +debug mode for FlowPDF::ComponentProxy will be enabled by default. + +=item Basic Authorization + +Basic authorization can be automatically applied to all your rest requests. To do that you need to make sure that following parameters are present in your plugin configuration: + +=over 8 + +=item authScheme parameter has value "basic" + +=item credential with the basic_credential name + +=back + +=back + +=head3 Parameters + +=over 4 + +=item (Optional) (HASHREF) FlowPDF::Client::REST Object creation params. + +=back + +=head3 Returns + +=over 4 + +=item L + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $rest = $context->newRestClient(); + my $req = $rest->newRequest(GET => 'https://electric-cloud.com'); + my $response = $rest->doRequest($req); + print $response->decoded_content(); + +%%%LANG%%% + +=cut + +sub newRESTClient { + my ($context, $params) = @_; + + my $creationParams = {}; + my $configValues = undef; + $configValues = $context->getConfigValues(); + # eval { + # $configValues = $context->getConfigValues(); + # 1; + # } or do { + # if ($context->getHasConfigField()) { + # FlowPDF::Helpers::bailOut("Can't get config: $@"); + # } + # }; + if ($configValues) { + # handling the proxy here + my $proxyUrl = $configValues->getParameter(HTTP_PROXY_URL_PROPERTY); + fwLogDebug("ProxyURL Parameter is " . Dumper $proxyUrl); + if ($proxyUrl) { + fwLogDebug("proxyUrl parameter has been found in configuration, using proxy ", $proxyUrl->getValue()); + # setting a proxy URL; + $creationParams->{proxy}->{debug} = FlowPDF::Log::getLogLevel(); + $creationParams->{proxy}->{url} = $proxyUrl->getValue(); + + if (my $proxyCredential = $configValues->getParameter(PROXY_CREDENTIAL_PROPERTY)) { + $creationParams->{proxy}->{username} = $proxyCredential->getUserName(); + $creationParams->{proxy}->{password} = $proxyCredential->getSecretValue(); + } + } + # handling basic auth here. + my $authScheme = $configValues->getParameter(AUTH_SCHEME_PROPERTY); + if ($authScheme) { + fwLogDebug("Hadling $authScheme authorization from config"); + if ($authScheme->getValue() eq AUTH_SCHEME_VALUE_FOR_BASIC_AUTH) { + fwLogDebug("Auth scheme 'basic' has been detected"); + my $basicCred = $configValues->getParameter(BASIC_AUTH_CREDENTIAL_PROPERTY); + if ($basicCred) { + my $user = $basicCred->getUserName(); + my $password = $basicCred->getSecretValue(); + $creationParams->{auth} = { + type => 'basic', + username => $user || '', + password => $password || '' + }; + fwLogDebug("Parameters for basic auth are: " . Dumper $creationParams->{auth}); + } + } + else { + fwLogDebug("Auth Scheme $authScheme is not implemented yet"); + } + } + } + fwLogDebug("REST client creation parameters are: ", Dumper $creationParams); + + if ($params->{oauth}) { + $creationParams->{auth} = $params->{oauth}; + $creationParams->{auth}->{type} = 'oauth'; + } + my $retval = FlowPDF::Client::REST->new($creationParams); + return $retval; +} + +# private +sub retrieveCurrentProjectName { + my ($self, $jobId) = @_; + + if (!$jobId) { + $jobId = $ENV{COMMANDER_JOBID}; + } + + my $projectName = ''; + eval { + my $result = $self->getEc()->getJobDetails($jobId); + $projectName = $result->findvalue('//job/projectName')->string_value(); + 1; + } or do { + FlowPDF::Helpers::bailOut "Can't retrieve project for job $jobId"; + }; + + return $projectName; +} + +# private +sub isCheckConnectionInCreateConfigurationContext { + my ($self) = @_; + + my $procedureName = $self->getProcedureName(); + my $stepName = $self->getStepName(); + if ($stepName eq 'checkConnection' && $procedureName eq 'CreateConfiguration') { + return 1; + } + return 0; +} + +# private +sub populateDefaultConfigValues { + my ($self, $hashref) = @_; + + my $defaultConfigValues = $self->getPluginObject()->getDefaultConfigValues(); + if (!$defaultConfigValues) { + $defaultConfigValues = {}; + } + + for my $cv (keys %$defaultConfigValues) { + if (defined $hashref->{$cv}) { + logWarning("The config field '$cv' that was set to default value in plugin code is present in configuration. Default value from plugin code is ignored."); + next; + } + if ($cv =~ m/_credential$/s) { + if (!defined $defaultConfigValues->{$cv}->{userName} && !defined $defaultConfigValues->{$cv}->{password}) { + logWarning("Missing userName and password for the default credential"); + next; + } + } + $hashref->{$cv} = $defaultConfigValues->{$cv}; + } + + return $self; +} + + +# private +sub getCredentialFromConfig { + # This function accepts the credential parameter as XPath node and returns the values for the cred. + my ($self, $configName, $parameterNode) = @_; + + # in this function we're doing a trick. We know, that credential in our config will be always named credential or + # %keyword%_credential. Resulting credential is being stored by plugins as %cofingName%_%credentialField%. + # So, for example, let's say that we have a config named config1, so, + # credential, as exception, will be stored as config1, proxy_credential field will be stored as config1_proxy_credential + # following logic implements this concept. + + # TODO: Implement better validation of parameterNode + unless (ref $parameterNode) { + FlowPDF::Exception::RuntimeException->new( + "Expected XML::XPath::node reference for getCredentialFromConfig" + )->throw(); + } + + my $value = $parameterNode->findvalue('value')->string_value(); + my $name = $parameterNode->findvalue('propertyName')->string_value(); + + my $whatToGet = $configName; + if ($value =~ m|^\/|s) { + $whatToGet = $value; + } + elsif ($name =~ m/(.*?_credential)$/m) { + $whatToGet = $configName . '_' . $1; + } + return $self->readCredential({credentialName => $whatToGet}); +} + +# private +sub readCredential { + my ($self, $opts) = @_; + + if (!ref $opts || ref $opts ne 'HASH') { + FlowPDF::Exception::RuntimeException->new("Opts are expected to be the hash reference.")->throw(); + } + my $credentialName = $opts->{credentialName} if exists $opts->{credentialName}; + my $parameterName = $opts->{parameterName} if exists $opts->{parameterName}; + + if (!defined $credentialName) { + FlowPDF::Exception::RuntimeException->new( + "credentialName doesn't exist in the function call parameters." + )->throw(); + } + my $credentialObject = $self->getEc()->getFullCredential($credentialName); + + my $errorCode = $credentialObject->findvalue('//error/code')->string_value(); + if ($errorCode && defined $parameterName && $self->isParameterRequired($parameterName)) { + my $whatToShow = $parameterName || $credentialName; + FlowPDF::Exception::RuntimeException->new("Can't get credential $whatToShow: $errorCode")->throw(); + } + my $userName = $credentialObject->findvalue('//userName')->string_value(); + my $password = $credentialObject->findvalue('//password')->string_value(); + + my $rv = { + userName => $userName, + password => $password + }; + + return $rv; +} + +# private +sub isCredential { + my ($self, $node) = @_; + + my $name = $node->findvalue('propertyName')->string_value; + + if ($name =~ m/_?credential$/s) { + return 1; + } + return 0; +} +1; diff --git a/src/main/resources/project/pdk/FlowPDF/ContextFactory.pm b/src/main/resources/project/pdk/FlowPDF/ContextFactory.pm new file mode 100644 index 00000000..7502e796 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/ContextFactory.pm @@ -0,0 +1,86 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::ContextFactory + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A context factory that generates the L object. + +=head1 METHODS + + +=cut + +package FlowPDF::ContextFactory; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + procedureName => FlowPDF::Types::Scalar(), + stepName => FlowPDF::Types::Scalar(), +}); + +use strict; +use warnings; +use Data::Dumper; +use FlowPDF::Context; +use ElectricCommander; + + +=over + +=item B + +Creates new context object. Accepts as parameters a hashref with the following fields: + +=over 4 + +=item B + +Name of procedure where we are. + +=item B + +Name of current step that is being executed. + +=item B + +An L object or an object that inherits FlowPDF. + +=item B + +An ElectricCommander object. + +This method should not be used directly without reason. ContextFactory has been designed to be used inside of L in a seamless way. + +=back + +=cut + +sub newContext { + my ($self, $ecpdf) = @_; + + my $procedureName = $self->getProcedureName(); + my $stepName = $self->getStepName(); + my $context = FlowPDF::Context->new({ + procedureName => $procedureName, + stepName => $stepName, + pluginObject => $ecpdf, + ec => ElectricCommander->new() + }); + return $context; +} + +=back + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Credential.pm b/src/main/resources/project/pdk/FlowPDF/Credential.pm new file mode 100644 index 00000000..117dce19 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Credential.pm @@ -0,0 +1,194 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Credential + +=head1 AUTHOR + +CloudBees + +=head1 External Credentials Support + +Starting from flowpdf-perl v1.3.4 external credentials in plugin configuration are supported. +From this version, flowpdf-perl can process these credentials internally without any changes in plugin code. +In plugin configuration, you can use as plugin credential the credential stored in a different project by choosing it in the new credential widget. + +External credentials are different from runtime credentials in the way of how they are referenced. +While the usual credential has a name like 'credential' or 'proxy_credential', the external credentials name is just its path. +For example: /YourProject/your_credental. +Before this version, it was not possible to use external credentials in CloudBees CD. + +=head1 DESCRIPTION + +This class provides methods to process a CloudBees CD credential object. + +Credentials should be named using one of the following patterns: + +=over 4 + +=item B + +This is default one that is being used as first credential. + +=item B<%name%_credential> + +In that case credential parameter should be named as %action%_credential. + +For example, for proxy username and proxy password B parameter should be used. + +=back + +FlowPDF has support of both patterns. + +=head1 SYNOPSIS + +%%%LANG=perl%%% + + # retrieving parameter of current plugin configuration. + # in this case credentals is a parameter named credential. + my $cred = $cofigValues->getParameter('credential'); + # getting type of credential. It is default, private_key, etc, + my $credentialType = $cred->getCredentialType(); + my $userName = $cred->getUserName(); + my $password = $cred->getSecretValue(); + my $credentialName = $cred->getCredentialName(); + +%%%LANG%%% + +=head1 METHODS + +=head2 getCredentialType() + +=head3 Description + +Returns different values for different credentials type. For FlowPDF SDK Drop1 only 'default' is supported. + +It does not mean, that you can't access credentials of any type with that API. + +It means, that currently all credentials are being processed as default ones: username and password, but these fields are optional. + +=head3 Parameters: + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Credential Type + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $credType = $cred->getCredentialType(); + +%%%LANG%%% + +=head2 getUserName() + +=head3 Description + +Returns a user name that is being stored in the current credential. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Username for current credential object. + +=back + +=head3 Usage + +%%%LANG=perl%%% + my $userName = $cred->getUserName(); +%%%LANG%%% + +=head2 getSecretValue() + +=head3 Description + +Returns a secret value that is being stored in the current credential. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Secret value from the current credential object + +=back + +=head2 getCredentialName() + +=head3 Description + +Returns a name for the current credential. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) A name from the current credential. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $credName = $cred->getCredentialName(); + +%%%LANG%%% + +=cut + +package FlowPDF::Credential; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + credentialName => FlowPDF::Types::Scalar(), + credentialType => FlowPDF::Types::Scalar(), + userName => FlowPDF::Types::Scalar(), + secretValue => FlowPDF::Types::Scalar(), +}); + +use strict; +use warnings; + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Devel/Stacktrace.pm b/src/main/resources/project/pdk/FlowPDF/Devel/Stacktrace.pm new file mode 100644 index 00000000..5330a448 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Devel/Stacktrace.pm @@ -0,0 +1,222 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Devel::Stacktrace; +use strict; +use warnings; +use Data::Dumper; + +my $TEMPLATES = { + 'package' => 0, + 'filename' => 1, + 'line' => 2, + 'subroutine' => 3, + 'hasargs' => 4 +}; +# ($frame->[0]) > $frame->[1]:L$frame->[2]:$frame->[3] +our $STACKTRACE_FRAME_TEMPLATE = '({{package}}) :: {{filename}}:L{{line}}:{{subroutine}}'; +sub new { + my ($class) = @_; + + my $st = []; + my $i = 0; + + while (1) { + my @caller = caller($i); + last unless @caller; + unshift @$st, \@caller; + if ($i >= 100) { + last; + } + $i++ + } + + # removing last stack element if it is this function. + my $function = __PACKAGE__ . '::new'; + if ($st->[-1]->[3] eq $function) { + pop @$st; + } + bless $st, $class; + return $st; +} + + +sub clone { + my ($self) = @_; + + my @t = @$self; + + my $rv = \@t; + bless $rv, ref $self; + return $rv; +} + +sub toString { + my ($self) = @_; + + my $rv = ''; + my $shift = 0; + for my $frame (@$self) { + my $t = $self->interpolateTemplate($STACKTRACE_FRAME_TEMPLATE, $frame); + $rv .= ' ' x $shift . "at $t\n"; + $shift++; + } + + $rv = $rv if ($rv); + $rv =~ s/^\s+//gs; + return $rv; +} + + +sub interpolateTemplate { + my ($self, $line, $frame) = @_; + + for my $k (keys %$TEMPLATES) { + $line =~ s/\{\{$k\}\}/$frame->[$TEMPLATES->{$k}]/gs; + } + + return $line; +} + +1; + +=head1 NAME + +FlowPDF::Devel::Stacktrace + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This module provides a stack trace functionality for FlowPDF. + +It creates a stack trace which could be stored as object and then used in a various situations. + +=head1 METHODS + +=head2 new + +=head2 Description + +Creates new FlowPDF::Devel::Stacktrace object and stores stacktrace on the time of creation. +It means, that this object should be created right before it should be used if goal is to get current stacktrace. +Just note, that this call stores stacktrace on the moment of creation. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::Devel::Stacktrace) A stack trace on the moment of invocation. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $st = FlowPDF::Devel::Stacktrace->new(); + +%%%LANG%%% + + +=head2 toString + +=head2 Description + +Converts a FlowPDF::Devel::StackTrace object into printable string. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) A printable stack trace. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $st = FlowPDF::Devel::Stacktrace->new(); + print $st->toString(); + +%%%LANG%%% + + +=head2 clone + +=head2 Description + +This function clones an existing FlowPDF::Devel::Stacktrace and returns new FlowPDF::Devel::Stacktrace reference that points to different FlowPDF::Devel::Stacktrace object. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::Devel::Stacktrace) A clone of caller object. + +=back + +=cut + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $st = FlowPDF::Devel::Stacktrace->new(); + my $st2 = $st->clone(); + +%%%LANG%%% + +=cut diff --git a/src/main/resources/project/pdk/FlowPDF/EF/OutputParameters.pm b/src/main/resources/project/pdk/FlowPDF/EF/OutputParameters.pm new file mode 100644 index 00000000..99e3dfc2 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/EF/OutputParameters.pm @@ -0,0 +1,59 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::EF::OutputParameters; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; +__PACKAGE__->defineClass({ + ec => FlowPDF::Types::Reference('ElectricCommander') +}); + +use strict; +use warnings; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use JSON; +use ElectricCommander; +use Data::Dumper; + + +sub setOutputParameter { + my ($self, $name, $value, $attach_params) = @_; + + if (!defined $value){ + fwLogDebug("Will not save undefined value for outputParameter '$name'"); + return; + }; + + # Will fall if parameter does not exists + eval { + if ($value && (ref $value eq 'HASH' || ref $value eq 'ARRAY')) { + require JSON unless $JSON::VERSION; + $value = JSON::encode_json($value); + } + + my $is_set = $self->getEc->setOutputParameter($name, $value, $attach_params); + + # 0E0 can be returned by EC::Bootstrap function and means parameter was not really set + if ($is_set && $is_set ne 0E0) { + fwLogDebug("Output parameter '$name' has been set to '$value'" . (defined $attach_params ? " and attached to " . Dumper($attach_params) : '')); + } + elsif (!$is_set) { + logWarning("Cannot set output parameter '$name' to '$value'" . (defined $attach_params ? " with the following attached params: " . Dumper($attach_params) : '')); + } + elsif ($is_set == '0E0') { + logWarning("Cannot set output parameter '$name'. This agent version don't supports this API"); + } + + 1; + } or do { + fwLogDebug("Output parameter '$name' can't be saved : $@"); + return 0; + }; + + return 1; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/EF/PostP.pm b/src/main/resources/project/pdk/FlowPDF/EF/PostP.pm new file mode 100644 index 00000000..1f75e9c0 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/EF/PostP.pm @@ -0,0 +1,190 @@ +# this module provides custom postp logic. +package FlowPDF::EF::PostP; +use strict; +use warnings; +use XML::Simple; +use ElectricCommander; +use Data::Dumper; + +our $PATTERNS = [ + { + start => qr/^\[(INFO|ERROR|WARNING|TRACE)\]/, + cut => qr/^\[(INFO|ERROR|WARNING|TRACE)\]\s*/, + end => qr/^\s*$/, + }, + { + start => qr/^\[POSTP\]\[(INFO|ERROR|WARNING|DEBUG|TRACE)\]:/, + cut => qr/^\[POSTP\]\[(INFO|ERROR|WARNING|TRACE)\]:\s+/, + end => qr/\s+:\[(INFO|ERROR|WARNING|TRACE)\]\[POSTP\]$/, + } +]; +# Postp module should have run method, which will be invoked. +sub run { + my ($class, $argv) = @_; + + my $file_name = get_file_name(); + my $ec = ElectricCommander->new(); + $ec->setProperty("diagFile", $file_name); + + my $current_line = 1; + my $starting_line = 0; + my $counter = 0; + my $d = DiagReport->new(); + + my $buf = ''; + my $matcher = ''; + my $state = 'seek'; + my $terminator = undef; + my $cutter = undef; + while (<>) { + my $line = $_; + + # we're looking for our patterns. + # Once pattern is found, SM is swithching to accumulate mode. + if ($state eq 'seek') { + ($terminator, $cutter, $matcher) = try_to_switch_mode($line); + if ($terminator && $cutter) { + # print "Switching to accumulate\n"; + $starting_line = $current_line; + $state = 'accumulate'; + $line =~ s/$cutter//s; + $buf = ''; + # $counter++; + } + } + # Here we're accumulating logs until terminator. + # If terminator sequence is detected, switching to flush mode. + if ($state eq 'accumulate') { + if ($line =~ m/$terminator/s) { + $line =~ s/$terminator//s; + + if ($line) { + $buf .= $line; + } + $state = 'flush'; + } + else { + $buf .= $line; + } + $counter++; + } + # This mode appends event and switches to seek. + if ($state eq 'flush') { + $d->add_row({ + type => $matcher, + matcher => $matcher, + firstLine => $starting_line, + numLines => $counter, + message => $buf, + }); + + open (my $fh, '>', $file_name); + print $fh $d->render(); + close $fh; + $counter = 0; + $state = 'seek'; + } + $current_line++; + } + open (my $fh, '>', $file_name); + print $fh $d->render(); + close $fh; +} + + +sub try_to_switch_mode { + my ($line) = @_; + + my $terminator = undef; + my $cutter = undef; + my $matcher = undef; + for my $pat (@$PATTERNS) { + if ($line =~ m/$pat->{start}/s) { + if ($1) { + $matcher = lc($1); + } + $terminator = $pat->{end}; + $cutter = $pat->{cut}; + last; + } + } + return ($terminator, $cutter, $matcher); +} + + +sub get_file_name { + my $step_id = $ENV{COMMANDER_JOBSTEPID}; + return 'diag-' . $step_id . '.xml'; +} + + +package DiagReport; +use strict; +use warnings; +use XML::Simple; +use Carp; + +sub new { + my ($class) = @_; + + my $self = { + _data => { + diagnostics => { + diagnostic => [] + } + } + }; + bless $self, $class; + return $self; +} + +sub add_row { + my ($self, $opts) = @_; + + my $diag_row = { + type => '', + matcher => '', + name => '', + firstLine => '', + numLines => '', + message => '' + }; + + for my $attr (qw/type message firstLine/) { + if (!exists $opts->{$attr}) { + croak "$attr attribute is mandatory for postp\n"; + } + } + $diag_row->{type} = $opts->{type}; + $diag_row->{message} = $opts->{message}; + $diag_row->{firstLine} = $opts->{firstLine}; + + $diag_row->{numLines} = $opts->{numLines}; + $diag_row->{matcher} = $opts->{matcher}; + if (!$opts->{matcher}) { + $diag_row->{matcher} = $diag_row->{type}; + } + + if (!$opts->{numLines}) { + $diag_row->{numLines} = 1; + } + if ($opts->{name}) { + $diag_row->{name} = $opts->{name} + } + else { + delete $diag_row->{name}; + } + push @{$self->{_data}->{diagnostics}->{diagnostic}}, $diag_row; + return $self; +} + +sub render { + my ($self) = @_; + + my $header = qq|\n|; + + my $xml = $header . XMLout($self->{_data}, KeepRoot => 1, NoAttr => 1, SuppressEmpty => 1); + return $xml; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception.pm b/src/main/resources/project/pdk/FlowPDF/Exception.pm new file mode 100644 index 00000000..7dfe083e --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception.pm @@ -0,0 +1,214 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Exception; + +use base qw/FlowPDF::Throwable/; +use strict; +use warnings; +use Data::Dumper; + +sub new { + my ($class, @params) = @_; + + my $creationParams = {}; + # getting exception code for an exception definition. + # if getCode function is available, it will be called. + if ($class->can('exceptionCode')) { + $creationParams->{code} = $class->exceptionCode() + } + # now let's try to get a template. + # the exception class could have either template or render. + # if it has a template, it will be used just as sprintf with parameters. + + # we can render + if ($class->can('render')) { + $creationParams->{message} = $class->render(@params); + } + # using template + elsif ($class->can('template')) { + my $template = $class->template(); + $creationParams->{message} = sprintf($template, @params); + } + # joining as message + else { + $creationParams->{message} = join '', @params; + } + + my $self = $class->SUPER::new($creationParams); + return $self; +} + +=head1 NAME + +FlowPDF::Exception + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +A superclass for exceptions in FlowPDF. All out-of-the box exeptions that are provided by FlowPDF are subclasses of this one. + +For more details about exceptions and how to use them follow Plugin Developer's Guide. + +FlowPDF provides, out of the box, following exceptions: + +=head2 List of available out of the box exceptions. + +=over + +=item L + +An exception that could be used when something returned an unexpected undef or empty string. + +=item L + +An exception, that could be used when class does not have required function defined. + +=item L + +An exception, that could be used when function expecting required parameter, and this parameter is missing. + +=item L + +An exception, that could be used when function received an argument, but it has different type. + +=item L + +An exception, that could be used when function received an argument, but its value is wrong. + +=item L + +An exception, that could be used when something does not exist, but it should. Like key in hash. + +=item L + +An exception, that could be used when something exists, but it should not, like user with the same email. + +=item L + +A generic runtime exception. + +=back + +=head2 Few words about exceptions handling in FlowPDF + +We strongly recommend to use Try::Tiny for exceptions handling because eval {} approach has a lot of flaws. + +One of them is that exception, that was raised during eval {} is automatically being assigned to global variable $@. +There are too many things that could go wrong. Try::Tiny is available in ec-perl. + +For example: + +%%%LANG=perl%%% + +try { + ...; +} catch { + ...; +} finally { + ...; +} + +%%%LANG%%% + +=head1 USING OUT-OF-THE-BOX EXCEPTIONS + +To use any of out of the box exceptions you need to import them as regular perl module, +then create an exception object (see documentation for an exception that you want create), +then throw and then catch. For example, we will be using L as example. + +%%%LANG=perl%%% + +use strict; +use warnings; +use Try::Tiny; +# 1. Import. +use FlowPDF::Exception::UnexpectedEmptyValue; +use FlowPDF::Log; + +try { + dangerous(''); +} catch { + my ($e) = @_; + # 3. Validate. + if ($e->is('FlowPDF::Exception::UnexpectedEmptyValue')) { + # 4. Handle. + logInfo("Unexpected empty value caught: $e"); + } +}; + +sub dangerous { + my ($arg) = @_; + + unless ($arg) { + # 2. Create and throw. + FlowPDF::Exception::UnexpectedEmptyValue->new({ + where => '1st argument', + expected => 'non-empty value' + })->throw(); + } +} + +%%%LANG%%% + +=head1 CREATING YOUR OWN EXCEPTIONS + +To create your own exceptions for a plugin, you need to do the following things: + +=over + +=item Inherit FlowPDF::Exception + +=item Define exceptionCode method + +This method should return a line, that will be used as code for your exception. It could be: + +%%%LANG=perl%%% + +sub exceptionCode { + return 'CUST001'; +} + +%%%LANG%%% + +=item Define render or template methods. + +You need to define only one of them. +Template method should return sprintf template, which will be used during exception object creation. +This template will be interpolated using parameters from new() method. This is simple way. + +Render method accepts all parameters, that were provided to new() method, but you have to return ready-to-use message. +This method is more advanced way of exceptions creation and provides full control. + +=back + +Simple exception using render could be implemented like that: + +%%%LANG=perl%%% + +package FlowPDF::Exception::WithRender; +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'WTHRNDR01'; +} + +sub render { + my ($class, @params) = @_; + my $message = "Following keys are wrong: " . join(', ', @params); + return $message; +} + +1; + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/ConfigDoesNotExist.pm b/src/main/resources/project/pdk/FlowPDF/Exception/ConfigDoesNotExist.pm new file mode 100644 index 00000000..6294e87f --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/ConfigDoesNotExist.pm @@ -0,0 +1,80 @@ +package FlowPDF::Exception::ConfigDoesNotExist; + +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0009CNE'; +} + +sub render { + my ($self, $params) = @_; + + my $message = q|Can't get config.|; + + if (!ref $params) { + $params ||= $message; + return $params; + } + + if ($params->{configName}) { + $message = qq|Configuration '$params->{configName}' does not exist.|; + } + + return $message; +} + + +=head1 NAME + +FlowPDF::Exception::ConfigDoesNotExist + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when configuration does not exist. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item configName + +A name of the config that does not exist + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::ConfigDoesNotExist->new({ + configName => 'DoesNotExist' +})->throw(); + +%%%LANG%%% + +=cut + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/EntityAlreadyExists.pm b/src/main/resources/project/pdk/FlowPDF/Exception/EntityAlreadyExists.pm new file mode 100644 index 00000000..31b8f137 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/EntityAlreadyExists.pm @@ -0,0 +1,102 @@ +package FlowPDF::Exception::EntityAlreadyExists; + +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0007EAE'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Entity already exists.'; + if (!ref $params) { + $params ||= $message; + return $params; + } + + my $tempMessage = ''; + if ($params->{entity}) { + $tempMessage = "Entity '$params->{entity}' already exists"; + } + else { + $tempMessage = $message; + $tempMessage =~ s/\.+$//; + } + if ($params->{in}) { + $tempMessage .= " in '$params->{in}'"; + } + if ($params->{function}) { + $tempMessage .= " in function $params->{function}"; + } + + $tempMessage .= '.'; + + $message = $tempMessage; + + return $message; +} + +=head1 NAME + +FlowPDF::Exception::EntityAlreadyExists + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when something already exists, but it should not. Like user with the same email in the database. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item entity + +An entity, that already exists. + +=item in + +A place, where entity already exists. + +=item function + +A name of the function in context of which entity already exists. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::EntityAlreadyExists->new({ + entity => 'key email', + in => 'users array', + function => 'newUser' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/EntityDoesNotExist.pm b/src/main/resources/project/pdk/FlowPDF/Exception/EntityDoesNotExist.pm new file mode 100644 index 00000000..6fff8b13 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/EntityDoesNotExist.pm @@ -0,0 +1,103 @@ +package FlowPDF::Exception::EntityDoesNotExist; + +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0006EDE'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Entity does not exist.'; + if (!ref $params) { + $params ||= $message; + return $params; + } + + my $tempMessage = ''; + if ($params->{entity}) { + $tempMessage = "Entity '$params->{entity}' does not exist"; + } + else { + $tempMessage = $message; + $tempMessage =~ s/\.+$//; + } + if ($params->{in}) { + $tempMessage .= " in '$params->{in}'"; + } + if ($params->{function}) { + $tempMessage .= " in function '$params->{function}'"; + } + + $tempMessage .= '.'; + # Entitiy X does not exist at Y in funcion Z + + $message = $tempMessage; + + return $message; +} + +=head1 NAME + +FlowPDF::Exception::EntityDoesNotExist + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when something does not exist, but it should. Like required parameter in a hashref. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item entity + +An entity, that does not exist. + +=item in + +A place, where entity does not exist. + +=item function + +A name of the function in context of which entity does not exist. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::EntityDoesNotExist->new({ + entity => 'key email', + in => 'users array', + function => 'newUser' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionArgument.pm b/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionArgument.pm new file mode 100644 index 00000000..2581372c --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionArgument.pm @@ -0,0 +1,90 @@ +package FlowPDF::Exception::MissingFunctionArgument; +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0002MFA'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Missing function argument.'; + if (!ref $params) { + $params ||= $message; + return $params; + } + + + if (ref $params eq 'HASH') { + # if (defined $argumentName && defined $functionName) { + if ($params->{argument} && $params->{function} ) { + $message = sprintf("Missing '%s' argument for a function '%s'.", $params->{argument}, $params->{function}); + } + elsif ($params->{argument}) { + $message = sprintf("Missing '%s' argument.", $params->{argument}); + } + else { + $message = 'Missing function argument.'; + } + } + return $message; +} + +=head1 NAME + +FlowPDF::Exception::MissingFunctionArgument + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when function didn't receive a mandatory parameter. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item argument + +An argument, that is missing. + +=item function + +A name of the function, that didn't receive a mandatory argument. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'user name', + function => 'greetUser' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionDefinition.pm b/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionDefinition.pm new file mode 100644 index 00000000..33bb7944 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/MissingFunctionDefinition.pm @@ -0,0 +1,87 @@ +package FlowPDF::Exception::MissingFunctionDefinition; +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0005MFD'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Missing function definition.'; + if (!ref $params) { + $params ||= $message; + return $params; + } + if (ref $params ne 'HASH') { + return $message; + } + + if (defined $params->{class} && defined $params->{function}) { + $message = sprintf("Missing function definition. Class '%s' does not define function '%s'.", $params->{class}, $params->{function}); + } + elsif (defined $params->{function}) { + $message = sprintf("Missing function definition. Function %s is not defined.", $params->{function}); + } + + return $message; +} + +=head1 NAME + +FlowPDF::Exception::MissingFunctionDefinition + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when some class does not have some function defined, but should (wrong implementation). + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item class + +A class where function is missing. + +=item function + +A name of the function, that is not implemented (missing). + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::MissingFunctionDefinition->new({ + class => 'MyClass', + function => 'mySub' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/RuntimeException.pm b/src/main/resources/project/pdk/FlowPDF/Exception/RuntimeException.pm new file mode 100644 index 00000000..0f917598 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/RuntimeException.pm @@ -0,0 +1,54 @@ +package FlowPDF::Exception::RuntimeException; +use strict; +use warnings; +use base qw/FlowPDF::Exception/; + +sub exceptionCode { + return 'CBF0008RTE'; +} + +sub render { + my ($self, @messages) = @_; + + return 'Runtime exception.' unless @messages; + return join '', @messages; +} + +=head1 NAME + +FlowPDF::Exception::RuntimeException + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a generic runtime exception. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + + +=back + +%%%LANG%%% + +FlowPDF::Exception::RuntimeException->new("Error evaluating code.")->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedEmptyValue.pm b/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedEmptyValue.pm new file mode 100644 index 00000000..29bcf550 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedEmptyValue.pm @@ -0,0 +1,96 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Exception::UnexpectedEmptyValue; + +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0001UEV'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Got an unexpected empty value.'; + if (ref $params ne 'HASH') { + $params ||= $message; + return $params; + } + + if (defined $params->{where} && defined $params->{expected}) { + $message = sprintf( + "Value of '%s' could not be empty. '%s' is expected.", + $params->{where}, + $params->{expected}); + } + elsif (defined $params->{where}) { + $message = sprintf("Value of '%s' could not be empty.", $params->{where}); + } + else { + $message = 'Got unexpected empty value.'; + } + + return $message; +} + +=head1 NAME + +FlowPDF::Exception::UnexpectedEmptyValue + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when unexpected empty value has appeared. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item where + +A description where it happened. + +=item expected + +An expected value. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::UnexpectedEmptyValue->new({ + where => 'function result', + expected => 'non-empty value' +})->throw(); + +%%%LANG%%% + +=cut + +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedMissingValue.pm b/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedMissingValue.pm new file mode 100644 index 00000000..74247f80 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/UnexpectedMissingValue.pm @@ -0,0 +1,93 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Exception::UnexpectedMissingValue; + +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0008UMV'; +} + +sub render { + my ($self, $params) = @_; + + my $message = 'Got an unexpected missing value.'; + + if (ref $params ne 'HASH') { + $params ||= $message; + return $params; + } + elsif (defined $params->{where} && defined $params->{expected}) { + $message = sprintf( + "Value of '%s' could not be missing. '%s' is expected.", + $params->{where}, + $params->{expected}); + } + elsif (defined $params->{where}) { + $message = sprintf("Value of '%s' could not be missing.", $params->{where}); + } + + return $message; +} + +=head1 NAME + +FlowPDF::Exception::UnexpectedMissingValue + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when a required or mandatory value is missing. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item where + +A description where it happened. + +=item expected + +An expected value. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::UnexpectedMissingValue->new({ + where => 'function result', + expected => 'non-empty value' +})->throw(); + +%%%LANG%%% + +=cut + +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentType.pm b/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentType.pm new file mode 100644 index 00000000..e543e2a5 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentType.pm @@ -0,0 +1,114 @@ +package FlowPDF::Exception::WrongFunctionArgumentType; +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0003WAT'; +} + +# TODO: make render function working with different format. +sub render { + my ($self, $params) = @_; + + my $message = 'Got an argument of a wrong type.'; + # return exception as is + if (!ref $params) { + $params ||= $message; + return $params; + } + + if (ref $params ne 'HASH') { + return $message; + } + + if (defined $params->{argument}) { + $message = "Wrong type for argument '$params->{argument}'"; + } + else { + $message = 'Got an argument of a wrong type'; + } + + if (defined $params->{function}) { + $message .= " of a function '$params->{function}'"; + } + + if (defined $params->{got}) { + $message .= ", got: '$params->{got}'"; + } + + if (defined $params->{expected}) { + $message .= ", expected: '$params->{expected}'"; + } + + $message .= '.'; + return $message; +} + + +=head1 NAME + +FlowPDF::Exception::WrongFunctionArgumentType + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when function received an argument of a type, that is not suitable. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item argument + +An argument, that has a wrong type. + +=item function + +A name of the function, that received an argument of a wrong type. + +=item got + +A type of argument that were gotten. + +=item expected + +An expected type of an argument. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'user name', + function => 'greetUser', + got => 'HASH', + expected => 'scalar' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentValue.pm b/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentValue.pm new file mode 100644 index 00000000..5e86088a --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Exception/WrongFunctionArgumentValue.pm @@ -0,0 +1,112 @@ +package FlowPDF::Exception::WrongFunctionArgumentValue; +use base qw/FlowPDF::Exception/; +use strict; +use warnings; + +sub exceptionCode { + return 'CBF0004WAV'; +} + + +sub render { + my ($self, $params) = @_; + + my $message = 'Got a wrong value for an argument.'; + if (!ref $params) { + $params ||= $message; + return $params; + } + + if (ref $params ne 'HASH') { + return $message; + } + + if (defined $params->{argument}) { + $message = "Got a wrong value of an argument '$params->{argument}'"; + } + else { + $message = 'Got a wrong value for an argument'; + } + + if (defined $params->{function}) { + $message .= " of a function '$params->{function}'"; + } + + if (defined $params->{got}) { + $message .= ", got: '$params->{got}'"; + } + + if (defined $params->{expected}) { + $message .= ", expected: '$params->{expected}'"; + } + + $message .= '.'; + return $message; +} + +=head1 NAME + +FlowPDF::Exception::WrongFunctionArgumentValue + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +An exception that represents a situation when function received an argument that has a wrong value. + +=head1 USAGE + +This exception could be created using new() method in one of the following ways: + +=over + +=item No parameters + +Exception with default message will be created. + +=item Custom scalar parameter + +Exception with custom message will be created. + +=item hashref with the following fields as parameter: + +B you may not use all of these arguments at once. It is allowed to omit some of them. + +=over 4 + +=item argument + +An argument, that has a wrong value. + +=item function + +A name of the function, that received an argument with a wrong value. + +=item got + +A value of argument that were gotten. + +=item expected + +An expected value of an argument. + +=back + +=back + +%%%LANG%%% + +FlowPDF::Exception::WrongFunctionArgumentValue()->new({ + argument => 'user name', + function => 'greetUser', + got => 'HASH', + expected => 'scalar' +})->throw(); + +%%%LANG%%% + +=cut + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Helpers.pm b/src/main/resources/project/pdk/FlowPDF/Helpers.pm new file mode 100644 index 00000000..6ae8a8cd --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Helpers.pm @@ -0,0 +1,272 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Helpers + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This module provides various static helper functions. + +To use them one should explicitly import them. + +=head1 METHODS + + +=head2 trim + +=head3 Description + +=head3 Parameters + +=head3 Usage + +%%%LANG=perl%%% + + $str = trim(' hello world '); + +%%%LANG%%% + + + +=head2 isWin + +=head3 Description + +Returns true if we're running on windows system. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (Integer) 1 if FlowPDF is running on windows, 0 otherwise. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + if (isWin()) { + print "This feature is not supported under windows.\n"; + } + +%%%LANG%%% + + + +=head2 genRandomNumbers + +=head3 Description + +Generates random numbers using an integer as base. If nothing is passed, 99 will be used as base. + +=head3 Parameters + +=over 4 + +=item (Optional)(Integer) - an integer value to be used for random number generation. Can be any integer. + +=back + +=head3 Returns + +=over 4 + +=item (Integer) A random integer value. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + + + +=head2 bailOut + +=head3 Description + +Immediately aborts current execution and exits with exit code 1. + +This exception can't be handled or catched. + +=head3 Parameters + +=over 4 + +=item (Required)(String) An error message to be shown before exiting. + +=back + +=head3 Returns and Exceptions + +=over 4 + +=item None (this call is fatal). + +=back + +=head3 Usage + +%%%LANG=perl%%% + + bailOut("Something is very wrong"); + +%%%LANG%%% + + + +=head2 inArray + +=head3 Description + +Returns 1 if element is present in array. Currently it works only with scalar elements. + +=head3 Parameters + +=over 4 + +=item (Required)(Scalar) Element to check it's presence in array. + +=item (Required)(Array of scalars) An array of elements where element presence should be checked. + +=back + +=head3 Returns + +=over 4 + +=item (Scalar) 1 if element is found in array and 0 if not. + +=back + +=head3 Exceptions + +=over 4 + +=item Missing parameters exception. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $elem = 'two'; + my @array = ('one', 'two', 'three'); + if (inArray($elem, @array)) { + print "$elem is present in array\n"; + } + +%%%LANG%%% + +=cut + +package FlowPDF::Helpers; +use base qw/Exporter/; + +use strict; +use warnings; +use Carp; +use FlowPDF::Exception::MissingFunctionArgument; + +our @EXPORT_OK = qw/ + trim + isWin + genRandomNumbers + bailOut + inArray +/; + + +sub trim { + my (@params) = @_; + + @params = map { + s/^\s+//gs; + s/\s+$//gs; + $_; + } @params; + + return wantarray() ? @params : join '', @params; +} + + +sub isWin { + if ($^O eq 'MSWin32') { + return 1; + } + return 0; +} + + +sub genRandomNumbers { + my ($mod) = @_; + + if (!$mod) { + $mod = 99; + } + my $rand = rand($mod); + $rand =~ s/\.//s; + return $rand; +} + + +sub bailOut { + my (@messages) = @_; + + my $message = join '', @messages; + if ($message !~ m/\n$/) { + $message .= "\n"; + } + $message = "[BAILED OUT]: $message"; + print $message; + exit 1; +} + + +sub inArray { + my ($elem, @array) = @_; + + if (!defined $elem) { + # missing 1st parameter, throwing an exception. + FlowPDF::Exception::MissingFunctionArgument->new('1st parameter', 'inArray')->throw(); + # TODO: cleanup here later. + # croak "This function takes as parameter an element to search and non-empty array."; + } + for my $e (@array) { + return 1 if $elem eq $e; + } + + return 0; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Log.pm b/src/main/resources/project/pdk/FlowPDF/Log.pm new file mode 100644 index 00000000..c0a9128f --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Log.pm @@ -0,0 +1,629 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Log + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class provides logging functionality for FlowPDF. + +=head1 CAVEATS + +This package is being loaded at the beginning of FlowPDF execution behind the scene. + +It is required to set up logging before other components are initialized. + +Logger is retrieving through run context current debug level from configuration. + +To enable this mechanics you need to add B property to your configuration. + +It will be automatically read and logger would already have this debug level. + +Supported debug levels: + +=over 4 + +=item B + +Provides standard output. This is default level. + +debugLevel property should be set to 0. + +=item B + +Provides the same output from INFO level + debug output. + +debugLevel property should be set to 1. + +=item B + +Provides the same output from DEBUG level + TRACE output. + +debugLevel property should be set to 2. + +=back + +=head1 SYNOPSIS + +To import FlowPDF::Log: + +%%%LANG=perl%%% + + use FlowPDF::Log + +%%%LANG%%% + +=head1 METHODS + +This package imports following functions on load into current scope: + + +=head2 logInfo(@messages) + +=head3 Description + +Logs an info message. Output is the same as from print function. + +=head3 Parameters + +=over 4 + +=item (List of String) Log messages + +=back + +=head3 Returns + +=over + +=item (Boolean) 1 + +=back + +=head3 Usage + +%%%LANG=perl%%% + + logInfo("This is an info message"); + +%%%LANG%%% + +=head2 logDebug(@messages) + +=head3 Description + +Logs a debug message. + +=head3 Parameters + +=over 4 + +=item (List of String) Log messages + +=back + +=head3 Returns + +=over + +=item (Boolean) 1 + +=back + +=head3 Usage + +%%%LANG=perl%%% + + # this will print [DEBUG] This is a debug message. + # but only if debug level is enough (DEBUG or more). + logDebug("This is a debug message"); + +%%%LANG%%% + +=head2 logTrace(@messages) + +=head3 Description + +Logs a trace message + +=head3 Parameters + +=over 4 + +=item (List of String) Log messages + +=back + +=head3 Returns + +=over + +=item (Boolean) 1 + +=back + +=head3 Usage + +%%%LANG=perl%%% + + # this will print [TRACE] This is a trace message. + # but only if debug level is enough (TRACE or more). + logTrace("This is a debug message"); + +%%%LANG%%% + +=head2 logWarning(@messages) + +=head3 Description + +Logs a warning message. + +=head3 Parameters + +=over 4 + +=item (List of String) Log messages + +=back + +=head3 Returns + +=over + +=item (Boolean) 1 + +=back + +=head3 Usage + +%%%LANG=perl%%% + # this will print [WARNING] This is a warning message for any debug level: + logWarning("This is a warning message"); +%%%LANG%%% + +=head2 logError(@messages) + +=head3 Description + +Logs an error message + +=head3 Parameters + +=over 4 + +=item (List of String) Log messages + +=back + +=head3 Returns + +=over + +=item (Boolean) 1 + +=back + +=head3 Usage + +%%%LANG=perl%%% + + # this will print [ERROR] This is an error message for any debug level: + logError("This is an error message"); + +%%%LANG%%% + +=head2 logInfoDiag + +This function works exactly as logInfo, but adds additional markups into log. Then this info will be displayed at Diagnostic tab of a job. + +=head2 logWarningDiag + +This function works exactly as logWarning, but adds additional markups into log. Then this warning will be displayed at Diagnostic tab of a job. + +=head2 logErrorDiag + +This function works exactly as logError, but adds additional markups into log. Then this error will be displayed at Diagnostic tab of a job. + + +=cut + +package FlowPDF::Log; +use base qw/Exporter/; + +our @EXPORT = ( + # regular log functions + 'logInfo', + 'logDebug', + 'logTrace', + 'logError', + 'logWarning', + + # log functions for postprocessor. They are present from 1.2.* FlowPDF + 'logInfoDiag', + 'logWarningDiag', + 'logErrorDiag' +); +use strict; +use warnings; +use Data::Dumper; +use Carp; +use Try::Tiny; +use FlowPDF::Helpers qw/inArray/; + +# exceptions +use FlowPDF::Exception::MissingFunctionArgument; +use FlowPDF::Exception::WrongFunctionArgumentType; + +our $LOG_LEVEL = 0; +our $LOG_TO_PROPERTY = ''; +our $MASK_PATTERNS = []; + +use constant { + ERROR => -1, + INFO => 0, + DEBUG => 1, + TRACE => 2, +}; + +sub setMaskPatterns { + my (@params) = @_; + + unless (@params) { + FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'mask patterns', + function => 'setMaskPatterns' + })->throw(); + } + if ($params[0] eq __PACKAGE__ || ref $params[0] eq __PACKAGE__) { + shift @params; + } + for my $p (@params) { + next if isCommonPassword($p); + $p = quotemeta($p); + # avoiding duplicates + if (inArray($p, @$MASK_PATTERNS)) { + next; + } + + push @$MASK_PATTERNS, $p; + } + return 1; +} + +sub isCommonPassword { + my ($password) = @_; + + # well, huh. + if ($password eq 'password') { + return 1; + } + if ($password =~ m/^(?:TEST)+$/is) { + return 1; + } + return 0; +} + +sub maskLine { + my ($self, $line) = @_; + + if (!ref $self || $self eq __PACKAGE__) { + $line = $self; + } + + for my $p (@$MASK_PATTERNS) { + $line =~ s/$p/[PROTECTED]/gs; + } + return $line; +} + +sub setLogToProperty { + my ($param1, $param2) = @_; + + # 1st case, when param 1 is a reference, we are going to set log to property for current object. + # but if this reference is not a FlowPDF::Log reference, it will bailOut + if (ref $param1 and ref $param1 ne __PACKAGE__) { + # exception + FlowPDF::Exception::WrongFunctionArgumentType->new({ + function => 'setLogToProperty', + got => ref $param1, + expected => 'FlowPDF::Log' + })->throw(); + } + + if (ref $param1) { + if (!defined $param2) { + # exception + FlowPDF::Exception::MissingFunctionArgument->new({ + function => 'setLogToProperty', + argument => 'Property Path', + })->throw(); + # croak "Property path is mandatory parameter"; + } + $param1->{logToProperty} = $param2; + return $param1; + } + else { + if ($param1 eq __PACKAGE__) { + $param1 = $param2; + } + if (!defined $param1) { + croak "Property path is mandatory parameter"; + } + $LOG_TO_PROPERTY = $param1; + return 1; + } +} + +sub getLogProperty { + my ($self) = @_; + + if (ref $self && ref $self eq __PACKAGE__) { + return $self->{logToProperty}; + } + return $LOG_TO_PROPERTY; +} + +sub getLogLevel { + my ($self) = @_; + + if (ref $self && ref $self eq __PACKAGE__) { + return $self->{level}; + } + + return $LOG_LEVEL; +} + + +sub setLogLevel { + my ($param1, $param2) = @_; + + if (ref $param1 and ref $param1 ne __PACKAGE__) { + croak (q|Expected a reference to FlowPDF::Log, not a '| . ref $param1 . q|' reference|); + } + + if (ref $param1) { + if (!defined $param2) { + croak "Log level is mandatory parameter"; + } + $param1->{level} = $param2; + return $param1; + } + else { + if ($param1 eq __PACKAGE__) { + $param1 = $param2; + } + if (!defined $param1) { + croak "Property path is mandatory parameter"; + } + $LOG_LEVEL = $param1; + return 1; + } +} +sub new { + my ($class, $opts) = @_; + + my ($level, $logToProperty); + + if (!defined $opts->{level}) { + $level = $LOG_LEVEL; + } + else { + $level = $opts->{level}; + } + + if (!defined $opts->{logToProperty}) { + $logToProperty = $LOG_TO_PROPERTY; + } + else { + $logToProperty = $opts->{logToProperty}; + } + my $self = { + level => $level, + logToProperty => $logToProperty + }; + bless $self, $class; + return $self; +} + +# TODO: Refactor this a bit +# now it is forbidden to call it with full function name. +sub logInfoDiag { + return printDiagMessage('INFO', @_); +} +sub logErrorDiag { + return printDiagMessage('ERROR', @_); +} +sub logWarningDiag { + return printDiagMessage('WARNING', @_); +} + + +sub printDiagMessage { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + + my $logObject = shift @params; + my $level = shift @params; + + if (!$logObject || !$level || !@params) { + return 0; + } + + $level = uc $level; + if ($level !~ m/^(?:ERROR|WARNING|INFO)$/s) { + return 0; + } + + # \n[OUT][%s]: %s :[%s][OUT]\n + my $begin = "\n[POSTP][$level]: "; + my $end = " :[$level][POSTP]\n"; + + my $msg = join '', @params; + $msg = $begin . $msg . $end; + return info($logObject, $msg); +} +sub logInfo { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + return info(@params); +} +sub info { + my ($self, @messages) = @_; + $self->_log(INFO, @messages); +} + + +sub logDebug { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + return debug(@params); +} +sub debug { + my ($self, @messages) = @_; + $self->_log(DEBUG, '[DEBUG]', @messages); +} + + +sub logError { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + return error(@params); +} +sub error { + my ($self, @messages) = @_; + $self->_log(ERROR, '[ERROR]', @messages); +} + + +sub logWarning { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + return warning(@params); +} +sub warning { + my ($self, @messages) = @_; + $self->_log(INFO, '[WARNING]', @messages); +} + + +sub logTrace { + my @params = @_; + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, __PACKAGE__->new(); + } + return trace(@params); +} +sub trace { + my ($self, @messages) = @_; + $self->_log(TRACE, '[TRACE]', @messages); +} + +sub level { + my ($self, $level) = @_; + + if (defined $level) { + $self->{level} = $level; + } + else { + return $self->{level}; + } +} + +sub logToProperty { + my ($self, $prop) = @_; + + if (defined $prop) { + $self->{logToProperty} = $prop; + } + else { + return $self->{logToProperty}; + } +} + + +my $length = 40; + +sub divider { + my ($self, $thick) = @_; + + if ($thick) { + $self->info('=' x $length); + } + else { + $self->info('-' x $length); + } +} + +sub header { + my ($self, $header, $thick) = @_; + + my $symb = $thick ? '=' : '-'; + $self->info($header); + $self->info($symb x $length); +} + +sub _log { + my ($self, $level, @messages) = @_; + + return if $level > $self->level; + my @lines = (); + for my $message (@messages) { + if (ref $message) { + my $t = Dumper($message); + $t = $self->maskLine($t); + print $t; + push @lines, $t; + } + else { + $message = $self->maskLine($message); + print "$message\n"; + push @lines, $message; + } + } + + if ($self->{logToProperty}) { + my $prop = $self->{logToProperty}; + my $value = ""; + try { + $value = $self->ec->getProperty($prop)->findvalue('//value')->string_value; + 1; + }; + unshift @lines, split("\n", $value); + $self->ec->setProperty($prop, join("\n", @lines)); + } +} + + +sub ec { + my ($self) = @_; + unless($self->{ec}) { + require ElectricCommander; + my $ec = ElectricCommander->new; + $self->{ec} = $ec; + } + return $self->{ec}; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Log/FW.pm b/src/main/resources/project/pdk/FlowPDF/Log/FW.pm new file mode 100644 index 00000000..4170db3e --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Log/FW.pm @@ -0,0 +1,547 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Log::FW + +=head1 AUTHOR + +CloudBees + +=head1 NOTE + +This module is not intented to be used by plugin developers. This module should be used only by FlowPDF developers. + +=head1 DESCRIPTION + +This module provides a log for the FlowPDF itself and should be imported and used only in FlowPDF libraries. + +B + +The logger that you're looking for is L. + +Also, please, note, that FlowPDF::Log::FW is a singleton. This object is automatically created during module import. + +Just write: + +%%%LANG=perl%%% + +use FlowPWDF::Log::FW; + +%%%LANG%%% + +And now you have an already created and available logger. + +=head1 SPECIAL ENVIRONMENT VARIABLES AND METHODS + +This module reacts on the following environment variables: + +=over 4 + +=item FLOWPDF_FW_LOG_TO_FILE + +An absolute of wile where log will be written. If file could not be written, logging to the file will be disabled automatically +and warning will be shown in the logs. + +=item FLOWPDF_FW_LOG_TO_PROPERTY + +A property path where log will be written. + +=item FLOWPDF_FW_LOG_LEVEL + +A log level of logger. One of: + +=over 8 + +=item 0 - INFO + +=item 1 - DEBUG + +=item 2 - TRACE + +=back + +Default is INFO. + +=back + +And following methods: + +=over 4 + +=item setLogLevel(); + +=item getLogLevel(); + +=item setLogToProperty(); + +=item getLogProperty(); + +=item setLogToFile(); + +=item getLogFile(); + +=back + +Please, note, that these logfile writing methods are not exclusive. It means that logger will write to all destination that are available. + +For example, if log to property is enabled alongside with logging to file, log will be written to the property and to the file. + +=head1 LOGGING METHODS + +=over + +=item fwLogInfo + +=item fwLogDebug + +=item fwLogTrace + +=item fwLogError + +=item fwLogWarning + +=back + +=cut + +package FlowPDF::Log::FW; +use base qw/Exporter/; + +our @EXPORT = qw/fwLogInfo fwLogDebug fwLogTrace fwLogError fwLogWarning/; +use strict; +use warnings; +use Data::Dumper; +use Carp; +use FlowPDF::Helpers qw/inArray/; +use FlowPDF::Log; + +our $LOG_LEVEL = 0; +# file or property or empty. +our $LOG_TO_PROPERTY; +our $LOG_TO_FILE; + +our $MASK_PATTERNS = $FlowPDF::Log::MASK_PATTERNS; +our $LOGGER = undef; + +sub import { + # this handler sets required log levels from different sources. + # this logger has setup for two different aspects. 1: log level 2: log direction. + # log level is a digit from -1 to 2, log direction is a string: file:/path/to/file or property:/path/to/property + if ($ENV{FLOWPDF_FW_LOG_TO_FILE}) { + $LOG_TO_FILE = $ENV{FLOWPDF_FW_LOG_TO_FILE}; + } + if ($ENV{FLOWPDF_FW_LOG_TO_PROPERTY}) { + $LOG_TO_PROPERTY = $ENV{FLOWPDF_FW_LOG_TO_PROPERTY}; + } + if ($ENV{FLOWPDF_FW_LOG_LEVEL}) { + $LOG_LEVEL = $ENV{FLOWPDF_FW_LOG_LEVEL}; + } + else { + $LOG_LEVEL = 0; + } + if (!$LOGGER) { + $LOGGER = __PACKAGE__->new(); + } + fwLogDebug("Debug level for framework is set to $LOG_LEVEL."); + __PACKAGE__->export_to_level(1, @_); +}; + +use constant { + ERROR => -1, + INFO => 0, + DEBUG => 1, + TRACE => 2, +}; + +sub getLoggerInstance { + return $LOGGER; +} +sub parseLogDestination { + my ($destination) = @_; + + my ($type, $location) = @_; + + if ($destination =~ m/^(.*?):(.*?)$/s) { + $type = $1; + $location = $2; + } + + if (!$type || !$location) { + return undef; + } + + if ($type !~ m/^(?:file|property)$/s) { + fwLogWarning("Destination is wrong. Currently only 'file' and 'property' are supported"); + return undef; + } + return ($type, $location) if wantarray(); + return [$type, $location]; +} + +sub setMaskPatterns { + my (@params) = @_; + + unless (@params) { + croak "Missing mask patterns for setMastPatterns."; + } + if ($params[0] eq __PACKAGE__ || ref $params[0] eq __PACKAGE__) { + shift @params; + } + for my $p (@params) { + next if isCommonPassword($p); + $p = quotemeta($p); + # avoiding duplicates + if (inArray($p, @$MASK_PATTERNS)) { + next; + } + + push @$MASK_PATTERNS, $p; + } + return 1; +} + +sub isCommonPassword { + my ($password) = @_; + + # well, huh. + if ($password eq 'password') { + return 1; + } + if ($password =~ m/^(?:TEST)+$/is) { + return 1; + } + return 0; +} + +sub maskLine { + my ($self, $line) = @_; + + if (!ref $self || $self eq __PACKAGE__) { + $line = $self; + } + + for my $p (@$MASK_PATTERNS) { + $line =~ s/$p/[PROTECTED]/gs; + } + return $line; +} + +sub setLogToProperty { + my ($param1, $param2) = @_; + + # 1st case, when param 1 is a reference, we are going to set log to property for current object. + # but if this reference is not a FlowPDF::Log reference, it will bailOut + if (ref $param1 and ref $param1 ne __PACKAGE__) { + croak(q|Expected a reference to FlowPDF::Log, not a '| . ref $param1 . q|' reference|); + } + + if (ref $param1) { + if (!defined $param2) { + croak "Property path is mandatory parameter"; + } + $param1->{logToProperty} = $param2; + $LOG_TO_PROPERTY = $param2; + return $param1; + } + else { + if ($param1 eq __PACKAGE__) { + $param1 = $param2; + } + if (!defined $param1) { + croak "Property path is mandatory parameter"; + } + $LOG_TO_PROPERTY = $param1; + $LOGGER->{logToProperty} = $LOG_TO_PROPERTY; + return 1; + } +} + +sub getLogProperty { + my ($self) = @_; + + if (ref $self && ref $self eq __PACKAGE__) { + return $self->{logToProperty}; + } + return $LOG_TO_PROPERTY; +} + +sub setLogToFile { + my ($param1, $param2) = @_; + + # 1st case, when param 1 is a reference, we are going to set log to file for current object. + # but if this reference is not a FlowPDF::Log reference, it will bailOut + if (ref $param1 and ref $param1 ne __PACKAGE__) { + croak(q|Expected a reference to FlowPDF::Log, not a '| . ref $param1 . q|' reference|); + } + + if (ref $param1) { + if (!defined $param2) { + croak "File path is mandatory parameter"; + } + $param1->{logToFile} = $param2; + $LOG_TO_FILE = $param2; + return $param1; + } + else { + if ($param1 eq __PACKAGE__) { + $param1 = $param2; + } + if (!defined $param1) { + croak "File path is mandatory parameter"; + } + $LOG_TO_FILE = $param1; + $LOGGER->{logToFile} = $LOG_TO_FILE; + return 1; + } +} + +sub getLogFile { + my ($self) = @_; + + if (ref $self && ref $self eq __PACKAGE__) { + return $self->{logToFile}; + } + return $LOG_TO_FILE; +} + +sub getLogLevel { + my ($self) = @_; + + if (ref $self && ref $self eq __PACKAGE__) { + return $self->{level}; + } + + return $LOG_LEVEL; +} + + +sub setLogLevel { + my ($param1, $param2) = @_; + + if (ref $param1 and ref $param1 ne __PACKAGE__) { + croak (q|Expected a reference to FlowPDF::Log, not a '| . ref $param1 . q|' reference|); + } + + if (ref $param1) { + if (!defined $param2) { + croak "Log level is mandatory parameter"; + } + $param1->{level} = $param2; + $LOG_LEVEL = $param2; + return $param1; + } + else { + if ($param1 eq __PACKAGE__) { + $param1 = $param2; + } + if (!defined $param1) { + croak "Property path is mandatory parameter"; + } + $LOG_LEVEL = $param1; + $LOGGER->{level} = $LOG_LEVEL; + return 1; + } +} +sub new { + my ($class, $opts) = @_; + + my ($level, $logToProperty, $logToFile); + + if (!defined $opts->{level}) { + $level = $LOG_LEVEL; + } + else { + $level = $opts->{level}; + } + + if (!defined $opts->{logToProperty}) { + $logToProperty = $LOG_TO_PROPERTY; + } + else { + $logToProperty = $opts->{logToProperty}; + } + + if (!defined $opts->{logToFile}) { + $logToFile = $opts->{logToFile}; + } + + my $self = { + level => $level, + logToProperty => $logToProperty, + logToFile => $logToFile + }; + + bless $self, $class; + return $self; +} + +sub fwLogInfo { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, $LOGGER; + } + return info(@params); +} +sub info { + my ($self, @messages) = @_; + $self->_log(INFO, @messages); +} + + +sub fwLogDebug { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, $LOGGER; + } + return debug(@params); +} +sub debug { + my ($self, @messages) = @_; + $self->_log(DEBUG, '[FLOWPDF_DEBUG]', @messages); +} + + +sub fwLogError { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, $LOGGER; + } + return error(@params); +} +sub error { + my ($self, @messages) = @_; + $self->_log(ERROR, '[FLOWPDF_ERROR]', @messages); +} + + +sub fwLogWarning { + my @params = @_; + + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, $LOGGER; + } + return warning(@params); +} +sub warning { + my ($self, @messages) = @_; + $self->_log(INFO, '[FLOWPDF_WARNING]', @messages); +} + + +sub fwLogTrace { + my @params = @_; + if (!ref $params[0] || ref $params[0] ne __PACKAGE__) { + unshift @params, $LOGGER; + } + return trace(@params); +} +sub trace { + my ($self, @messages) = @_; + $self->_log(TRACE, '[FLOWPDF_TRACE]', @messages); +} + +sub level { + my ($self, $level) = @_; + + if (defined $level) { + $self->{level} = $level; + } + else { + return $self->{level}; + } +} + +sub logToProperty { + my ($self, $prop) = @_; + + if (defined $prop) { + $self->{logToProperty} = $prop; + } + else { + return $self->{logToProperty}; + } +} + + +my $length = 40; + +sub divider { + my ($self, $thick) = @_; + + if ($thick) { + $self->info('=' x $length); + } + else { + $self->info('-' x $length); + } +} + +sub header { + my ($self, $header, $thick) = @_; + + my $symb = $thick ? '=' : '-'; + $self->info($header); + $self->info($symb x $length); +} + +sub _log { + my ($self, $level, @messages) = @_; + + return 1 if $level > $self->level; + my @lines = (); + for my $message (@messages) { + if (ref $message) { + my $t = Dumper($message); + $t = $self->maskLine($t); + print $t; + push @lines, $t; + } + else { + $message = $self->maskLine($message); + print "$message\n"; + push @lines, $message; + } + } + + if ($self->{logToProperty}) { + my $prop = $self->{logToProperty}; + my $value = ""; + eval { + $value = $self->ec->getProperty($prop)->findvalue('//value')->string_value; + 1; + }; + unshift @lines, split("\n", $value); + $self->ec->setProperty($prop, join("\n", @lines)); + } + + if ($self->{logToFile}) { + my $file = $self->{logToFile}; + open (my $fh, '>>', $file) || do { + fwLogWarning("Can't open '$file' for writing logs. Disabling logging into file."); + $self->setLogToFile(''); + }; + print $fh join("\n", @lines); + } + return 1; +} + + +sub ec { + my ($self) = @_; + unless($self->{ec}) { + require ElectricCommander; + my $ec = ElectricCommander->new; + $self->{ec} = $ec; + } + return $self->{ec}; +} + + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Parameter.pm b/src/main/resources/project/pdk/FlowPDF/Parameter.pm new file mode 100644 index 00000000..9e89c351 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Parameter.pm @@ -0,0 +1,208 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Parameter + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class represents ElectricFlow parameters. It could be: + +=over 4 + +=item B + +=item B + +=back + +=head1 SYNOPSIS + +Objects of this class have support of toString(). If this object will be used in a string context like: + +%%%LANG=perl%%% + + my $parameter = $stepParameters->getParameter('query'); + print "Parameter: $parameter\n"; + +%%%LANG%%% + +getValue() method will be applied automatically and you will get a value instead of reference address. + +This object is being returned by L or L getParameter() method. + +L object is being returned by getStepParameters() method of L. + +L object is being returned by getConfigValues method of L + +=head1 METHODS + +=head2 getName() + +=head3 Description + +Gets a name from FlowPDF::Parameter object. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (String) Name of the parameter. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $parameterName = $parameter->getName(); + +%%%LANG%%% + +=head2 getValue() + +=head3 Description + +Returns a value of the current parameter. + +=head3 Parameters + +=over 4 + +=item None + +=cut + +=back + +=head3 Returns + +=over 4 + +=item (String) Value of the parameter + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $parameterValue = $parameter->getValue(); + +%%%LANG%%% + +Also, note, that B: + +%%%LANG=perl%%% + + # getValue is being applied automatically in string conext. Following 2 lines of code are doing the same: + print "Query: $query\n"; + printf "Query: %s\n", $query->getValue(); + +%%LANG + +=head2 setName($name) + +=head3 Description + +Sets a name for the current parameter. + +=head3 Parameters + +=over 4 + +=item (Required) (String) Parameter Name + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::Parameter) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $parameter->setName('myNewName'); + +%%%LANG%%% + +=head2 setValue($value) + +=head3 Description + +=head3 Parameters + +=over 4 + +=item (Required)(String) Parameter Value + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::Parameter) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $parameter->setValue('MyNewValue'); + +%%%LANG%%% + +=cut + +package FlowPDF::Parameter; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + name => FlowPDF::Types::Scalar(), + value => FlowPDF::Types::Scalar(), +}); +use overload + '""' => 'toString'; + +use strict; +use warnings; + +sub set { + my ($self, $name, $value) = @_; + + $self->setName($name); + $self->setValue($value); + + return 1; +} + + +sub toString { + my ($self) = @_; + + return $self->getValue(); +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Service/Bootstrap.pm b/src/main/resources/project/pdk/FlowPDF/Service/Bootstrap.pm new file mode 100644 index 00000000..8902022b --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Service/Bootstrap.pm @@ -0,0 +1,116 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Service::Bootstrap; +use strict; +use warnings; +no warnings qw/redefine/; +use Carp; +use ElectricCommander; +use ElectricCommander::Arguments; + +use Data::Dumper; + +sub import { + my $ec_version = $ElectricCommander::VERSION; + + my $bootstrap = get_bootstrap_by_version($ec_version); + bootstrap_functions($bootstrap); +} + +sub get_bootstrap_by_version { + my ($version) = @_; + my $result = {}; + + if ($version >= 8.0500) { + return $result; + } + $result = {%$result, %{ bootstrap_prior_85() }}; + + if ($version >= 8.0300) { + return $result; + } + $result = {%$result, %{ bootstrap_prior_83() }}; + + return $result; +} + + +sub bootstrap_prior_83 { + return { + setOutputParameter => 0E0, + createFormalOutputParameter => 0E0, + getFormalOutputParameter => 0E0, + getFormalOutputParameters => 0E0, + }; +} + +sub bootstrap_prior_85 { + return { + createTag => 0E0, + }; +} + +sub bootstrap_functions { + my ($h) = @_; + + # print Dumper $h; + for my $k (keys %$h) { + no strict qw/refs/; + $h->{$k} = 'ok' unless defined $h->{$k}; + if (ref $h->{$k} eq 'CODE') { + *{'ElectricCommander' . "::$k"} = $h->{$k}; + + # This is necessary for ElectricCommander::Batch + $ElectricCommander::Arguments{$k} = $h->{$k}; + } + elsif ($h->{$k} =~ m/^(?:ok|error|warning|exit_ok|exit_error)$/s) { + my $function_name = 'default_' . $h->{$k}; + *{'ElectricCommander' . "::$k"} = sub {$function_name->($k)}; + } + elsif ($h->{$k} =~ m/forward_to\s(.*?)$/s) { + *{'ElectricCommander' . "::$k"} = sub { + my $f = 'ElectricCommander::' . $1; + return $f(@_) + }; + } + elsif ($h->{$k} eq 0E0) { + *{'ElectricCommander' . "::$k"} = sub {return 0E0;}; + } + else { + *{'ElectricCommander' . "::$k"} = sub {default_ok($k)}; + } + } +} + +sub default_ok { + return 1; +} + +sub default_error { + my ($function_name) = @_; + croak sprintf("Can't call function $function_name"); +} + +sub default_warning { + my ($function_name) = @_; + croak sprintf("Can't call function $function_name"); +} +sub default_exit_ok { + my ($function_name) = @_; + exit 0; +} +sub default_exit_error { + my ($function_name) = @_; + exit 1; +} +1; + +=head1 NAME + +ElectricCommander + +=head1 DESCRIPTION + +=cut diff --git a/src/main/resources/project/pdk/FlowPDF/Service/RSA.pm b/src/main/resources/project/pdk/FlowPDF/Service/RSA.pm new file mode 100644 index 00000000..d04d10ca --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Service/RSA.pm @@ -0,0 +1,3394 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=pod + + Below are located Pure Perl dependencies for RSA signing. + * Crypt::Perl::RSA with non-core dependecies + * Math::BigInt (v1.999811). + + This Math::BigInt version should be included because some methods (e.g. bge() and bne() are not implemented in EC package) + + Modifications for original files: + - Removed all library files from Crypt::Perl that was not required (simply deleted files one by one with a simple script) + - Concatenated everything (except Bytes::Random::Secure::Tiny) to a single file + - All 'use' are replaced with ->import() (because everything is located in a single file) + - Added sign_RS1() signing method to Crypt::Perl::RSA::PrivateKey + - Math::BigInt::Calc method api_version() was changed to _api_version() with corresponding places it was used + - Patched Crypt::Format der2pem with string below to support keys passed without newlines + $pem=~s<\s?-{5}(?:BEGIN|END)\s[A-Z\s]+-{5}\s?><>s; + - Changed non-ASCII symbols (probably got there because of copying the code from browser's window) + + All concatenated modules was "packed" with + $ perltidy -b -dp -dac --mangle dsl/properties/lib/EC/OAuthDependencies/RSA.pm + +=cut + +package Convert::ASN1; +{$Convert::ASN1::VERSION='0.27'; +}use 5.004; +use strict; +use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS @opParts @opName $AUTOLOAD); +use Exporter; +use constant CHECK_UTF8=>$]>5.007; +BEGIN{local$SIG{__DIE__}; +eval{require bytes and 'bytes'->import}; +if(CHECK_UTF8){require Encode; +require utf8;}@ISA=qw(Exporter); +%EXPORT_TAGS=(io=>[qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],debug=>[qw(asn_dump asn_hexdump)],const=>[qw(ASN_BOOLEAN ASN_INTEGER ASN_BIT_STR ASN_OCTET_STR + ASN_NULL ASN_OBJECT_ID ASN_REAL ASN_ENUMERATED + ASN_SEQUENCE ASN_SET ASN_PRINT_STR ASN_IA5_STR + ASN_UTC_TIME ASN_GENERAL_TIME ASN_RELATIVE_OID + ASN_UNIVERSAL ASN_APPLICATION ASN_CONTEXT ASN_PRIVATE + ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],tag=>[qw(asn_tag asn_decode_tag2 asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]); +@EXPORT_OK=map{@$_}values%EXPORT_TAGS; +$EXPORT_TAGS{all}=\@EXPORT_OK; +@opParts=qw( + cTAG cTYPE cVAR cLOOP cOPT cEXT cCHILD cDEFINE +); +@opName=qw( + opUNKNOWN opBOOLEAN opINTEGER opBITSTR opSTRING opNULL opOBJID opREAL + opSEQUENCE opEXPLICIT opSET opUTIME opGTIME opUTF8 opANY opCHOICE opROID opBCD + opEXTENSIONS +); +foreach my $l(\@opParts,\@opName){my$i=0; +foreach my $name(@$l){my$j=$i++; +no strict 'refs'; +*{__PACKAGE__.'::'.$name}=sub (){$j}}}}sub _internal_syms{my$pkg=caller; +no strict 'refs'; +for my $sub(@opParts,@opName,'dump_op'){*{$pkg.'::'.$sub}=\&{__PACKAGE__.'::'.$sub};}}sub ASN_BOOLEAN (){0x01}sub ASN_INTEGER (){0x02}sub ASN_BIT_STR (){0x03}sub ASN_OCTET_STR (){0x04}sub ASN_NULL (){0x05}sub ASN_OBJECT_ID (){0x06}sub ASN_REAL (){0x09}sub ASN_ENUMERATED (){0x0A}sub ASN_RELATIVE_OID (){0x0D}sub ASN_SEQUENCE (){0x10}sub ASN_SET (){0x11}sub ASN_PRINT_STR (){0x13}sub ASN_IA5_STR (){0x16}sub ASN_UTC_TIME (){0x17}sub ASN_GENERAL_TIME (){0x18}sub ASN_UNIVERSAL (){0x00}sub ASN_APPLICATION (){0x40}sub ASN_CONTEXT (){0x80}sub ASN_PRIVATE (){0xC0}sub ASN_PRIMITIVE (){0x00}sub ASN_CONSTRUCTOR (){0x20}sub ASN_LONG_LEN (){0x80}sub ASN_EXTENSION_ID (){0x1F}sub ASN_BIT (){0x80}sub new{my$pkg=shift; +my$self=bless{},$pkg; +$self->configure(@_); +$self;}sub configure{my$self=shift; +my%opt=@_; +$self->{options}->{encoding}=uc($opt{encoding}||'BER'); +unless($self->{options}->{encoding}=~/^[BD]ER$/){require Carp; +Carp::croak("Unsupported encoding format '$opt{encoding}'");}$self->{options}->{tagdefault}=uc($opt{tagdefault}||'IMPLICIT'); +unless($self->{options}->{tagdefault}=~/^(?:EXPLICIT|IMPLICIT)$/){require Carp; +Carp::croak("Default tagging must be EXPLICIT/IMPLICIT. Not $opt{tagdefault}");}for my $type(qw(encode decode)){if(exists$opt{$type}){while(my($what,$value)=each%{$opt{$type}}){$self->{options}->{"${type}_${what}"}=$value;}}}}sub find{my$self=shift; +my$what=shift; +return unless exists$self->{tree}->{$what}; +my%new=%$self; +$new{script}=$new{tree}->{$what}; +bless\%new,ref($self);}sub prepare{my$self=shift; +my$asn=shift; +Convert::ASN1::parser->import('parse'); +$self=$self->new unless ref($self); +my$tree; +if(ref($asn)eq 'GLOB'){local$/=undef; +my$txt=<$asn>; +$tree=Convert::ASN1::parser::parse($txt,$self->{options}->{tagdefault});}else{$tree=Convert::ASN1::parser::parse($asn,$self->{options}->{tagdefault});}unless($tree){$self->{error}=$@; +return;}$self->{tree}=_pack_struct($tree); +$self->{script}=(values%$tree)[0]; +$self;}sub prepare_file{my$self=shift; +my$asnp=shift; +local*ASN; +open(ASN,$asnp)or do{$self->{error}=$@; +return;}; +my$ret=$self->prepare(\*ASN); +close(ASN); +$ret;}sub registeroid{my$self=shift; +my$oid=shift; +my$handler=shift; +$self->{options}->{oidtable}->{$oid}=$handler; +$self->{oidtable}->{$oid}=$handler;}sub registertype{my$self=shift; +my$def=shift; +my$type=shift; +my$handler=shift; +$self->{options}->{handlers}->{$def}->{$type}=$handler;}sub _pack_struct{$_[0]}sub _unpack_struct{$_[0]}sub encode{my$self=shift; +my$stash=@_==1?shift:{@_}; +my$buf=''; +local$SIG{__DIE__}; +eval{_encode($self->{options},$self->{script},$stash,[],$buf)}or do{$self->{error}=$@; +undef;}}sub asn_encode_tag{$_[0]>>8?$_[0]&0x8000?$_[0]&0x800000?pack("V",$_[0]):substr(pack("V",$_[0]),0,3):pack("v",$_[0]):pack("C",$_[0]);}sub asn_encode_length{if($_[0]>>7){my$lenlen=&num_length; +return pack("Ca*",$lenlen|0x80,substr(pack("N",$_[0]),-$lenlen));}return pack("C",$_[0]);}sub decode{my$self=shift; +my$ret; +local$SIG{__DIE__}; +eval{my(%stash,$result); +my$script=$self->{script}; +my$stash=\$result; +while($script){my$child=$script->[0]or last; +if(@$script>1 or defined$child->[cVAR]){$result=$stash=\%stash; +last;}last if$child->[cTYPE]==opCHOICE or$child->[cLOOP]; +$script=$child->[cCHILD];}_decode($self->{options},$self->{script},$stash,0,length$_[0],undef,{},$_[0]); +$ret=$result; +1;}or$self->{'error'}=$@||'Unknown error'; +$ret;}sub asn_decode_length{return unless length$_[0]; +my$len=unpack("C",$_[0]); +if($len&0x80){$len&=0x7f or return(1,-1); +return if$len>=length$_[0]; +return(1+$len,unpack("N","\0" x(4-$len).substr($_[0],1,$len)));}return(1,$len);}sub asn_decode_tag{return unless length$_[0]; +my$tag=unpack("C",$_[0]); +my$n=1; +if(($tag&0x1f)==0x1f){my$b; +do{return if$n>=length$_[0]; +$b=unpack("C",substr($_[0],$n,1)); +$tag|=$b <<(8*$n++);}while($b&0x80);}($n,$tag);}sub asn_decode_tag2{return unless length$_[0]; +my$tag=unpack("C",$_[0]); +my$num=$tag&0x1f; +my$len=1; +if($num==0x1f){$num=0; +my$b; +do{return if$len>=length$_[0]; +$b=unpack("C",substr($_[0],$len++,1)); +$num=($num <<7)+($b&0x7f);}while($b&0x80);}($len,$tag,$num);}sub num_length{$_[0]>>8?$_[0]>>16?$_[0]>>24?4:3:2:1;}sub i2osp{my($num,$biclass)=@_; +eval"use $biclass"; +$num=$biclass->new($num); +my$neg=$num<0 and$num=abs($num+1); +my$base=$biclass->new(256); +my$result=''; +while($num!=0){my$r=$num%$base; +$num=($num-$r)/$base; +$result.=pack("C",$r);}$result^=pack("C",255)x length($result)if$neg; +return scalar reverse$result;}sub os2ip{my($os,$biclass)=@_; +eval"require $biclass"; +my$base=$biclass->new(256); +my$result=$biclass->new(0); +my$neg=unpack("C",$os)>=0x80 and$os^=pack("C",255)x length($os); +for(unpack("C*",$os)){$result=($result*$base)+$_;}return$neg?($result+1)*-1:$result;}sub asn_tag{my($class,$value)=@_; +die sprintf"Bad tag class 0x%x",$class if$class&~0xe0; +unless($value&~0x1f or$value==0x1f){return(($class&0xe0)|$value);}die sprintf"Tag value 0x%08x too big\n",$value if$value&0xffe00000; +$class=($class|0x1f)&0xff; +my@t=($value&0x7f); +unshift@t,(0x80|($value&0x7f))while$value>>=7; +unpack("V",pack("C4",$class,@t,0,0));}Convert::ASN1::parser->import(); +BEGIN{unless(CHECK_UTF8){local$SIG{__DIE__}; +eval{require bytes}and 'bytes'->import;}}my@encode=(sub{die"internal error\n"},\&_enc_boolean,\&_enc_integer,\&_enc_bitstring,\&_enc_string,\&_enc_null,\&_enc_object_id,\&_enc_real,\&_enc_sequence,\&_enc_sequence,\&_enc_sequence,\&_enc_time,\&_enc_time,\&_enc_utf8,\&_enc_any,\&_enc_choice,\&_enc_object_id,\&_enc_bcd,); +sub _encode{my($optn,$ops,$stash,$path)=@_; +my$var; +foreach my $op(@{$ops}){next if$op->[cTYPE]==opEXTENSIONS; +if(defined(my$opt=$op->[cOPT])){next unless defined$stash->{$opt};}if(defined($var=$op->[cVAR])){push@$path,$var; +require Carp,Carp::croak(join(".",@$path)," is undefined")unless defined$stash->{$var};}$_[4].=$op->[cTAG]; +&{$encode[$op->[cTYPE]]}($optn,$op,(UNIVERSAL::isa($stash,'HASH')?($stash,defined($var)?$stash->{$var}:undef):({},$stash)),$_[4],$op->[cLOOP],$path,); +pop@$path if defined$var;}$_[4];}sub _enc_boolean{$_[4].=pack("CC",1,$_[3]?0xff:0);}sub _enc_integer{if(abs($_[3])>=2**31){my$os=i2osp($_[3],ref($_[3])||$_[0]->{encode_bigint}||'Math::BigInt'); +my$len=length$os; +my$msb=(vec($os,0,8)&0x80)?0:255; +$len++,$os=pack("C",$msb).$os if$msb xor$_[3]>0; +$_[4].=asn_encode_length($len); +$_[4].=$os;}else{my$val=int($_[3]); +my$neg=($val<0); +my$len=num_length($neg?~$val:$val); +my$msb=$val&(0x80 <<(($len-1)*8)); +$len++ if$neg?!$msb:$msb; +$_[4].=asn_encode_length($len); +$_[4].=substr(pack("N",$val),-$len);}}sub _enc_bitstring{my$vref=ref($_[3])?\($_[3]->[0]):\$_[3]; +if(CHECK_UTF8 and Encode::is_utf8($$vref)){utf8::encode(my$tmp=$$vref); +$vref=\$tmp;}if(ref($_[3])){my$less=(8-($_[3]->[1]&7))&7; +my$len=($_[3]->[1]+7)>>3; +$_[4].=asn_encode_length(1+$len); +$_[4].=pack("C",$less); +$_[4].=substr($$vref,0,$len); +if($less&&$len){substr($_[4],-1)&=pack("C",(0xff <<$less)&0xff);}}else{$_[4].=asn_encode_length(1+length$$vref); +$_[4].=pack("C",0); +$_[4].=$$vref;}}sub _enc_string{if(CHECK_UTF8 and Encode::is_utf8($_[3])){utf8::encode(my$tmp=$_[3]); +$_[4].=asn_encode_length(length$tmp); +$_[4].=$tmp;}else{$_[4].=asn_encode_length(length$_[3]); +$_[4].=$_[3];}}sub _enc_null{$_[4].=pack("C",0);}sub _enc_object_id{my@data=($_[3]=~/(\d+)/g); +if($_[1]->[cTYPE]==opOBJID){if(@data<2){@data=(0);}else{my$first=$data[1]+($data[0]*40); +splice(@data,0,2,$first);}}my$l=length$_[4]; +$_[4].=pack("cw*",0,@data); +substr($_[4],$l,1)=asn_encode_length(length($_[4])-$l-1);}sub _enc_real{unless($_[3]){$_[4].=pack("C",0); +return;}require POSIX; +if($_[3]>=POSIX::HUGE_VAL()){$_[4].=pack("C*",0x01,0x40); +return;}if($_[3]<=-POSIX::HUGE_VAL()){$_[4].=pack("C*",0x01,0x41); +return;}if(exists$_[0]->{'encode_real'}&&$_[0]->{'encode_real'}ne 'binary'){my$tmp=sprintf("%g",$_[3]); +$_[4].=asn_encode_length(1+length$tmp); +$_[4].=pack("C",1); +$_[4].=$tmp; +return;}my$first=0x80; +my($mantissa,$exponent)=POSIX::frexp($_[3]); +if($mantissa<0.0){$mantissa=-$mantissa; +$first|=0x40;}my($eMant,$eExp); +while($mantissa>0.0){($mantissa,my$int)=POSIX::modf($mantissa*(1 <<8)); +$eMant.=pack("C",$int);}$exponent-=8*length$eMant; +_enc_integer(undef,undef,undef,$exponent,$eExp); +if(5>length$eExp){$eExp=~s/\A.//s; +$first|=length($eExp)-1;}else{$first|=0x3;}$_[4].=asn_encode_length(1+length($eMant)+length($eExp)); +$_[4].=pack("C",$first); +$_[4].=$eExp; +$_[4].=$eMant;}sub _enc_sequence{if(my$ops=$_[1]->[cCHILD]){my$l=length$_[4]; +$_[4].="\0\0"; +if(defined$_[5]){my$op=$ops->[0]; +my$enc=$encode[$op->[cTYPE]]; +my$tag=$op->[cTAG]; +my$loop=$op->[cLOOP]; +push@{$_[6]},-1; +foreach my $var(@{$_[3]}){$_[6]->[-1]++; +$_[4].=$tag; +&{$enc}($_[0],$op,$_[2],$var,$_[4],$loop,$_[6],);}pop@{$_[6]};}else{_encode($_[0],$_[1]->[cCHILD],defined($_[3])?$_[3]:$_[2],$_[6],$_[4]);}substr($_[4],$l,2)=asn_encode_length(length($_[4])-$l-2);}else{$_[4].=asn_encode_length(length$_[3]); +$_[4].=$_[3];}}my%_enc_time_opt=(utctime=>1,withzone=>0,raw=>2); +sub _enc_time{my$mode=$_enc_time_opt{$_[0]->{'encode_time'}||''}||0; +if($mode==2){$_[4].=asn_encode_length(length$_[3]); +$_[4].=$_[3]; +return;}my$time; +my@time; +my$offset; +my$isgen=$_[1]->[cTYPE]==opGTIME; +if(ref($_[3])){$offset=int($_[3]->[1]/60); +$time=$_[3]->[0]+$_[3]->[1];}elsif($mode==0){if(exists$_[0]->{'encode_timezone'}){$offset=int($_[0]->{'encode_timezone'}/60); +$time=$_[3]+$_[0]->{'encode_timezone'};}else{@time=localtime($_[3]); +my@g=gmtime($_[3]); +$offset=($time[1]-$g[1])+($time[2]-$g[2])*60; +$time=$_[3]+$offset*60;}}else{$time=$_[3];}@time=gmtime($time); +$time[4]+=1; +$time[5]=$isgen?($time[5]+1900):($time[5]%100); +my$tmp=sprintf("%02d" x 6,@time[5,4,3,2,1,0]); +if($isgen){my$sp=sprintf("%.03f",$time); +$tmp.=substr($sp,-4)unless$sp=~/\.000$/;}$tmp.=$offset?sprintf("%+03d%02d",$offset/60,abs($offset%60)):'Z'; +$_[4].=asn_encode_length(length$tmp); +$_[4].=$tmp;}sub _enc_utf8{if(CHECK_UTF8){my$tmp=$_[3]; +utf8::upgrade($tmp)unless Encode::is_utf8($tmp); +utf8::encode($tmp); +$_[4].=asn_encode_length(length$tmp); +$_[4].=$tmp;}else{$_[4].=asn_encode_length(length$_[3]); +$_[4].=$_[3];}}sub _enc_any{my$handler; +if($_[1]->[cDEFINE]&&$_[2]->{$_[1]->[cDEFINE]}){$handler=$_[0]->{oidtable}->{$_[2]->{$_[1]->[cDEFINE]}}; +$handler=$_[0]->{handlers}->{$_[1]->[cVAR]}->{$_[2]->{$_[1]->[cDEFINE]}}unless$handler;}if($handler){$_[4].=$handler->encode($_[3]);}else{$_[4].=$_[3];}}sub _enc_choice{my$stash=defined($_[3])?$_[3]:$_[2]; +for my $op(@{$_[1]->[cCHILD]}){next if$op->[cTYPE]==opEXTENSIONS; +my$var=defined$op->[cVAR]?$op->[cVAR]:$op->[cCHILD]->[0]->[cVAR]; +if(exists$stash->{$var}){push@{$_[6]},$var; +_encode($_[0],[$op],$stash,$_[6],$_[4]); +pop@{$_[6]}; +return;}}require Carp; +Carp::croak("No value found for CHOICE ".join(".",@{$_[6]}));}sub _enc_bcd{my$str=("$_[3]"=~/^(\d+)/)?$1:""; +$str.="F" if length($str)&1; +$_[4].=asn_encode_length(length($str)/2); +$_[4].=pack("H*",$str);}BEGIN{local$SIG{__DIE__}; +eval{require bytes and 'bytes'->import};}my@decode=(sub{die"internal error\n"},\&_dec_boolean,\&_dec_integer,\&_dec_bitstring,\&_dec_string,\&_dec_null,\&_dec_object_id,\&_dec_real,\&_dec_sequence,\&_dec_explicit,\&_dec_set,\&_dec_time,\&_dec_time,\&_dec_utf8,undef,undef,\&_dec_object_id,\&_dec_bcd,); +my@ctr; +@ctr[opBITSTR,opSTRING,opUTF8]=(\&_ctr_bitstring,\&_ctr_string,\&_ctr_string); +sub _decode{my($optn,$ops,$stash,$pos,$end,$seqof,$larr)=@_; +my$idx=0; +foreach my $buf($_[-1]){OP: +foreach my $op(@{$ops}){my$var=$op->[cVAR]; +if(length$op->[cTAG]){TAGLOOP:{my($tag,$len,$npos,$indef)=_decode_tl($buf,$pos,$end,$larr)or do{next OP if$pos==$end and($seqof||defined$op->[cEXT]); +die"decode error";}; +if($tag eq$op->[cTAG]){&{$decode[$op->[cTYPE]]}($optn,$op,$stash,($seqof?$seqof->[$idx++]:defined($var)?$stash->{$var}:ref($stash)eq 'SCALAR'?$$stash:1),$buf,$npos,$len,$larr); +$pos=$npos+$len+$indef; +redo TAGLOOP if$seqof&&$pos<$end; +next OP;}if($tag eq($op->[cTAG]|pack("C",ASN_CONSTRUCTOR))and my$ctr=$ctr[$op->[cTYPE]]){_decode($optn,[$op],undef,$npos,$npos+$len,(\my@ctrlist),$larr,$buf,); +($seqof?$seqof->[$idx++]:defined($var)?$stash->{$var}:ref($stash)eq 'SCALAR'?$$stash:undef)=&{$ctr}(@ctrlist); +$pos=$npos+$len+$indef; +redo TAGLOOP if$seqof&&$pos<$end; +next OP;}if($seqof||defined$op->[cEXT]){next OP;}die"decode error ".unpack("H*",$tag)."<=>".unpack("H*",$op->[cTAG])," ",$pos," ",$op->[cTYPE]," ",$op->[cVAR]||'';}}else{if($op->[cTYPE]==opANY){ANYLOOP:{my($tag,$len,$npos,$indef)=_decode_tl($buf,$pos,$end,$larr)or do{next OP if$pos==$end and($seqof||defined$op->[cEXT]); +die"decode error";}; +$len+=$npos-$pos+$indef; +my$handler; +if($op->[cDEFINE]){$handler=$optn->{oidtable}&&$optn->{oidtable}->{$stash->{$op->[cDEFINE]}}; +$handler||=$optn->{handlers}->{$op->[cVAR]}->{$stash->{$op->[cDEFINE]}};}($seqof?$seqof->[$idx++]:ref($stash)eq 'SCALAR'?$$stash:$stash->{$var})=$handler?$handler->decode(substr($buf,$pos,$len)):substr($buf,$pos,$len); +$pos+=$len; +redo ANYLOOP if$seqof&&$pos<$end;}}elsif($op->[cTYPE]==opCHOICE){CHOICELOOP:{my($tag,$len,$npos,$indef)=_decode_tl($buf,$pos,$end,$larr)or do{next OP if$pos==$end and($seqof||defined$op->[cEXT]); +die"decode error";}; +my$extensions; +foreach my $cop(@{$op->[cCHILD]}){if($tag eq$cop->[cTAG]){my$nstash=$seqof?($seqof->[$idx++]={}):defined($var)?($stash->{$var}={}):ref($stash)eq 'SCALAR'?($$stash={}):$stash; +&{$decode[$cop->[cTYPE]]}($optn,$cop,$nstash,($cop->[cVAR]?$nstash->{$cop->[cVAR]}:undef),$buf,$npos,$len,$larr,); +$pos=$npos+$len+$indef; +redo CHOICELOOP if$seqof&&$pos<$end; +next OP;}if($cop->[cTYPE]==opEXTENSIONS){$extensions=1; +next;}unless(length$cop->[cTAG]){eval{_decode($optn,[$cop],(\my%tmp_stash),$pos,$npos+$len+$indef,undef,$larr,$buf,); +my$nstash=$seqof?($seqof->[$idx++]={}):defined($var)?($stash->{$var}={}):ref($stash)eq 'SCALAR'?($$stash={}):$stash; +@{$nstash}{keys%tmp_stash}=values%tmp_stash;}or next; +$pos=$npos+$len+$indef; +redo CHOICELOOP if$seqof&&$pos<$end; +next OP;}if($tag eq($cop->[cTAG]|pack("C",ASN_CONSTRUCTOR))and my$ctr=$ctr[$cop->[cTYPE]]){my$nstash=$seqof?($seqof->[$idx++]={}):defined($var)?($stash->{$var}={}):ref($stash)eq 'SCALAR'?($$stash={}):$stash; +_decode($optn,[$cop],undef,$npos,$npos+$len,(\my@ctrlist),$larr,$buf,); +$nstash->{$cop->[cVAR]}=&{$ctr}(@ctrlist); +$pos=$npos+$len+$indef; +redo CHOICELOOP if$seqof&&$pos<$end; +next OP;}}if($pos<$end&&$extensions){$pos=$npos+$len+$indef; +redo CHOICELOOP if$seqof&&$pos<$end; +next OP;}}die"decode error" unless$op->[cEXT];}elsif($op->[cTYPE]==opEXTENSIONS){$pos=$end;}else{die"this point should never be reached";}}}}die"decode error $pos $end" unless$pos==$end;}sub _dec_boolean{$_[3]=unpack("C",substr($_[4],$_[5],1))?1:0; +1;}sub _dec_integer{my$buf=substr($_[4],$_[5],$_[6]); +my$tmp=unpack("C",$buf)&0x80?pack("C",255):pack("C",0); +if($_[6]>4){$_[3]=os2ip($buf,$_[0]->{decode_bigint}||'Math::BigInt');}else{$_[3]=unpack("l",pack("l",unpack("N",$tmp x(4-$_[6]).$buf)));}1;}sub _dec_bitstring{$_[3]=[substr($_[4],$_[5]+1,$_[6]-1),($_[6]-1)*8-unpack("C",substr($_[4],$_[5],1))]; +1;}sub _dec_string{$_[3]=substr($_[4],$_[5],$_[6]); +1;}sub _dec_null{$_[3]=exists($_[0]->{decode_null})?$_[0]->{decode_null}:1; +1;}sub _dec_object_id{my@data=unpack("w*",substr($_[4],$_[5],$_[6])); +if($_[1]->[cTYPE]==opOBJID and@data>1){if($data[0]<40){splice(@data,0,1,0,$data[0]);}elsif($data[0]<80){splice(@data,0,1,1,$data[0]-40);}else{splice(@data,0,1,2,$data[0]-80);}}$_[3]=join(".",@data); +1;}my@_dec_real_base=(2,8,16); +sub _dec_real{$_[3]=0.0,return unless$_[6]; +my$first=unpack("C",substr($_[4],$_[5],1)); +if($first&0x80){require POSIX; +my$exp; +my$expLen=$first&0x3; +my$estart=$_[5]+1; +if($expLen==3){$estart++; +$expLen=unpack("C",substr($_[4],$_[5]+1,1));}else{$expLen++;}_dec_integer(undef,undef,undef,$exp,$_[4],$estart,$expLen); +my$mant=0.0; +for(reverse unpack("C*",substr($_[4],$estart+$expLen,$_[6]-1-$expLen))){$exp+=8,$mant=(($mant+$_)/256);}$mant*=1 <<(($first>>2)&0x3); +$mant=-$mant if$first&0x40; +$_[3]=$mant*POSIX::pow($_dec_real_base[($first>>4)&0x3],$exp); +return;}elsif($first&0x40){$_[3]=POSIX::HUGE_VAL(),return if$first==0x40; +$_[3]=-POSIX::HUGE_VAL(),return if$first==0x41;}elsif(substr($_[4],$_[5],$_[6])=~/^.([-+]?)0*(\d+(?:\.\d+(?:[Ee][-+]?\d+)?)?)$/s){$_[3]=eval"$1$2"; +return;}die"REAL decode error\n";}sub _dec_explicit{local$_[1]->[cCHILD]->[0]->[cVAR]=$_[1]->[cVAR]unless$_[1]->[cCHILD]->[0]->[cVAR]; +_decode($_[0],$_[1]->[cCHILD],$_[2],$_[5],$_[5]+$_[6],undef,$_[7],$_[4],); +1;}sub _dec_sequence{if(defined(my$ch=$_[1]->[cCHILD])){_decode($_[0],$ch,(defined($_[3])||$_[1]->[cLOOP])?$_[2]:($_[3]={}),$_[5],$_[5]+$_[6],$_[1]->[cLOOP]&&($_[3]=[]),$_[7],$_[4],);}else{$_[3]=substr($_[4],$_[5],$_[6]);}1;}sub _dec_set{my$ch=$_[1]->[cCHILD]; +goto&_dec_sequence if$_[1]->[cLOOP]or!defined($ch); +my($optn,$pos,$larr)=@_[0,5,7]; +my$stash=defined($_[3])?$_[2]:($_[3]={}); +my$end=$pos+$_[6]; +my@done; +my$extensions; +while($pos<$end){my($tag,$len,$npos,$indef)=_decode_tl($_[4],$pos,$end,$larr)or die"decode error"; +my($idx,$any,$done)=(-1); +SET_OP: +foreach my $op(@$ch){$idx++; +if(length($op->[cTAG])){if($tag eq$op->[cTAG]){my$var=$op->[cVAR]; +&{$decode[$op->[cTYPE]]}($optn,$op,$stash,(defined($var)?$stash->{$var}:1),$_[4],$npos,$len,$larr,); +$done=$idx; +last SET_OP;}if($tag eq($op->[cTAG]|pack("C",ASN_CONSTRUCTOR))and my$ctr=$ctr[$op->[cTYPE]]){_decode($optn,[$op],undef,$npos,$npos+$len,(\my@ctrlist),$larr,$_[4],); +$stash->{$op->[cVAR]}=&{$ctr}(@ctrlist)if defined$op->[cVAR]; +$done=$idx; +last SET_OP;}next SET_OP;}elsif($op->[cTYPE]==opANY){$any=$idx;}elsif($op->[cTYPE]==opCHOICE){my$var=$op->[cVAR]; +foreach my $cop(@{$op->[cCHILD]}){if($tag eq$cop->[cTAG]){my$nstash=defined($var)?($stash->{$var}={}):$stash; +&{$decode[$cop->[cTYPE]]}($optn,$cop,$nstash,$nstash->{$cop->[cVAR]},$_[4],$npos,$len,$larr,); +$done=$idx; +last SET_OP;}if($tag eq($cop->[cTAG]|pack("C",ASN_CONSTRUCTOR))and my$ctr=$ctr[$cop->[cTYPE]]){my$nstash=defined($var)?($stash->{$var}={}):$stash; +_decode($optn,[$cop],undef,$npos,$npos+$len,(\my@ctrlist),$larr,$_[4],); +$nstash->{$cop->[cVAR]}=&{$ctr}(@ctrlist); +$done=$idx; +last SET_OP;}}}elsif($op->[cTYPE]==opEXTENSIONS){$extensions=$idx;}else{die"internal error";}}if(!defined($done)and defined($any)){my$var=$ch->[$any]->[cVAR]; +$stash->{$var}=substr($_[4],$pos,$len+$npos-$pos)if defined$var; +$done=$any;}if(!defined($done)&&defined($extensions)){$done=$extensions;}die"decode error" if!defined($done)or$done[$done]++; +$pos=$npos+$len+$indef;}die"decode error" unless$end==$pos; +foreach my $idx(0..$#{$ch}){die"decode error" unless$done[$idx]or$ch->[$idx]->[cEXT]or$ch->[$idx]->[cTYPE]==opEXTENSIONS;}1;}my%_dec_time_opt=(unixtime=>0,withzone=>1,raw=>2); +sub _dec_time{my$mode=$_dec_time_opt{$_[0]->{'decode_time'}||''}||0; +if($mode==2 or$_[6]==0){$_[3]=substr($_[4],$_[5],$_[6]); +return;}my@bits=(substr($_[4],$_[5],$_[6])=~/^((?:\d\d)?\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)((?:\.\d{1,3})?)(([-+])(\d\d)(\d\d)|Z)/)or die"bad time format"; +if($bits[0]<100){$bits[0]+=100 if$bits[0]<50;}else{$bits[0]-=1900;}$bits[1]-=1; +require Time::Local; +my$time=Time::Local::timegm(@bits[5,4,3,2,1,0]); +$time+=$bits[6]if length$bits[6]; +my$offset=0; +if($bits[7]ne 'Z'){$offset=$bits[9]*3600+$bits[10]*60; +$offset=-$offset if$bits[8]eq '-'; +$time-=$offset;}$_[3]=$mode?[$time,$offset]:$time;}sub _dec_utf8{BEGIN{unless(CHECK_UTF8){local$SIG{__DIE__}; +eval{require bytes}and 'bytes'->unimport; +eval{require utf8}and 'utf8'->import;}}if(CHECK_UTF8){$_[3]=Encode::decode('utf8',substr($_[4],$_[5],$_[6]));}else{$_[3]=(substr($_[4],$_[5],$_[6])=~/(.*)/s)[0];}1;}sub _decode_tl{my($pos,$end,$larr)=@_[1,2,3]; +return if$pos>=$end; +my$indef=0; +my$tag=substr($_[0],$pos++,1); +if((unpack("C",$tag)&0x1f)==0x1f){my$b; +my$n=1; +do{return if$pos>=$end; +$tag.=substr($_[0],$pos++,1); +$b=ord substr($tag,-1);}while($b&0x80);}return if$pos>=$end; +my$len=ord substr($_[0],$pos++,1); +if($len&0x80){$len&=0x7f; +if($len){return if$pos+$len>$end; +my$padding=$len<4?"\0" x(4-$len):""; +($len,$pos)=(unpack("N",$padding.substr($_[0],$pos,$len)),$pos+$len);}else{unless(exists$larr->{$pos}){_scan_indef($_[0],$pos,$end,$larr)or return;}$indef=2; +$len=$larr->{$pos};}}return if$pos+$len+$indef>$end; +($tag,$len,$pos,$indef);}sub _scan_indef{my($pos,$end,$larr)=@_[1,2,3]; +my@depth=($pos); +while(@depth){return if$pos+2>$end; +if(substr($_[0],$pos,2)eq"\0\0"){my$end=$pos; +my$stref=shift@depth; +$larr->{$stref}=$end-$stref; +$pos+=2; +next;}my$tag=substr($_[0],$pos++,1); +if((unpack("C",$tag)&0x1f)==0x1f){my$b; +do{$tag.=substr($_[0],$pos++,1); +$b=ord substr($tag,-1);}while($b&0x80);}return if$pos>=$end; +my$len=ord substr($_[0],$pos++,1); +if($len&0x80){if($len&=0x7f){return if$pos+$len>$end; +my$padding=$len<4?"\0" x(4-$len):""; +$pos+=$len+unpack("N",$padding.substr($_[0],$pos,$len));}else{unshift@depth,$pos;}}else{$pos+=$len;}}1;}sub _ctr_string{join '',@_}sub _ctr_bitstring{[join('',map{$_->[0]}@_),$_[-1]->[1]]}sub _dec_bcd{($_[3]=unpack("H*",substr($_[4],$_[5],$_[6])))=~s/[fF]$//; +1;}use Socket; +BEGIN{local$SIG{__DIE__}; +eval{require bytes}and 'bytes'->import;}sub asn_recv{my$peer; +my$buf; +my$n=128; +my$pos=0; +my$depth=0; +my$len=0; +my($tmp,$tb,$lb); +MORE: +for($peer=recv($_[0],$buf,$n,MSG_PEEK);defined$peer;$peer=recv($_[0],$buf,$n <<=1,MSG_PEEK)){if($depth){unless(2+$pos<=length$buf){next MORE if$n==length$buf; +last MORE;}if(substr($buf,$pos,2)eq"\0\0"){unless(--$depth){$len=$pos+2; +last MORE;}}}($tb,$tmp)=asn_decode_tag(substr($buf,$pos)); +unless($tb||$pos+$tblength$buf){goto error unless defined($peer=recv($_[0],$buf,$len,MSG_PEEK)); +if($len>length$buf){$_[1]=''; +return$peer;}}elsif($len==0){$_[1]=''; +return$peer;}if($_[2]& MSG_PEEK){$_[1]=substr($buf,0,$len);}elsif(!defined($peer=recv($_[0],$_[1],$len,0))){goto error;}return$peer;}error: +$_[1]=undef;}sub asn_read{if($_[2]){if($_[2]>length$_[1]){require Carp; +Carp::carp("Offset beyond end of buffer"); +return;}substr($_[1],$_[2])='';}else{$_[1]='';}my$pos=0; +my$need=0; +my$depth=0; +my$ch; +my$n; +my$e; +while(1){$need=($pos+($depth*2))||2; +while(($n=$need-length$_[1])>0){$e=sysread($_[0],$_[1],$n,length$_[1])or goto READ_ERR;}my$tch=unpack("C",substr($_[1],$pos++,1)); +if(($tch&0x1f)==0x1f){my$ch; +do{$need++; +while(($n=$need-length$_[1])>0){$e=sysread($_[0],$_[1],$n,length$_[1])or goto READ_ERR;}$ch=unpack("C",substr($_[1],$pos++,1));}while($ch&0x80);}$need=$pos+1; +while(($n=$need-length$_[1])>0){$e=sysread($_[0],$_[1],$n,length$_[1])or goto READ_ERR;}my$len=unpack("C",substr($_[1],$pos++,1)); +if($len&0x80){unless($len&=0x7f){$depth++; +next;}$need=$pos+$len; +while(($n=$need-length$_[1])>0){$e=sysread($_[0],$_[1],$n,length$_[1])or goto READ_ERR;}$pos+=$len+unpack("N","\0" x(4-$len).substr($_[1],$pos,$len));}elsif(!$len&&!$tch){die"Bad ASN PDU" unless$depth; +unless(--$depth){last;}}else{$pos+=$len;}last unless$depth;}while(($n=$pos-length$_[1])>0){$e=sysread($_[0],$_[1],$n,length$_[1])or goto READ_ERR;}return length$_[1]; +READ_ERR: +$@=defined($e)?"Unexpected EOF":"I/O Error $!"; +return undef;}sub asn_send{@_==4?send($_[0],$_[1],$_[2],$_[3]):send($_[0],$_[1],$_[2]);}sub asn_write{syswrite($_[0],$_[1],length$_[1]);}sub asn_get{my$fh=ref($_[0])?$_[0]:\($_[0]); +my$href=\%{*$fh}; +$href->{'asn_buffer'}='' unless exists$href->{'asn_buffer'}; +my$need=delete$href->{'asn_need'}||0; +while(1){next if$need; +my($tb,$tag)=asn_decode_tag($href->{'asn_buffer'})or next; +my($lb,$len)=asn_decode_length(substr($href->{'asn_buffer'},$tb,8))or next; +$need=$tb+$lb+$len;}continue{if($need&&$need<=length$href->{'asn_buffer'}){my$ret=substr($href->{'asn_buffer'},0,$need); +substr($href->{'asn_buffer'},0,$need)=''; +return$ret;}my$get=$need>1024?$need:1024; +sysread($_[0],$href->{'asn_buffer'},$get,length$href->{'asn_buffer'})or return undef;}}sub asn_ready{my$fh=ref($_[0])?$_[0]:\($_[0]); +my$href=\%{*$fh}; +return 0 unless exists$href->{'asn_buffer'}; +return$href->{'asn_need'}<=length$href->{'asn_buffer'}if exists$href->{'asn_need'}; +my($tb,$tag)=asn_decode_tag($href->{'asn_buffer'})or return 0; +my($lb,$len)=asn_decode_length(substr($href->{'asn_buffer'},$tb,8))or return 0; +$href->{'asn_need'}=$tb+$lb+$len; +$href->{'asn_need'}<=length$href->{'asn_buffer'};}package Crypt::Format; +use strict; +use warnings; +our$VERSION='0.09'; +our$BASE64_MODULE='MIME::Base64'; +sub der2pem{my($der_r,$whatsit)=(\$_[0],$_[1]); +die"Missing object type!" if!$whatsit; +my$pem=_do_base64('encode',$$der_r); +my$line_sep=substr($pem,-1); +substr($pem,0,0,"-----BEGIN $whatsit-----$line_sep"); +substr($pem,length($pem),0,"-----END $whatsit-----"); +return$pem;}sub pem2der{my($pem)=@_; +chomp$pem; +$pem=~s<.+?[\x0d\x0a]+><>s; +$pem=~s<[\x0d\x0a]+[^\x0d\x0a]+?\z><>s; +$pem=~s<\s?-{5}(?:BEGIN|END)\s[A-Z\s]+-{5}\s?><>s; +return _do_base64('decode',$pem);}sub _do_base64{my$path="$BASE64_MODULE.pm"; +$path=~s<::>g; +_load_module($BASE64_MODULE)if!$INC{$path}; +my$cr=$BASE64_MODULE->can(shift); +return$cr->(@_);}sub _load_module{local$@; +eval"use $_[0]; 1" or die; +return$_[0];}sub normalize_pem{my($pem)=@_; +$pem=~m or die"Invalid PEM: $pem"; +return der2pem(pem2der($pem),$1);}package Crypt::Perl::ASN1; +use strict; +use warnings; +BEGIN{our@ISA='Convert::ASN1';}Crypt::Perl::BigInt->import(); +Crypt::Perl::X->import(); +sub new{my($class,@opts)=@_; +return$class->SUPER::new(encode=>{bigint=>'Crypt::Perl::BigInt'},decode=>{bigint=>'Crypt::Perl::BigInt'},@opts,);}sub prepare{my($self,$asn1_r)=($_[0],\$_[1]); +my$ret=$self->SUPER::prepare($$asn1_r); +if(!defined$ret){die Crypt::Perl::X::create('ASN1::Prepare',$$asn1_r,$self->{error});}return$ret;}sub find{my($self,$macro)=@_; +return$self->SUPER::find($macro)||do{die Crypt::Perl::X::create('ASN1::Find',$macro,$self->{error});};}sub encode{my($self)=shift; +return$self->SUPER::encode(@_)||do{die Crypt::Perl::X::create('ASN1::Encode',\@_,$self->{error});};}sub decode{my($self)=shift; +return$self->SUPER::decode($_[0])||do{die Crypt::Perl::X::create('ASN1::Decode',$_[0],$self->{error});};}my$_asn1_null; +sub NULL{return$_asn1_null||=Crypt::Perl::ASN1->new()->prepare('n NULL')->encode({n=>0});}1; +package Crypt::Perl::BigInt; +use strict; +use warnings; +Math::BigInt->import(try=>'GMP'); +BEGIN{our@ISA='Math::BigInt';}BEGIN{*from_bytes=\&_pp_from_bytes; +*as_bytes=\&_pp_as_bytes; +$@=q<>;}Crypt::Perl::X->import(); +sub _pp_from_bytes{my$class=shift; +return$class->from_hex(unpack 'H*',$_[0]);}sub _pp_as_bytes{my($self)=@_; +die Crypt::Perl::X::create('Generic',"Negatives ($self) can\'t convert to bytes!")if$self<0; +my$hex=$self->as_hex(); +if(length($hex)%2){substr($hex,1,1)=q<>;}else{substr($hex,0,2)=q<>;}return pack 'H*',$hex;}sub bit_length{my($self)=@_; +return(length($self->as_bin())-2);}sub test_bit{my($self,$bit_from_least)=@_; +my$bstr=substr($self->as_bin(),2); +return 0 if$bit_from_least>=length($bstr); +return substr($bstr,-$bit_from_least-1,1);}1; +package Crypt::Perl::KeyBase; +use strict; +use warnings; +Crypt::Perl::X->import(); +sub get_jwk_thumbprint{my($self,$hash_alg)=@_; +die Crypt::Perl::X::create('Generic','Need a hashing algorithm!')if!length$hash_alg; +require Digest::SHA; +my$hash_cr=($hash_alg=~m<\Asha[0-9]+\z>) && Digest::SHA->can($hash_alg)or do{die Crypt::Perl::X::create('UnknownHash',$hash_alg);}; +my$jwk=$self->get_struct_for_public_jwk(); +my$json=sprintf('{'.join(',',map{qq{"$_":"%s"}}$self->_JWK_THUMBPRINT_JSON_ORDER()).'}',@{$jwk}{$self->_JWK_THUMBPRINT_JSON_ORDER()},); +require MIME::Base64; +return MIME::Base64::encode_base64url($hash_cr->($json));}1; +package Crypt::Perl::PKCS8; +use strict; +use warnings; +Crypt::Perl::ASN1->import(); +use constant ASN1=> <find('PrivateKeyInfo')->decode($pem_or_der);}sub parse_public{my($pem_or_der)=@_; +return _asn1()->find('SubjectPublicKeyInfo')->decode($pem_or_der);}sub _asn1{return Crypt::Perl::ASN1->new()->prepare(Crypt::Perl::PKCS8::ASN1());}1; +package Crypt::Perl::RNG; +use strict; +use warnings; +use Bytes::Random::Secure::Tiny; +my%PID_RNG; +sub _get{return$PID_RNG{$$}||=Bytes::Random::Secure::Tiny->new();}sub bytes{return _get()->bytes(@_);}sub bytes_hex{return _get()->bytes_hex(@_);}sub bit_string{my($count)=@_; +return _get()->string_from('01',$count);}1; +package Crypt::Perl::RSA::KeyBase; +use strict; +use warnings; +use base ('Class::Accessor','Crypt::Perl::KeyBase'); +Module::Load->import(); +Crypt::Perl::BigInt->import(); +Crypt::Perl::X->import(); +BEGIN{__PACKAGE__->mk_ro_accessors('modulus'); +__PACKAGE__->mk_ro_accessors('publicExponent'); +*N=\&modulus; +*E=\&publicExponent;}use constant _JWK_THUMBPRINT_JSON_ORDER=>qw(e kty n); +sub new{my($class,@args)=@_; +my$self=$class->SUPER::new(@args); +$self->{'publicExponent'}=Crypt::Perl::BigInt->new($self->{'publicExponent'}); +return$self;}sub to_pem{my($self)=@_; +require Crypt::Format; +return Crypt::Format::der2pem($self->to_der(),$self->_PEM_HEADER());}sub size{my($self)=@_; +return length($self->modulus()->as_bin())-2;}sub modulus_byte_length{my($self)=@_; +return length$self->N()->as_bytes();}sub verify_RS256{my($self,$msg,$sig)=@_; +return$self->_verify($msg,$sig,'Digest::SHA','sha256','PKCS1_v1_5');}sub verify_RS384{my($self,$msg,$sig)=@_; +return$self->_verify($msg,$sig,'Digest::SHA','sha384','PKCS1_v1_5');}sub verify_RS512{my($self,$msg,$sig)=@_; +return$self->_verify($msg,$sig,'Digest::SHA','sha512','PKCS1_v1_5');}sub encrypt_raw{my($self,$bytes)=@_; +return Crypt::Perl::BigInt->from_bytes($bytes)->bmodpow($self->{'publicExponent'},$self->{'modulus'})->as_bytes();}sub to_der{my($self)=@_; +return$self->_to_der($self->_ASN1_MACRO());}sub algorithm_identifier{my($self)=@_; +return{algorithm=>OID_rsaEncryption(),parameters=>Crypt::Perl::ASN1::NULL(),};}use constant OID_rsaEncryption=>'1.2.840.113549.1.1.1'; +sub _to_subject_public_der{my($self)=@_; +my$asn1=$self->_asn1_find('SubjectPublicKeyInfo'); +return$asn1->encode({algorithm=>$self->algorithm_identifier(),subjectPublicKey=>$self->_to_der('RSAPublicKey'),});}sub get_struct_for_public_jwk{my($self)=@_; +require MIME::Base64; +return{kty=>'RSA',n=>MIME::Base64::encode_base64url($self->N()->as_bytes()),e=>MIME::Base64::encode_base64url($self->E()->as_bytes()),};}sub _asn1_find{my($self,$macro)=@_; +require Crypt::Perl::ASN1; +require Crypt::Perl::RSA::Template; +my$asn1=Crypt::Perl::ASN1->new()->prepare(Crypt::Perl::RSA::Template::get_template('INTEGER'),); +return$asn1->find($macro);}sub _to_der{my($self,$macro)=@_; +return$self->_asn1_find($macro)->encode({%$self});}sub _verify{my($self,$message,$signature,$hash_module,$hasher,$scheme)=@_; +Module::Load::load($hash_module); +my$digest=$hash_module->can($hasher)->($message); +my$y=Crypt::Perl::BigInt->from_hex(unpack 'H*',$signature); +my$x=$y->bmodpow($self->E(),$self->N()); +my$octets="\0".$x->as_bytes(); +if($scheme eq 'PKCS1_v1_5'){my$key_bytes_length=$self->modulus_byte_length(); +if(length($octets)!=$key_bytes_length){my$err=sprintf("Invalid PKCS1_v1_5 length: %d (should be %d)",length($octets),$key_bytes_length); +die Crypt::Perl::X::create('Generic',$err);}Crypt::Perl::RSA::PKCS1_v1_5->import(); +return$digest eq Crypt::Perl::RSA::PKCS1_v1_5::decode($octets,$hasher);}die Crypt::Perl::X::create('Generic',"Unknown signature scheme: \"$scheme\"");}1; +package Crypt::Perl::RSA::Parse; +use strict; +use warnings; +use Try::Tiny; +Crypt::Format->import(); +Crypt::Perl::ASN1->import(); +Crypt::Perl::RSA::Template->import(); +Crypt::Perl::X->import(); +sub _asn1{return Crypt::Perl::ASN1->new()->prepare(Crypt::Perl::RSA::Template::get_template('INTEGER'),);}sub private{my($pem_or_der)=@_; +_ensure_der($pem_or_der); +my$key_obj; +try{my$parsed=_decode_rsa($pem_or_der); +$key_obj=_new_private($parsed);}catch{my$rsa_err=$_; +try{$key_obj=private_pkcs8($pem_or_der);}catch{die Crypt::Perl::X::create('Generic',"Failed to parse as either RSA ($rsa_err) or PKCS8 ($_)");};}; +return$key_obj;}sub private_pkcs8{my($pem_or_der)=@_; +_ensure_der($pem_or_der); +my$pkcs8=_decode_pkcs8($pem_or_der); +my$parsed=_decode_rsa_within_pkcs8_or_die($pkcs8); +return _new_private($parsed);}sub public{my($pem_or_der)=@_; +_ensure_der($pem_or_der); +my$key_obj; +try{my$parsed=_decode_rsa_public($pem_or_der); +$key_obj=_new_public($parsed);}catch{my$rsa_err=$_; +try{$key_obj=public_SPKI($pem_or_der);}catch{die Crypt::Perl::X::create('Generic',"Failed to parse as either RSA ($rsa_err) or SubjectPublicKeyInfo ($_)");};}; +return$key_obj;}sub public_SPKI{my($pem_or_der)=@_; +_ensure_der($pem_or_der); +my$spki=_decode_spki($pem_or_der); +my$parsed=_decode_rsa_public_within_spki_or_die($spki); +return _new_public($parsed);}my%JTK_TO_NEW=qw( + n modulus + e publicExponent + d privateExponent + p prime1 + q prime2 + dp exponent1 + dq exponent2 + qi coefficient +); +sub jwk{my($hr)=@_; +my%constr_args; +require Crypt::Perl::JWK; +for my $k(keys%$hr){next if!$JTK_TO_NEW{$k}; +$constr_args{$JTK_TO_NEW{$k}}=Crypt::Perl::JWK::jwk_num_to_bigint($hr->{$k});}if($hr->{'d'}){$constr_args{'version'}=0; +require Crypt::Perl::RSA::PrivateKey; +return Crypt::Perl::RSA::PrivateKey->new(\%constr_args);}require Crypt::Perl::RSA::PublicKey; +return Crypt::Perl::RSA::PublicKey->new(\%constr_args);}sub _decode_macro{my($der_r,$macro)=(\$_[0],$_[1]); +my$parser=_asn1()->find($macro); +return$parser->decode($$der_r);}sub _decode_rsa{my($der_r)=(\$_[0]); +return _decode_macro($$der_r,'RSAPrivateKey');}sub _decode_rsa_public{my($der_r)=(\$_[0]); +return _decode_macro($$der_r,'RSAPublicKey');}sub _decode_rsa_within_pkcs8_or_die{my($pkcs8_hr)=@_; +my$dec; +try{$dec=_decode_rsa($pkcs8_hr->{'privateKey'});}catch{die Crypt::Perl::X::create('Generic',"Failed to parse RSA within PKCS8: $_");}; +return$dec;}sub _decode_rsa_public_within_spki_or_die{my($spki_hr)=@_; +my$dec; +try{$dec=_decode_rsa_public($spki_hr->{'subjectPublicKey'}->[0]);}catch{die Crypt::Perl::X::create('Generic',"Failed to parse RSA within SubjectPublicKeyInfo: $_");}; +return$dec;}sub _decode_pkcs8{my($der_r)=(\$_[0]); +return _decode_macro($$der_r,'PrivateKeyInfo');}sub _decode_spki{my($der_r)=(\$_[0]); +return _decode_macro($$der_r,'SubjectPublicKeyInfo');}sub _new_public{my($parsed_hr)=@_; +require Crypt::Perl::RSA::PublicKey; +return Crypt::Perl::RSA::PublicKey->new($parsed_hr);}sub _new_private{my($parsed_hr)=@_; +Crypt::Perl::RSA::PrivateKey->import()unless$Crypt::Perl::RSA::PrivateKey::VERSION; +return Crypt::Perl::RSA::PrivateKey->new($parsed_hr);}sub _pem_to_der{$_[0]=Crypt::Format::pem2der(@_); +return;}sub _ensure_der{my($pem_or_der_r)=\$_[0]; +if($$pem_or_der_r=~m<\A->){_pem_to_der($$pem_or_der_r);}return;}1; +package Crypt::Perl::RSA::PKCS1_v1_5; +use strict; +use warnings; +Crypt::Perl::X->import(); +use constant DER_header_md2=>"\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02\x05\x00\x04\x10"; +use constant DER_header_md5=>"\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10"; +use constant DER_header_sha1=>"\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"; +use constant DER_header_sha256=>"\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20"; +use constant DER_header_sha384=>"\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30"; +use constant DER_header_sha512=>"\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40"; +sub encode{my($digest,$digest_oid,$emLen)=@_; +my$encoded=_asn1_DigestInfo($digest,$digest_oid); +if($emLenx or do{my$err=sprintf"Invalid EMSA-PKCS1-v1_5/$digest_oid: %v02x",$octets; +die Crypt::Perl::X::create('Generic',$err);}; +return substr($octets,$+[0]);}sub _get_der_header{my($oid)=@_; +return __PACKAGE__->can("DER_header_$oid")->();}sub _asn1_DigestInfo{my($digest,$oid)=@_; +return _get_der_header($oid).$digest;}1; +package Crypt::Perl::RSA::PrivateKey; +use strict; +use warnings; +BEGIN{our@ISA='Crypt::Perl::RSA::KeyBase';}Module::Load->import(); +Crypt::Perl::RNG->import(); +Crypt::Perl::X->import(); +use constant _PEM_HEADER=>'RSA PRIVATE KEY'; +use constant _ASN1_MACRO=>'RSAPrivateKey'; +BEGIN{__PACKAGE__->mk_ro_accessors(qw( + version + publicExponent + privateExponent + prime1 + prime2 + exponent1 + exponent2 + coefficient + )); +*E=\&publicExponent; +*D=\&privateExponent; +*P=\&prime1; +*Q=\&prime2; +*DP=\&exponent1; +*DQ=\&exponent2; +*QINV=\&coefficient; +*to_subject_public_der=__PACKAGE__->can('_to_subject_public_der');}sub sign_RS1{my($self,$msg)=@_; +return$self->_sign($msg,'Digest::SHA','sha1','PKCS1_v1_5');}sub sign_RS256{my($self,$msg)=@_; +return$self->_sign($msg,'Digest::SHA','sha256','PKCS1_v1_5');}sub sign_RS384{my($self,$msg)=@_; +return$self->_sign($msg,'Digest::SHA','sha384','PKCS1_v1_5');}sub sign_RS512{my($self,$msg)=@_; +return$self->_sign($msg,'Digest::SHA','sha512','PKCS1_v1_5');}sub get_public_key{my($self)=@_; +require Crypt::Perl::RSA::PublicKey; +return Crypt::Perl::RSA::PublicKey->new({modulus=>$self->{'modulus'},publicExponent=>$self->{'publicExponent'},});}sub get_struct_for_private_jwk{my($self)=@_; +require MIME::Base64; +my$jwk=$self->get_struct_for_public_jwk(); +my%augment=qw( + d D + p P + q Q + dp DP + dq DQ + qi QINV +); +for my $k(keys%augment){my$accessor=$augment{$k}; +$jwk->{$k}=MIME::Base64::encode_base64url($self->$accessor()->as_bytes());}return$jwk;}sub decrypt_raw{my($self,$x)=@_; +$x=Crypt::Perl::BigInt->from_bytes($x); +my$p=$self->P(); +my$q=$self->Q(); +my$p1=$p->copy()->bdec(); +my$q1=$q->copy()->bdec(); +my$xp=$x->copy()->bmod($p)->bmodpow($self->D()->copy()->bmod($p1),$p); +my$xq=$x->copy()->bmod($q)->bmodpow($self->D()->copy()->bmod($q1),$q); +my$diff=$xp->bsub($xq)->babs()->bmod($p)->bsub($p)->babs(); +$diff->bmul($self->QINV())->bmod($p)->bmuladd($q,$xq)->as_bytes();}sub _sign{my($self,$msg,$hash_module,$hasher,$scheme)=@_; +require Digest::SHA; +my$dgst=$hash_module->can($hasher)->($msg); +my$sig; +if($scheme eq 'PKCS1_v1_5'){Crypt::Perl::RSA::PKCS1_v1_5->import(); +my$sig_length=$self->modulus_byte_length(); +my$eb=Crypt::Perl::RSA::PKCS1_v1_5::encode($dgst,$hasher,$sig_length,); +my$x=Crypt::Perl::BigInt->from_hex(unpack 'H*',$eb); +$sig=$self->_transform($x)->as_bytes(); +substr($sig,0,0)="\0" x($sig_length-length$sig);}else{die Crypt::Perl::X::create('Generic',"Unknown RSA signature scheme: \"$scheme\"");}return$sig;}sub _transform{my($self,$x)=@_; +my$key_bytes_length=$self->modulus_byte_length(); +my$r; +do{$r=Crypt::Perl::BigInt->from_hex(Crypt::Perl::RNG::bytes_hex($key_bytes_length),);}while($r->bge($self->N()))||($r->bgcd($self->N())->bne(1)); +$x->bmul($r->copy()->bmodpow($self->E(),$self->N()))->bmod($self->N()); +my$xp=$x->copy()->bmod($self->P())->bmodpow($self->DP(),$self->P()); +my$xq=$x->copy()->bmod($self->Q())->bmodpow($self->DQ(),$self->Q()); +$xp->badd($self->P())while$xp->blt($xq); +my$y=$xp->bsub($xq)->bmul($self->QINV())->bmod($self->P()); +$y->bmuladd($self->Q(),$xq); +$y->bmul($r->bmodinv($self->N())); +$y->bmod($self->N()); +return$y;}1; +package Crypt::Perl::RSA::Template; +use strict; +use warnings; +Crypt::Perl::PKCS8->import(); +my$ASN1_TEMPLATE=q< + + FG_FAUX_INTEGER ::= + + RSAPublicKey ::= SEQUENCE { + modulus FG_FAUX_INTEGER, -- n + publicExponent FG_FAUX_INTEGER -- e + } + + -- FG: simplified from RFC for Convert::ASN1 + Version ::= INTEGER + + OtherPrimeInfo ::= SEQUENCE { + prime FG_FAUX_INTEGER, -- ri + exponent FG_FAUX_INTEGER, -- di + coefficient FG_FAUX_INTEGER -- ti + } + + -- FG: simplified from RFC for Convert::ASN1 + OtherPrimeInfos ::= SEQUENCE OF OtherPrimeInfo + + RSAPrivateKey ::= SEQUENCE { + version Version, + modulus FG_FAUX_INTEGER, -- n + publicExponent INTEGER, -- e + privateExponent FG_FAUX_INTEGER, -- d + prime1 FG_FAUX_INTEGER, -- p + prime2 FG_FAUX_INTEGER, -- q + exponent1 FG_FAUX_INTEGER, -- d mod (p-1) + exponent2 FG_FAUX_INTEGER, -- d mod (q-1) + coefficient FG_FAUX_INTEGER, -- (inverse of q) mod p + otherPrimeInfos OtherPrimeInfos OPTIONAL + } +>.Crypt::Perl::PKCS8::ASN1(); +sub get_template{my($what_is_big_fat_int)=@_; +my$template=$ASN1_TEMPLATE; +$template=~s//$what_is_big_fat_int/; +return$template;}1; +package Crypt::Perl::X; +use strict; +use warnings; +Module::Load->import(); +sub create{my($type,@args)=@_; +my$x_package="Crypt::Perl::X::$type"; +Module::Load::load($x_package); +return$x_package->new(@args);}package Module::Load; +$VERSION='0.32'; +use strict; +use warnings; +use File::Spec (); +sub import{my$who=_who(); +my$h; +shift; +{no strict 'refs'; +@_ or(*{"${who}::load"}=\&load,*{"${who}::autoload"}=\&autoload,return); +map{$h->{$_}=()if defined$_}@_; +(exists$h->{none}or exists$h->{''})and shift,last; +((exists$h->{autoload}and shift,1)or(exists$h->{all}and shift))and*{"${who}::autoload"}=\&autoload; +((exists$h->{load}and shift,1)or exists$h->{all})and*{"${who}::load"}=\&load; +((exists$h->{load_remote}and shift,1)or exists$h->{all})and*{"${who}::load_remote"}=\&load_remote; +((exists$h->{autoload_remote}and shift,1)or exists$h->{all})and*{"${who}::autoload_remote"}=\&autoload_remote;}}sub load (*;@){goto&_load;}sub autoload (*;@){unshift@_,'autoimport'; +goto&_load;}sub load_remote ($$;@){my($dst,$src,@exp)=@_; +eval"package $dst;Module::Load::load('$src', qw/@exp/);"; +$@&&die"$@";}sub autoload_remote ($$;@){my($dst,$src,@exp)=@_; +eval"package $dst;Module::Load::autoload('$src', qw/@exp/);"; +$@&&die"$@";}sub _load{my$autoimport=$_[0]eq 'autoimport' and shift; +my$mod=shift or return; +my$who=_who(); +if(_is_file($mod)){require$mod;}else{LOAD:{my$err; +for my $flag(qw[1 0]){eval{if($flag){$mod->import()}else{require$mod;$mod->import()}}; +$@?$err.=$@:last LOAD;}die$err if$err;}}{no strict 'refs'; +my$import; +((@_ or$autoimport)and($import=$mod->can('import'))and(unshift(@_,$mod),goto&$import,return));}}sub _to_file{local$_=shift; +my$pm=shift||''; +my@parts=split/::|'/,$_,-1; +shift@parts if@parts&&!$parts[0]; +my$file=$^O eq 'MSWin32'?join"/",@parts:File::Spec->catfile(@parts); +$file.='.pm' if$pm; +$file=VMS::Filespec::unixify($file)if$^O eq 'VMS'; +return$file;}sub _who{(caller(1))[0]}sub _is_file{local$_=shift; +return/^\./?1:/[^\w:']/?1:undef;}package Crypt::Perl::X::Generic; +use strict; +use warnings; +our@ISA=qw(Crypt::Perl::X::Base); +package Crypt::Perl::X::Base; +use strict; +use warnings; +use Carp (); +sub new{my($class,$string,$props_hr)=@_; +$class->_check_overload(); +my%attrs=$props_hr?%$props_hr:(); +return bless[$string,\%attrs],$class;}sub get{my($self,$attr)=@_; +return$self->[1]->{$attr};}sub to_string{my($self)=@_; +return sprintf '%s: %s',ref($self),$self->[0];}my%_OVERLOADED; +sub _check_overload{my($class,$str)=@_; +my$eval_err=$@; +$_OVERLOADED{$class}||=eval qq{ + package $class; + use overload (q<""> => __PACKAGE__->can('__spew')); + 1; + }; +warn if!$_OVERLOADED{$class}; +$@=$eval_err; +return;}sub __spew{my($self)=@_; +my$spew=$self->to_string(); +if(substr($spew,-1)ne"\n"){$spew.=Carp::longmess();}return$spew;}package Convert::ASN1::parser; +{$Convert::ASN1::parser::VERSION='0.27';}use strict; +Convert::ASN1->import(':all'); +use vars qw( + $asn $yychar $yyerrflag $yynerrs $yyn @yyss + $yyssp $yystate @yyvs $yyvsp $yylval $yys $yym $yyval +); +BEGIN{Convert::ASN1->_internal_syms}my$yydebug=0; +my%yystate; +sub ASN_BOOLEAN (){0x01}sub ASN_INTEGER (){0x02}sub ASN_BIT_STR (){0x03}sub ASN_OCTET_STR (){0x04}sub ASN_NULL (){0x05}sub ASN_OBJECT_ID (){0x06}sub ASN_REAL (){0x09}sub ASN_ENUMERATED (){0x0A}sub ASN_RELATIVE_OID (){0x0D}sub ASN_SEQUENCE (){0x10}sub ASN_SET (){0x11}sub ASN_PRINT_STR (){0x13}sub ASN_IA5_STR (){0x16}sub ASN_UTC_TIME (){0x17}sub ASN_GENERAL_TIME (){0x18}sub ASN_UNIVERSAL (){0x00}sub ASN_APPLICATION (){0x40}sub ASN_CONTEXT (){0x80}sub ASN_PRIVATE (){0xC0}sub ASN_PRIMITIVE (){0x00}sub ASN_CONSTRUCTOR (){0x20}sub ASN_LONG_LEN (){0x80}sub ASN_EXTENSION_ID (){0x1F}sub ASN_BIT (){0x80}my%base_type=(BOOLEAN=>[asn_encode_tag(ASN_BOOLEAN),opBOOLEAN],INTEGER=>[asn_encode_tag(ASN_INTEGER),opINTEGER],BIT_STRING=>[asn_encode_tag(ASN_BIT_STR),opBITSTR],OCTET_STRING=>[asn_encode_tag(ASN_OCTET_STR),opSTRING],STRING=>[asn_encode_tag(ASN_OCTET_STR),opSTRING],NULL=>[asn_encode_tag(ASN_NULL),opNULL],OBJECT_IDENTIFIER=>[asn_encode_tag(ASN_OBJECT_ID),opOBJID],REAL=>[asn_encode_tag(ASN_REAL),opREAL],ENUMERATED=>[asn_encode_tag(ASN_ENUMERATED),opINTEGER],ENUM=>[asn_encode_tag(ASN_ENUMERATED),opINTEGER],'RELATIVE-OID'=>[asn_encode_tag(ASN_RELATIVE_OID),opROID],SEQUENCE=>[asn_encode_tag(ASN_SEQUENCE|ASN_CONSTRUCTOR),opSEQUENCE],EXPLICIT=>[asn_encode_tag(ASN_SEQUENCE|ASN_CONSTRUCTOR),opEXPLICIT],SET=>[asn_encode_tag(ASN_SET|ASN_CONSTRUCTOR),opSET],ObjectDescriptor=>[asn_encode_tag(ASN_UNIVERSAL|7),opSTRING],UTF8String=>[asn_encode_tag(ASN_UNIVERSAL|12),opUTF8],NumericString=>[asn_encode_tag(ASN_UNIVERSAL|18),opSTRING],PrintableString=>[asn_encode_tag(ASN_UNIVERSAL|19),opSTRING],TeletexString=>[asn_encode_tag(ASN_UNIVERSAL|20),opSTRING],T61String=>[asn_encode_tag(ASN_UNIVERSAL|20),opSTRING],VideotexString=>[asn_encode_tag(ASN_UNIVERSAL|21),opSTRING],IA5String=>[asn_encode_tag(ASN_UNIVERSAL|22),opSTRING],UTCTime=>[asn_encode_tag(ASN_UNIVERSAL|23),opUTIME],GeneralizedTime=>[asn_encode_tag(ASN_UNIVERSAL|24),opGTIME],GraphicString=>[asn_encode_tag(ASN_UNIVERSAL|25),opSTRING],VisibleString=>[asn_encode_tag(ASN_UNIVERSAL|26),opSTRING],ISO646String=>[asn_encode_tag(ASN_UNIVERSAL|26),opSTRING],GeneralString=>[asn_encode_tag(ASN_UNIVERSAL|27),opSTRING],CharacterString=>[asn_encode_tag(ASN_UNIVERSAL|28),opSTRING],UniversalString=>[asn_encode_tag(ASN_UNIVERSAL|28),opSTRING],BMPString=>[asn_encode_tag(ASN_UNIVERSAL|30),opSTRING],BCDString=>[asn_encode_tag(ASN_OCTET_STR),opBCD],CHOICE=>['',opCHOICE],ANY=>['',opANY],EXTENSION_MARKER=>['',opEXTENSIONS],); +my$tagdefault=1; +sub need_explicit{(defined($_[0])&&(defined($_[1])?$_[1]:$tagdefault));}sub explicit{my$op=shift; +my@seq=@$op; +@seq[cTYPE,cCHILD,cVAR,cLOOP]=('EXPLICIT',[$op],undef,undef); +@{$op}[cTAG,cOPT]=(); +\@seq;}sub constWORD (){1}sub constCLASS (){2}sub constSEQUENCE (){3}sub constSET (){4}sub constCHOICE (){5}sub constOF (){6}sub constIMPLICIT (){7}sub constEXPLICIT (){8}sub constOPTIONAL (){9}sub constLBRACE (){10}sub constRBRACE (){11}sub constCOMMA (){12}sub constANY (){13}sub constASSIGN (){14}sub constNUMBER (){15}sub constENUM (){16}sub constCOMPONENTS (){17}sub constPOSTRBRACE (){18}sub constDEFINED (){19}sub constBY (){20}sub constEXTENSION_MARKER (){21}sub constYYERRCODE (){256}my@yylhs=(-1,0,0,2,2,3,3,6,6,6,6,8,13,13,12,14,14,14,9,9,9,10,18,18,18,18,18,19,19,11,16,16,20,20,20,21,21,1,1,1,22,22,22,24,24,24,24,23,23,23,23,15,15,4,4,5,5,5,17,17,25,7,7,); +my@yylen=(2,1,1,3,4,4,1,1,1,1,1,3,1,1,6,1,1,1,4,4,4,4,1,1,1,2,1,0,3,1,1,2,1,3,3,4,1,0,1,2,1,3,3,2,1,1,1,4,1,3,1,0,1,0,1,0,1,1,1,3,2,0,1,); +my@yydefred=(0,0,54,0,50,0,1,0,0,48,0,40,0,0,0,0,57,56,0,0,0,3,0,6,0,11,0,0,0,0,49,0,41,42,0,22,0,0,0,0,46,44,0,45,0,29,47,4,0,0,0,0,7,8,9,10,0,25,0,52,43,0,0,0,0,36,0,0,32,62,5,0,0,0,58,0,18,19,0,20,0,0,28,60,21,0,0,0,34,33,59,0,0,17,15,16,0,35,14,); +my@yydgoto=(5,6,7,21,8,18,51,70,9,52,53,54,55,44,96,60,66,73,45,57,67,68,10,11,46,74,); +my@yysindex=(2,58,0,8,0,0,0,11,123,0,3,0,59,123,19,73,0,0,92,7,7,0,123,0,119,0,59,107,109,116,0,82,0,0,119,0,107,109,84,126,0,0,90,0,132,0,0,0,7,7,10,139,0,0,0,0,141,0,143,0,0,82,156,159,82,0,160,4,0,0,0,171,158,6,0,123,0,0,123,0,10,10,0,0,0,143,124,119,0,0,0,107,109,0,0,0,90,0,0,); +my@yyrindex=(155,105,0,0,0,0,0,174,111,0,80,0,105,138,0,0,0,0,0,161,145,0,138,0,0,0,105,0,0,0,0,105,0,0,0,0,29,33,70,74,0,0,46,0,0,0,0,0,45,45,0,54,0,0,0,0,0,0,0,0,0,105,0,0,105,0,0,164,0,0,0,0,0,0,0,138,0,0,138,0,0,165,0,0,0,0,0,0,0,0,0,89,93,0,0,0,25,0,0,); +my@yygindex=(0,85,0,151,1,-12,91,0,47,-18,-19,-17,157,0,0,83,0,0,0,0,0,-3,0,127,0,95,); +sub constYYTABLESIZE (){181}my@yytable=(30,24,13,1,2,41,40,42,31,2,34,64,15,22,14,19,80,84,85,3,25,20,81,4,3,51,51,22,4,23,23,65,13,24,24,12,51,51,23,13,23,23,24,51,24,24,51,23,53,53,53,24,53,53,61,61,37,51,51,23,2,2,75,86,51,78,87,94,93,95,27,27,12,23,26,26,3,88,89,27,38,27,27,26,2,26,26,26,27,23,23,38,26,24,24,27,28,29,23,59,23,23,24,56,24,24,53,23,53,53,53,24,53,53,55,55,55,48,53,49,35,53,36,37,29,35,50,91,92,29,16,17,38,62,63,39,58,38,61,55,39,55,55,55,72,39,32,33,53,53,53,55,53,53,55,37,39,69,53,53,53,71,53,53,53,53,53,76,53,53,77,79,82,83,2,30,31,47,97,98,90,43,); +my@yycheck=(18,13,1,1,2,24,24,24,1,2,22,1,1,12,6,12,12,11,12,17,1,18,18,21,17,0,1,26,21,0,1,21,31,0,1,6,11,12,9,6,11,12,9,18,11,12,0,18,3,4,5,18,7,8,0,1,11,11,12,12,2,2,61,75,18,64,78,86,86,86,0,1,14,26,0,1,17,80,81,9,0,11,12,9,2,11,12,14,18,0,1,11,18,0,1,3,4,5,9,9,11,12,9,19,11,12,1,18,3,4,5,18,7,8,3,4,5,10,13,10,1,16,3,4,5,1,10,3,4,5,7,8,13,48,49,16,10,13,6,1,16,3,4,5,1,0,19,20,3,4,5,13,7,8,16,0,11,18,3,4,5,20,7,8,3,4,5,11,7,8,11,11,1,15,0,11,11,26,87,96,85,24,); +sub constYYFINAL (){5}sub constYYMAXTOKEN (){21}sub yyclearin{$yychar=-1;}sub yyerrok{$yyerrflag=0;}sub YYERROR{++$yynerrs; +&yy_err_recover;}sub yy_err_recover{if($yyerrflag<3){$yyerrflag=3; +while(1){if(($yyn=$yysindex[$yyss[$yyssp]])&&($yyn+=constYYERRCODE())>=0&&$yyn<=$#yycheck&&$yycheck[$yyn]==constYYERRCODE()){$yyss[++$yyssp]=$yystate=$yytable[$yyn]; +$yyvs[++$yyvsp]=$yylval; +next yyloop;}else{return(1)if$yyssp<=0; +--$yyssp; +--$yyvsp;}}}else{return(1)if$yychar==0; +$yychar=-1; +next yyloop;}0;}sub yyparse{if($yys=$ENV{'YYDEBUG'}){$yydebug=int($1)if$yys=~/^(\d)/;}$yynerrs=0; +$yyerrflag=0; +$yychar=(-1); +$yyssp=0; +$yyvsp=0; +$yyss[$yyssp]=$yystate=0; +yyloop: +while(1){yyreduce:{last yyreduce if($yyn=$yydefred[$yystate]); +if($yychar<0){if(($yychar=&yylex)<0){$yychar=0;}}if(($yyn=$yysindex[$yystate])&&($yyn+=$yychar)>=0&&$yyn<=$#yycheck&&$yycheck[$yyn]==$yychar){$yyss[++$yyssp]=$yystate=$yytable[$yyn]; +$yyvs[++$yyvsp]=$yylval; +$yychar=(-1); +--$yyerrflag if$yyerrflag>0; +next yyloop;}if(($yyn=$yyrindex[$yystate])&&($yyn+=$yychar)>=0&&$yyn<=$#yycheck&&$yycheck[$yyn]==$yychar){$yyn=$yytable[$yyn]; +last yyreduce;}if(!$yyerrflag){&yyerror('syntax error'); +++$yynerrs;}return undef if&yy_err_recover;}$yym=$yylen[$yyn]; +$yyval=$yyvs[$yyvsp+1-$yym]; +switch: +{my$label="State$yyn"; +goto$label if exists$yystate{$label}; +last switch; +State1:{{$yyval={''=>$yyvs[$yyvsp-0]}; +last switch;}}State3:{{$yyval={$yyvs[$yyvsp-2],[$yyvs[$yyvsp-0]]}; +last switch;}}State4:{{$yyval=$yyvs[$yyvsp-3]; +$yyval->{$yyvs[$yyvsp-2]}=[$yyvs[$yyvsp-0]]; +last switch;}}State5:{{$yyvs[$yyvsp-1]->[cTAG]=$yyvs[$yyvsp-3]; +$yyval=need_explicit($yyvs[$yyvsp-3],$yyvs[$yyvsp-2])?explicit($yyvs[$yyvsp-1]):$yyvs[$yyvsp-1]; +last switch;}}State11:{{@{$yyval=[]}[cTYPE,cCHILD]=('COMPONENTS',$yyvs[$yyvsp-0]); +last switch;}}State14:{{$yyvs[$yyvsp-1]->[cTAG]=$yyvs[$yyvsp-3]; +@{$yyval=[]}[cTYPE,cCHILD,cLOOP,cOPT]=($yyvs[$yyvsp-5],[$yyvs[$yyvsp-1]],1,$yyvs[$yyvsp-0]); +$yyval=explicit($yyval)if need_explicit($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); +last switch;}}State18:{{@{$yyval=[]}[cTYPE,cCHILD]=('SEQUENCE',$yyvs[$yyvsp-1]); +last switch;}}State19:{{@{$yyval=[]}[cTYPE,cCHILD]=('SET',$yyvs[$yyvsp-1]); +last switch;}}State20:{{@{$yyval=[]}[cTYPE,cCHILD]=('CHOICE',$yyvs[$yyvsp-1]); +last switch;}}State21:{{@{$yyval=[]}[cTYPE]=('ENUM'); +last switch;}}State22:{{@{$yyval=[]}[cTYPE]=$yyvs[$yyvsp-0]; +last switch;}}State23:{{@{$yyval=[]}[cTYPE]=$yyvs[$yyvsp-0]; +last switch;}}State24:{{@{$yyval=[]}[cTYPE]=$yyvs[$yyvsp-0]; +last switch;}}State25:{{@{$yyval=[]}[cTYPE,cCHILD,cDEFINE]=('ANY',undef,$yyvs[$yyvsp-0]); +last switch;}}State26:{{@{$yyval=[]}[cTYPE]=$yyvs[$yyvsp-0]; +last switch;}}State27:{{$yyval=undef; +last switch;}}State28:{{$yyval=$yyvs[$yyvsp-0]; +last switch;}}State30:{{$yyval=$yyvs[$yyvsp-0]; +last switch;}}State31:{{$yyval=$yyvs[$yyvsp-1]; +last switch;}}State32:{{$yyval=[$yyvs[$yyvsp-0]]; +last switch;}}State33:{{push@{$yyval=$yyvs[$yyvsp-2]},$yyvs[$yyvsp-0]; +last switch;}}State34:{{push@{$yyval=$yyvs[$yyvsp-2]},$yyvs[$yyvsp-0]; +last switch;}}State35:{{@{$yyval=$yyvs[$yyvsp-0]}[cVAR,cTAG]=($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); +$yyval=explicit($yyval)if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); +last switch;}}State36:{{@{$yyval=[]}[cTYPE]='EXTENSION_MARKER'; +last switch;}}State37:{{$yyval=[]; +last switch;}}State38:{{my$extension=0; +$yyval=[]; +for my $i(@{$yyvs[$yyvsp-0]}){$extension=1 if$i->[cTYPE]eq 'EXTENSION_MARKER'; +$i->[cEXT]=$i->[cOPT]; +$i->[cEXT]=1 if$extension; +push@{$yyval},$i unless$i->[cTYPE]eq 'EXTENSION_MARKER';}my$e=[]; +$e->[cTYPE]='EXTENSION_MARKER'; +push@{$yyval},$e if$extension; +last switch;}}State39:{{my$extension=0; +$yyval=[]; +for my $i(@{$yyvs[$yyvsp-1]}){$extension=1 if$i->[cTYPE]eq 'EXTENSION_MARKER'; +$i->[cEXT]=$i->[cOPT]; +$i->[cEXT]=1 if$extension; +push@{$yyval},$i unless$i->[cTYPE]eq 'EXTENSION_MARKER';}my$e=[]; +$e->[cTYPE]='EXTENSION_MARKER'; +push@{$yyval},$e if$extension; +last switch;}}State40:{{$yyval=[$yyvs[$yyvsp-0]]; +last switch;}}State41:{{push@{$yyval=$yyvs[$yyvsp-2]},$yyvs[$yyvsp-0]; +last switch;}}State42:{{push@{$yyval=$yyvs[$yyvsp-2]},$yyvs[$yyvsp-0]; +last switch;}}State43:{{@{$yyval=$yyvs[$yyvsp-1]}[cOPT]=($yyvs[$yyvsp-0]); +last switch;}}State47:{{@{$yyval=$yyvs[$yyvsp-0]}[cVAR,cTAG]=($yyvs[$yyvsp-3],$yyvs[$yyvsp-2]); +$yyval->[cOPT]=$yyvs[$yyvsp-3]if$yyval->[cOPT]; +$yyval=explicit($yyval)if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); +last switch;}}State49:{{@{$yyval=$yyvs[$yyvsp-0]}[cTAG]=($yyvs[$yyvsp-2]); +$yyval=explicit($yyval)if need_explicit($yyvs[$yyvsp-2],$yyvs[$yyvsp-1]); +last switch;}}State50:{{@{$yyval=[]}[cTYPE]='EXTENSION_MARKER'; +last switch;}}State51:{{$yyval=undef; +last switch;}}State52:{{$yyval=1; +last switch;}}State53:{{$yyval=undef; +last switch;}}State55:{{$yyval=undef; +last switch;}}State56:{{$yyval=1; +last switch;}}State57:{{$yyval=0; +last switch;}}State58:{{last switch;}}State59:{{last switch;}}State60:{{last switch;}}State61:{{last switch;}}State62:{{last switch;}}}$yyssp-=$yym; +$yystate=$yyss[$yyssp]; +$yyvsp-=$yym; +$yym=$yylhs[$yyn]; +if($yystate==0&&$yym==0){$yystate=constYYFINAL(); +$yyss[++$yyssp]=constYYFINAL(); +$yyvs[++$yyvsp]=$yyval; +if($yychar<0){if(($yychar=&yylex)<0){$yychar=0;}}return$yyvs[$yyvsp]if$yychar==0; +next yyloop;}if(($yyn=$yygindex[$yym])&&($yyn+=$yystate)>=0&&$yyn<=$#yycheck&&$yycheck[$yyn]==$yystate){$yystate=$yytable[$yyn];}else{$yystate=$yydgoto[$yym];}$yyss[++$yyssp]=$yystate; +$yyvs[++$yyvsp]=$yyval;}}my%reserved=('OPTIONAL'=>constOPTIONAL(),'CHOICE'=>constCHOICE(),'OF'=>constOF(),'IMPLICIT'=>constIMPLICIT(),'EXPLICIT'=>constEXPLICIT(),'SEQUENCE'=>constSEQUENCE(),'SET'=>constSET(),'ANY'=>constANY(),'ENUM'=>constENUM(),'ENUMERATED'=>constENUM(),'COMPONENTS'=>constCOMPONENTS(),'{'=>constLBRACE(),'}'=>constRBRACE(),','=>constCOMMA(),'::='=>constASSIGN(),'DEFINED'=>constDEFINED(),'BY'=>constBY()); +my$reserved=join("|",reverse sort grep{/\w/}keys%reserved); +my%tag_class=(APPLICATION=>ASN_APPLICATION,UNIVERSAL=>ASN_UNIVERSAL,PRIVATE=>ASN_PRIVATE,CONTEXT=>ASN_CONTEXT,''=>ASN_CONTEXT); +my$pos; +my$last_pos; +my@stacked; +sub parse{local(*asn)=\($_[0]); +$tagdefault=$_[1]eq 'EXPLICIT'?1:0; +($pos,$last_pos,@stacked)=(); +eval{local$SIG{__DIE__}; +compile(verify(yyparse()));}}sub compile_one{my$tree=shift; +my$ops=shift; +my$name=shift; +foreach my $op(@$ops){next unless ref($op)eq 'ARRAY'; +bless$op; +my$type=$op->[cTYPE]; +if(exists$base_type{$type}){$op->[cTYPE]=$base_type{$type}->[1]; +$op->[cTAG]=defined($op->[cTAG])?asn_encode_tag($op->[cTAG]):$base_type{$type}->[0];}else{die"Unknown type '$type'\n" unless exists$tree->{$type}; +my$ref=compile_one($tree,$tree->{$type},defined($op->[cVAR])?$name.".".$op->[cVAR]:$name); +if(defined($op->[cTAG])&&$ref->[0]->[cTYPE]==opCHOICE){@{$op}[cTYPE,cCHILD]=(opSEQUENCE,$ref);}else{@{$op}[cTYPE,cCHILD,cLOOP]=@{$ref->[0]}[cTYPE,cCHILD,cLOOP];}$op->[cTAG]=defined($op->[cTAG])?asn_encode_tag($op->[cTAG]):$ref->[0]->[cTAG];}$op->[cTAG]|=pack("C",ASN_CONSTRUCTOR)if length$op->[cTAG]&&($op->[cTYPE]==opSET||$op->[cTYPE]==opEXPLICIT||$op->[cTYPE]==opSEQUENCE); +if($op->[cCHILD]){; +compile_one($tree,$op->[cCHILD],defined($op->[cVAR])?$name.".".$op->[cVAR]:$name); +if($op->[cTYPE]==opCHOICE&&defined($op->[cTAG])&&length($op->[cTAG])){$op=bless explicit($op); +$op->[cTYPE]=opSEQUENCE;}if(@{$op->[cCHILD]}>1){; +if($op->[cTYPE]==opSET){; +my@tags=map{length($_->[cTAG])?$_->[cTAG]:$_->[cTYPE]==opCHOICE?(sort map{$_->[cTAG]}$_->[cCHILD])[0]:''}@{$op->[cCHILD]}; +@{$op->[cCHILD]}=@{$op->[cCHILD]}[sort{$tags[$a]cmp$tags[$b]}0..$#tags];}}else{; +$op->[cTYPE]=opSEQUENCE if$op->[cTYPE]==opSET;}}}$ops;}sub compile{my$tree=shift; +while(my($k,$v)=each%$tree){compile_one($tree,$v,$k);}$tree;}sub verify{my$tree=shift or return; +my$err=""; +while(my($name,$ops)=each%$tree){my$stash={}; +my@scope=(); +my$path=""; +my$idx=0; +while($ops){if($idx<@$ops){my$op=$ops->[$idx++]; +my$var; +if(defined($var=$op->[cVAR])){$err.="$name: $path.$var used multiple times\n" if$stash->{$var}++;}if(defined$op->[cCHILD]){if(ref$op->[cCHILD]){push@scope,[$stash,$path,$ops,$idx]; +if(defined$var){$stash={}; +$path.=".".$var;}$idx=0; +$ops=$op->[cCHILD];}elsif($op->[cTYPE]eq 'COMPONENTS'){splice(@$ops, --$idx,1,expand_ops($tree,$op->[cCHILD]));}else{die"Internal error\n";}}}else{my$s=pop@scope or last; +($stash,$path,$ops,$idx)=@$s;}}}die$err if length$err; +$tree;}sub expand_ops{my$tree=shift; +my$want=shift; +my$seen=shift||{}; +die"COMPONENTS OF loop $want\n" if$seen->{$want}++; +die"Undefined macro $want\n" unless exists$tree->{$want}; +my$ops=$tree->{$want}; +die"Bad macro for COMPUNENTS OF '$want'\n" unless@$ops==1&&($ops->[0]->[cTYPE]eq 'SEQUENCE'||$ops->[0]->[cTYPE]eq 'SET')&&ref$ops->[0]->[cCHILD]; +$ops=$ops->[0]->[cCHILD]; +for(my$idx=0;$idx<@$ops;){my$op=$ops->[$idx++]; +if($op->[cTYPE]eq 'COMPONENTS'){splice(@$ops, --$idx,1,expand_ops($tree,$op->[cCHILD],$seen));}}@$ops;}sub _yylex{my$ret=&_yylex; +warn$ret; +$ret;}sub yylex{return shift@stacked if@stacked; +while($asn=~/\G(?: + (\s+|--[^\n]*) + | + ([,{}]|::=) + | + ($reserved)\b + | + ( + (?:OCTET|BIT)\s+STRING + | + OBJECT\s+IDENTIFIER + | + RELATIVE-OID + )\b + | + (\w+(?:-\w+)*) + | + \[\s* + ( + (?:(?:APPLICATION|PRIVATE|UNIVERSAL|CONTEXT)\s+)? + \d+ + ) + \s*\] + | + \((\d+)\) + | + (\.\.\.) + )/sxgo + ){($last_pos,$pos)=($pos,pos($asn)); +next if defined$1; +if(defined$2 or defined$3){my$ret=$+; +if($ret eq '}'){my$p=pos($asn); +my@tmp=@stacked; +@stacked=(); +pos($asn)=$p if yylex()!=constCOMMA(); +@stacked=(@tmp,constPOSTRBRACE());}return$reserved{$yylval=$ret};}if(defined$4){($yylval=$+)=~s/\s+/_/g; +return constWORD();}if(defined$5){$yylval=$+; +return constWORD();}if(defined$6){my($class,$num)=($+=~/^([A-Z]*)\s*(\d+)$/); +$yylval=asn_tag($tag_class{$class},$num); +return constCLASS();}if(defined$7){$yylval=$+; +return constNUMBER();}if(defined$8){return constEXTENSION_MARKER();}die"Internal error\n";}die"Parse error before ",substr($asn,$pos,40),"\n" unless$pos==length($asn); +0;}sub yyerror{die@_," ",substr($asn,$last_pos,40),"\n";}1; +%yystate=('State51','','State34','','State11','','State33','','State24','','State47','','State40','','State31','','State37','','State23','','State22','','State21','','State57','','State39','','State56','','State20','','State25','','State38','','State62','','State14','','State19','','State5','','State53','','State26','','State27','','State50','','State36','','State4','','State3','','State32','','State49','','State43','','State30','','State35','','State52','','State55','','State42','','State28','','State58','','State61','','State41','','State18','','State59','','State1','','State60',''); +package Math::BigInt; +use 5.006001; +use strict; +use warnings; +use Carp (); +our$VERSION='1.999811'; +our@ISA=qw(Exporter); +our@EXPORT_OK=qw(objectify bgcd blcm); +my$class="Math::BigInt"; +use overload '+'=>sub{$_[0]->copy()->badd($_[1]);},'-'=>sub{my$c=$_[0]->copy; +$_[2]?$c->bneg()->badd($_[1]):$c->bsub($_[1]);},'*'=>sub{$_[0]->copy()->bmul($_[1]);},'/'=>sub{$_[2]?ref($_[0])->new($_[1])->bdiv($_[0]):$_[0]->copy->bdiv($_[1]);},'%'=>sub{$_[2]?ref($_[0])->new($_[1])->bmod($_[0]):$_[0]->copy->bmod($_[1]);},'**'=>sub{$_[2]?ref($_[0])->new($_[1])->bpow($_[0]):$_[0]->copy->bpow($_[1]);},'<<'=>sub{$_[2]?ref($_[0])->new($_[1])->blsft($_[0]):$_[0]->copy->blsft($_[1]);},'>>'=>sub{$_[2]?ref($_[0])->new($_[1])->brsft($_[0]):$_[0]->copy->brsft($_[1]);},'+='=>sub{$_[0]->badd($_[1]);},'-='=>sub{$_[0]->bsub($_[1]);},'*='=>sub{$_[0]->bmul($_[1]);},'/='=>sub{scalar$_[0]->bdiv($_[1]);},'%='=>sub{$_[0]->bmod($_[1]);},'**='=>sub{$_[0]->bpow($_[1]);},'<<='=>sub{$_[0]->blsft($_[1]);},'>>='=>sub{$_[0]->brsft($_[1]);},'<'=>sub{$_[2]?ref($_[0])->new($_[1])->blt($_[0]):$_[0]->blt($_[1]);},'<='=>sub{$_[2]?ref($_[0])->new($_[1])->ble($_[0]):$_[0]->ble($_[1]);},'>'=>sub{$_[2]?ref($_[0])->new($_[1])->bgt($_[0]):$_[0]->bgt($_[1]);},'>='=>sub{$_[2]?ref($_[0])->new($_[1])->bge($_[0]):$_[0]->bge($_[1]);},'=='=>sub{$_[0]->beq($_[1]);},'!='=>sub{$_[0]->bne($_[1]);},'<=>'=>sub{my$cmp=$_[0]->bcmp($_[1]); +defined($cmp)&&$_[2]?-$cmp:$cmp;},'cmp'=>sub{$_[2]?"$_[1]" cmp$_[0]->bstr():$_[0]->bstr()cmp"$_[1]";},'&'=>sub{$_[2]?ref($_[0])->new($_[1])->band($_[0]):$_[0]->copy->band($_[1]);},'&='=>sub{$_[0]->band($_[1]);},'|'=>sub{$_[2]?ref($_[0])->new($_[1])->bior($_[0]):$_[0]->copy->bior($_[1]);},'|='=>sub{$_[0]->bior($_[1]);},'^'=>sub{$_[2]?ref($_[0])->new($_[1])->bxor($_[0]):$_[0]->copy->bxor($_[1]);},'^='=>sub{$_[0]->bxor($_[1]);},'neg'=>sub{$_[0]->copy()->bneg();},'~'=>sub{$_[0]->copy()->bnot();},'++'=>sub{$_[0]->binc()},'--'=>sub{$_[0]->bdec()},'atan2'=>sub{$_[2]?ref($_[0])->new($_[1])->batan2($_[0]):$_[0]->copy()->batan2($_[1]);},'cos'=>sub{$_[0]->copy->bcos();},'sin'=>sub{$_[0]->copy->bsin();},'exp'=>sub{$_[0]->copy()->bexp($_[1]);},'abs'=>sub{$_[0]->copy()->babs();},'log'=>sub{$_[0]->copy()->blog();},'sqrt'=>sub{$_[0]->copy()->bsqrt();},'int'=>sub{$_[0]->copy()->bint();},'bool'=>sub{$_[0]->is_zero()?'':1;},'""'=>sub{$_[0]->bstr();},'0+'=>sub{$_[0]->numify();},'='=>sub{$_[0]->copy();},; +our$round_mode='even'; +our$accuracy=undef; +our$precision=undef; +our$div_scale=40; +our$upgrade=undef; +our$downgrade=undef; +our$_trap_nan=0; +our$_trap_inf=0; +my$nan='NaN'; +my$CALC='Math::BigInt::Calc'; +my$IMPORT=0; +my%WARN; +my%CAN; +my%CALLBACKS; +my$EMU_LIB='Math/BigInt/CalcEmu.pm'; +our$rnd_mode='even'; +sub TIESCALAR{my($class)=@_; +bless\$round_mode,$class;}sub FETCH{return$round_mode;}sub STORE{$rnd_mode=$_[0]->round_mode($_[1]);}BEGIN{tie$rnd_mode,'Math::BigInt'; +*as_int=\&as_number; +*is_pos=\&is_positive; +*is_neg=\&is_negative;}sub round_mode{no strict 'refs'; +my$self=shift; +my$class=ref($self)||$self||__PACKAGE__; +if(defined$_[0]){my$m=shift; +if($m!~/^(even|odd|\+inf|\-inf|zero|trunc|common)$/){Carp::croak("Unknown round mode '$m'");}return${"${class}::round_mode"}=$m;}${"${class}::round_mode"};}sub upgrade{no strict 'refs'; +my$self=shift; +my$class=ref($self)||$self||__PACKAGE__; +if(@_>0){return${"${class}::upgrade"}=$_[0];}${"${class}::upgrade"};}sub downgrade{no strict 'refs'; +my$self=shift; +my$class=ref($self)||$self||__PACKAGE__; +if(@_>0){return${"${class}::downgrade"}=$_[0];}${"${class}::downgrade"};}sub div_scale{no strict 'refs'; +my$self=shift; +my$class=ref($self)||$self||__PACKAGE__; +if(defined$_[0]){if($_[0]<0){Carp::croak('div_scale must be greater than zero');}${"${class}::div_scale"}=$_[0];}${"${class}::div_scale"};}sub accuracy{my$x=shift; +my$class=ref($x)||$x||__PACKAGE__; +no strict 'refs'; +if(@_>0){my$a=shift; +$a=$a->numify()if ref($a)&&$a->can('numify'); +if(defined$a){if(!$a||$a<=0){Carp::croak('Argument to accuracy must be greater than zero');}if(int($a)!=$a){Carp::croak('Argument to accuracy must be an integer');}}if(ref($x)){$x->bround($a)if$a; +$x->{_a}=$a; +delete$x->{_p}; +$a=${"${class}::accuracy"}unless defined$a;}else{${"${class}::accuracy"}=$a; +${"${class}::precision"}=undef;}return$a;}my$a; +$a=$x->{_a}if ref($x); +$a=${"${class}::accuracy"}if!defined$a; +$a;}sub precision{my$x=shift; +my$class=ref($x)||$x||__PACKAGE__; +no strict 'refs'; +if(@_>0){my$p=shift; +$p=$p->numify()if ref($p)&&$p->can('numify'); +if((defined$p)&&(int($p)!=$p)){Carp::croak('Argument to precision must be an integer');}if(ref($x)){$x->bfround($p)if$p; +$x->{_p}=$p; +delete$x->{_a}; +$p=${"${class}::precision"}unless defined$p;}else{${"${class}::precision"}=$p; +${"${class}::accuracy"}=undef;}return$p;}my$p; +$p=$x->{_p}if ref($x); +$p=${"${class}::precision"}if!defined$p; +$p;}sub config{my$class=shift||__PACKAGE__; +no strict 'refs'; +if(@_>1||(@_==1&&(ref($_[0])eq 'HASH'))){my$args=$_[0]; +if(ref($args)ne 'HASH'){$args={@_};}my$set_args={}; +foreach my $key(qw/ +accuracy precision +round_mode div_scale +upgrade downgrade +trap_inf trap_nan +/){$set_args->{$key}=$args->{$key}if exists$args->{$key}; +delete$args->{$key};}if(keys%$args>0){Carp::croak("Illegal key(s) '",join("', '",keys%$args),"' passed to $class\->config()");}foreach my $key(keys%$set_args){if($key=~/^trap_(inf|nan)\z/){${"${class}::_trap_$1"}=($set_args->{"trap_$1"}?1:0); +next;}$class->$key($set_args->{$key});}}my$cfg={lib=>$CALC,lib_version=>${"${CALC}::VERSION"},class=>$class,trap_nan=>${"${class}::_trap_nan"},trap_inf=>${"${class}::_trap_inf"},version=>${"${class}::VERSION"},}; +foreach my $key(qw/ +accuracy precision +round_mode div_scale +upgrade downgrade +/){$cfg->{$key}=${"${class}::$key"};}if(@_==1&&(ref($_[0])ne 'HASH')){return$cfg->{$_[0]};}$cfg;}sub _scale_a{my($x,$scale,$mode)=@_; +$scale=$x->{_a}unless defined$scale; +no strict 'refs'; +my$class=ref($x); +$scale=${$class.'::accuracy'}unless defined$scale; +$mode=${$class.'::round_mode'}unless defined$mode; +if(defined$scale){$scale=$scale->can('numify')?$scale->numify():"$scale" if ref($scale); +$scale=int($scale);}($scale,$mode);}sub _scale_p{my($x,$scale,$mode)=@_; +$scale=$x->{_p}unless defined$scale; +no strict 'refs'; +my$class=ref($x); +$scale=${$class.'::precision'}unless defined$scale; +$mode=${$class.'::round_mode'}unless defined$mode; +if(defined$scale){$scale=$scale->can('numify')?$scale->numify():"$scale" if ref($scale); +$scale=int($scale);}($scale,$mode);}sub new{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +return$self->bzero()unless@_; +my($wanted,$a,$p,$r)=@_; +$self=$selfref?$self->copy():bless{},$class; +unless(defined$wanted){return$self->bzero($a,$p,$r);}if(ref($wanted)&&$wanted->isa($class)){my$copy=$class->copy($wanted); +if($selfref){%$self=%$copy;}else{$self=$copy;}return$self;}$class->import()if$IMPORT==0; +if(!ref($wanted)&&$wanted=~/ ^ + ([+-]?) # optional sign + ([1-9][0-9]*) # non-zero significand + (\.0*)? # ... with optional zero fraction + ([Ee][+-]?0+)? # optional zero exponent + \z + /x + ){my$sgn=$1; +my$abs=$2; +$self->{sign}=$sgn||'+'; +$self->{value}=$CALC->_new($abs); +no strict 'refs'; +if(defined($a)||defined($p)||defined(${"${class}::precision"})||defined(${"${class}::accuracy"})){$self->round($a,$p,$r)unless@_>=3&&!defined$a&&!defined$p;}return$self;}if($wanted=~/^\s*([+-]?)inf(inity)?\s*\z/i){my$sgn=$1||'+'; +$self->{sign}=$sgn.'inf'; +return$class->binf($sgn);}if($wanted=~/^\s*([+-]?)nan\s*\z/i){$self=$class->bnan(); +$self->round($a,$p,$r)unless@_>=3&&!defined$a&&!defined$p; +return$self;}if($wanted=~/^\s*[+-]?0[Xx]/){$self=$class->from_hex($wanted); +$self->round($a,$p,$r)unless@_>=3&&!defined$a&&!defined$p; +return$self;}if($wanted=~/^\s*[+-]?0[Bb]/){$self=$class->from_bin($wanted); +$self->round($a,$p,$r)unless@_>=3&&!defined$a&&!defined$p; +return$self;}my($mis,$miv,$mfv,$es,$ev)=_split($wanted); +if(!ref$mis){if($_trap_nan){Carp::croak("$wanted is not a number in $class");}$self->{value}=$CALC->_zero(); +$self->{sign}=$nan; +return$self;}if(!ref$miv){$self->{value}=$mis->{value}; +$self->{sign}=$mis->{sign}; +return$self;}$self->{sign}=$$mis; +$self->{value}=$CALC->_zero(); +my$e=int("$$es$$ev"); +if($e>0){my$diff=$e-CORE::length($$mfv); +if($diff<0){if($_trap_nan){Carp::croak("$wanted not an integer in $class");}return$upgrade->new($wanted,$a,$p,$r)if defined$upgrade; +$self->{sign}=$nan;}else{$$miv=$$miv.($$mfv.'0' x$diff);}}else{if($$mfv ne ''){if($_trap_nan){Carp::croak("$wanted not an integer in $class");}return$upgrade->new($wanted,$a,$p,$r)if defined$upgrade; +$self->{sign}=$nan;}elsif($e<0){my$frac=substr($$miv,$e); +substr($$miv,$e)=""; +if($frac=~/[^0]/){if($_trap_nan){Carp::croak("$wanted not an integer in $class");}return$upgrade->new($wanted,$a,$p,$r)if defined$upgrade; +$self->{sign}=$nan;}}}unless($self->{sign}eq$nan){$self->{sign}='+' if$$miv eq '0'; +$self->{value}=$CALC->_new($$miv)if$self->{sign}=~/^[+-]$/;}$self->round($a,$p,$r)unless@_>=3&&!defined$a&&!defined$p; +$self;}sub from_hex{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +return if$selfref&&$self->modify('from_hex'); +my$str=shift; +$self=$class->bzero()unless$selfref; +if($str=~s/ + ^ + \s* + ( [+-]? ) + (0?x)? + ( + [0-9a-fA-F]* + ( _ [0-9a-fA-F]+ )* + ) + \s* + $ + //x + ){my$sign=$1; +my$chrs=$3; +$chrs=~tr/_//d; +$chrs='0' unless CORE::length$chrs; +$self->{value}=$CALC->_from_hex('0x'.$chrs); +$self->{sign}=$sign eq '-'&&!$CALC->_is_zero($self->{value})?'-':'+'; +return$self;}return$self->bnan();}sub from_oct{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +return if$selfref&&$self->modify('from_oct'); +my$str=shift; +$self=$class->bzero()unless$selfref; +if($str=~s/ + ^ + \s* + ( [+-]? ) + ( + [0-7]* + ( _ [0-7]+ )* + ) + \s* + $ + //x + ){my$sign=$1; +my$chrs=$2; +$chrs=~tr/_//d; +$chrs='0' unless CORE::length$chrs; +$self->{value}=$CALC->_from_oct('0'.$chrs); +$self->{sign}=$sign eq '-'&&!$CALC->_is_zero($self->{value})?'-':'+'; +return$self;}return$self->bnan();}sub from_bin{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +return if$selfref&&$self->modify('from_bin'); +my$str=shift; +$self=$class->bzero()unless$selfref; +if($str=~s/ + ^ + \s* + ( [+-]? ) + (0?b)? + ( + [01]* + ( _ [01]+ )* + ) + \s* + $ + //x + ){my$sign=$1; +my$chrs=$3; +$chrs=~tr/_//d; +$chrs='0' unless CORE::length$chrs; +$self->{value}=$CALC->_from_bin('0b'.$chrs); +$self->{sign}=$sign eq '-'&&!$CALC->_is_zero($self->{value})?'-':'+'; +return$self;}return$self->bnan();}sub from_bytes{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +return if$selfref&&$self->modify('from_bytes'); +Carp::croak("from_bytes() requires a newer version of the $CALC library.")unless$CALC->can('_from_bytes'); +my$str=shift; +$self=$class->bzero()unless$selfref; +$self->{sign}='+'; +$self->{value}=$CALC->_from_bytes($str); +return$self;}sub bzero{if(@_==0){unshift@_,__PACKAGE__;}my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +$self->import()if$IMPORT==0; +return if$selfref&&$self->modify('bzero'); +$self=bless{},$class unless$selfref; +$self->{sign}='+'; +$self->{value}=$CALC->_zero(); +if(@_>0){if(@_>3){($self,$self->{_a},$self->{_p})=$self->_find_round_parameters(@_);}else{$self->{_a}=$_[0]if!defined$self->{_a}||(defined$_[0]&&$_[0]>$self->{_a}); +$self->{_p}=$_[1]if!defined$self->{_p}||(defined$_[1]&&$_[1]>$self->{_p});}}return$self;}sub bone{if(@_==0||(defined($_[0])&&($_[0]eq '+'||$_[0]eq '-'))){unshift@_,__PACKAGE__;}my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +$self->import()if$IMPORT==0; +return if$selfref&&$self->modify('bone'); +my$sign=shift; +$sign=defined$sign&&$sign=~/^\s*-/?"-":"+"; +$self=bless{},$class unless$selfref; +$self->{sign}=$sign; +$self->{value}=$CALC->_one(); +if(@_>0){if(@_>3){($self,$self->{_a},$self->{_p})=$self->_find_round_parameters(@_);}else{$self->{_a}=$_[0]if!defined$self->{_a}||(defined$_[0]&&$_[0]>$self->{_a}); +$self->{_p}=$_[1]if!defined$self->{_p}||(defined$_[1]&&$_[1]>$self->{_p});}}return$self;}sub binf{if(@_==0||(defined($_[0])&&!ref($_[0])&&$_[0]=~/^\s*[+-](inf(inity)?)?\s*$/)){unshift@_,__PACKAGE__;}my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +{no strict 'refs'; +if(${"${class}::_trap_inf"}){Carp::croak("Tried to create +-inf in $class->binf()");}}$self->import()if$IMPORT==0; +return if$selfref&&$self->modify('binf'); +my$sign=shift; +$sign=defined$sign&&$sign=~/^\s*-/?"-":"+"; +$self=bless{},$class unless$selfref; +$self->{sign}=$sign.'inf'; +$self->{value}=$CALC->_zero(); +return$self;}sub bnan{if(@_==0){unshift@_,__PACKAGE__;}my$self=shift; +my$selfref=ref($self); +my$class=$selfref||$self; +{no strict 'refs'; +if(${"${class}::_trap_nan"}){Carp::croak("Tried to create NaN in $class->bnan()");}}$self->import()if$IMPORT==0; +return if$selfref&&$self->modify('bnan'); +$self=bless{},$class unless$selfref; +$self->{sign}=$nan; +$self->{value}=$CALC->_zero(); +return$self;}sub bpi{my($self,$n)=@_; +if(@_==1){$n=$self; +$self=$class;}$self=ref($self)if ref($self); +return$upgrade->new($n)if defined$upgrade; +$self->new(3);}sub copy{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +$self=shift()unless$selfref; +my$copy=bless{},$class; +$copy->{sign}=$self->{sign}; +$copy->{value}=$CALC->_copy($self->{value}); +$copy->{_a}=$self->{_a}if exists$self->{_a}; +$copy->{_p}=$self->{_p}if exists$self->{_p}; +return$copy;}sub as_number{$_[0]->copy();}sub is_zero{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return 0 if$x->{sign}!~/^\+$/; +$CALC->_is_zero($x->{value});}sub is_one{my($class,$x,$sign)=ref($_[0])?(undef,@_):objectify(1,@_); +$sign='+' if!defined$sign||$sign ne '-'; +return 0 if$x->{sign}ne$sign; +$CALC->_is_one($x->{value});}sub is_finite{my$x=shift; +return$x->{sign}eq '+'||$x->{sign}eq '-';}sub is_inf{my($class,$x,$sign)=ref($_[0])?(undef,@_):objectify(1,@_); +if(defined$sign){$sign='[+-]inf' if$sign eq ''; +$sign="[$1]inf" if$sign=~/^([+-])(inf)?$/; +return$x->{sign}=~/^$sign$/?1:0;}$x->{sign}=~/^[+-]inf$/?1:0;}sub is_nan{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +$x->{sign}eq$nan?1:0;}sub is_positive{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return 1 if$x->{sign}eq '+inf'; +($x->{sign}eq '+'&&!$x->is_zero())?1:0;}sub is_negative{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +$x->{sign}=~/^-/?1:0;}sub is_odd{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return 0 if$x->{sign}!~/^[+-]$/; +$CALC->_is_odd($x->{value});}sub is_even{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return 0 if$x->{sign}!~/^[+-]$/; +$CALC->_is_even($x->{value});}sub is_int{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +$x->{sign}=~/^[+-]$/?1:0;}sub bcmp{my($class,$x,$y)=ref($_[0])&&ref($_[0])eq ref($_[1])?(ref($_[0]),@_):objectify(2,@_); +return$upgrade->bcmp($x,$y)if defined$upgrade&&((!$x->isa($class))||(!$y->isa($class))); +if(($x->{sign}!~/^[+-]$/)||($y->{sign}!~/^[+-]$/)){return undef if(($x->{sign}eq$nan)||($y->{sign}eq$nan)); +return 0 if$x->{sign}eq$y->{sign}&&$x->{sign}=~/^[+-]inf$/; +return+1 if$x->{sign}eq '+inf'; +return-1 if$x->{sign}eq '-inf'; +return-1 if$y->{sign}eq '+inf'; +return+1;}return 1 if$x->{sign}eq '+'&&$y->{sign}eq '-'; +return-1 if$x->{sign}eq '-'&&$y->{sign}eq '+'; +if($x->{sign}eq '+'){return$CALC->_acmp($x->{value},$y->{value});}$CALC->_acmp($y->{value},$x->{value});}sub bacmp{my($class,$x,$y)=ref($_[0])&&ref($_[0])eq ref($_[1])?(ref($_[0]),@_):objectify(2,@_); +return$upgrade->bacmp($x,$y)if defined$upgrade&&((!$x->isa($class))||(!$y->isa($class))); +if(($x->{sign}!~/^[+-]$/)||($y->{sign}!~/^[+-]$/)){return undef if(($x->{sign}eq$nan)||($y->{sign}eq$nan)); +return 0 if$x->{sign}=~/^[+-]inf$/&&$y->{sign}=~/^[+-]inf$/; +return 1 if$x->{sign}=~/^[+-]inf$/&&$y->{sign}!~/^[+-]inf$/; +return-1;}$CALC->_acmp($x->{value},$y->{value});}sub beq{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'beq() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for beq()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&!$cmp;}sub bne{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'bne() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for bne()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&!$cmp?'':1;}sub blt{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'blt() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for blt()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&$cmp<0;}sub ble{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'ble() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for ble()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&$cmp<=0;}sub bgt{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'bgt() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for bgt()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&$cmp>0;}sub bge{my$self=shift; +my$selfref=ref$self; +my$class=$selfref||$self; +Carp::croak 'bge() is an instance method, not a class method' unless$selfref; +Carp::croak 'Wrong number of arguments for bge()' unless@_==1; +my$cmp=$self->bcmp(shift); +return defined($cmp)&&$cmp>=0;}sub bneg{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return$x if$x->modify('bneg'); +$x->{sign}=~tr/+-/-+/ unless($x->{sign}eq '+'&&$CALC->_is_zero($x->{value})); +$x;}sub babs{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +return$x if$x->modify('babs'); +$x->{sign}=~s/^-/+/; +$x;}sub bsgn{my$self=shift; +return$self if$self->modify('bsgn'); +return$self->bone("+")if$self->is_pos(); +return$self->bone("-")if$self->is_neg(); +return$self;}sub bnorm{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +$x;}sub binc{my($class,$x,$a,$p,$r)=ref($_[0])?(ref($_[0]),@_):objectify(1,@_); +return$x if$x->modify('binc'); +if($x->{sign}eq '+'){$x->{value}=$CALC->_inc($x->{value}); +return$x->round($a,$p,$r);}elsif($x->{sign}eq '-'){$x->{value}=$CALC->_dec($x->{value}); +$x->{sign}='+' if$CALC->_is_zero($x->{value}); +return$x->round($a,$p,$r);}$x->badd($class->bone(),$a,$p,$r);}sub bdec{my($class,$x,@r)=ref($_[0])?(ref($_[0]),@_):objectify(1,@_); +return$x if$x->modify('bdec'); +if($x->{sign}eq '-'){$x->{value}=$CALC->_inc($x->{value});}else{return$x->badd($class->bone('-'),@r)unless$x->{sign}eq '+'; +if($CALC->_is_zero($x->{value})){$x->{value}=$CALC->_one(); +$x->{sign}='-';}else{$x->{value}=$CALC->_dec($x->{value});}}$x->round(@r);}sub badd{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('badd'); +return$upgrade->badd($upgrade->new($x),$upgrade->new($y),@r)if defined$upgrade&&((!$x->isa($class))||(!$y->isa($class))); +$r[3]=$y; +if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/){return$x->bnan()if(($x->{sign}eq$nan)||($y->{sign}eq$nan)); +if(($x->{sign}=~/^[+-]inf$/)&&($y->{sign}=~/^[+-]inf$/)){return$x if$x->{sign}eq$y->{sign}; +return$x->bnan();}$x->{sign}=$y->{sign},return$x if$y->{sign}=~/^[+-]inf$/; +return$x;}my($sx,$sy)=($x->{sign},$y->{sign}); +if($sx eq$sy){$x->{value}=$CALC->_add($x->{value},$y->{value});}else{my$a=$CALC->_acmp($y->{value},$x->{value}); +if($a>0){$x->{value}=$CALC->_sub($y->{value},$x->{value},1); +$x->{sign}=$sy;}elsif($a==0){$x->{value}=$CALC->_zero(); +$x->{sign}='+';}else{$x->{value}=$CALC->_sub($x->{value},$y->{value});}}$x->round(@r);}sub bsub{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bsub'); +return$upgrade->new($x)->bsub($upgrade->new($y),@r)if defined$upgrade&&(!$x->isa($class)||!$y->isa($class)); +return$x->round(@r)if$y->is_zero(); +my$xsign=$x->{sign}; +$y->{sign}=~tr/+-/-+/; +if($xsign ne$x->{sign}){return$x->bzero(@r)if$xsign=~/^[+-]$/; +return$x->bnan();}$x->badd($y,@r); +$y->{sign}=~tr/+-/-+/; +$x;}sub bmul{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bmul'); +return$x->bnan()if(($x->{sign}eq$nan)||($y->{sign}eq$nan)); +if(($x->{sign}=~/^[+-]inf$/)||($y->{sign}=~/^[+-]inf$/)){return$x->bnan()if$x->is_zero()||$y->is_zero(); +return$x->binf()if($x->{sign}=~/^\+/&&$y->{sign}=~/^\+/); +return$x->binf()if($x->{sign}=~/^-/&&$y->{sign}=~/^-/); +return$x->binf('-');}return$upgrade->bmul($x,$upgrade->new($y),@r)if defined$upgrade&&!$y->isa($class); +$r[3]=$y; +$x->{sign}=$x->{sign}eq$y->{sign}?'+':'-'; +$x->{value}=$CALC->_mul($x->{value},$y->{value}); +$x->{sign}='+' if$CALC->_is_zero($x->{value}); +$x->round(@r);}sub bmuladd{my($class,$x,$y,$z,@r)=objectify(3,@_); +return$x if$x->modify('bmuladd'); +return$x->bnan()if(($x->{sign}eq$nan)||($y->{sign}eq$nan)||($z->{sign}eq$nan)); +if(($x->{sign}=~/^[+-]inf$/)||($y->{sign}=~/^[+-]inf$/)){return$x->bnan()if$x->is_zero()||$y->is_zero(); +return$x->binf()if($x->{sign}=~/^\+/&&$y->{sign}=~/^\+/); +return$x->binf()if($x->{sign}=~/^-/&&$y->{sign}=~/^-/); +return$x->binf('-');}if(($z->{sign}=~/^[+-]inf$/)){$x->{sign}=$z->{sign},return$x if$z->{sign}=~/^[+-]inf$/;}return$upgrade->bmuladd($x,$upgrade->new($y),$upgrade->new($z),@r)if defined$upgrade&&(!$y->isa($class)||!$z->isa($class)||!$x->isa($class)); +$r[3]=$z; +$x->{sign}=$x->{sign}eq$y->{sign}?'+':'-'; +$x->{value}=$CALC->_mul($x->{value},$y->{value}); +$x->{sign}='+' if$CALC->_is_zero($x->{value}); +my($sx,$sz)=($x->{sign},$z->{sign}); +if($sx eq$sz){$x->{value}=$CALC->_add($x->{value},$z->{value});}else{my$a=$CALC->_acmp($z->{value},$x->{value}); +if($a>0){$x->{value}=$CALC->_sub($z->{value},$x->{value},1); +$x->{sign}=$sz;}elsif($a==0){$x->{value}=$CALC->_zero(); +$x->{sign}='+';}else{$x->{value}=$CALC->_sub($x->{value},$z->{value});}}$x->round(@r);}sub bdiv{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bdiv'); +my$wantarray=wantarray; +if($x->is_nan()||$y->is_nan()){return$wantarray?($x->bnan(),$class->bnan()):$x->bnan();}if($y->is_zero()){my$rem; +if($wantarray){$rem=$x->copy();}if($x->is_zero()){$x->bnan();}else{$x->binf($x->{sign});}return$wantarray?($x,$rem):$x;}if($x->is_inf()){my$rem; +$rem=$class->bnan()if$wantarray; +if($y->is_inf()){$x->bnan();}else{my$sign=$x->bcmp(0)==$y->bcmp(0)?'+':'-'; +$x->binf($sign);}return$wantarray?($x,$rem):$x;}if($y->is_inf()){my$rem; +if($x->is_zero()||$x->bcmp(0)==$y->bcmp(0)){$rem=$x->copy()if$wantarray; +$x->bzero();}else{$rem=$class->binf($y->{sign})if$wantarray; +$x->bone('-');}return$wantarray?($x,$rem):$x;}return$upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)if defined$upgrade; +$r[3]=$y; +my$rem=$class->bzero(); +my$xsign=$x->{sign}; +my$ysign=$y->{sign}; +$y->{sign}=~tr/+-/-+/; +my$same=$xsign ne$x->{sign}; +$y->{sign}=$ysign; +if($same){$x->bone();}else{($x->{value},$rem->{value})=$CALC->_div($x->{value},$y->{value}); +if($CALC->_is_zero($rem->{value})){if($xsign eq$ysign||$CALC->_is_zero($x->{value})){$x->{sign}='+';}else{$x->{sign}='-';}}else{if($xsign eq$ysign){$x->{sign}='+';}else{if($xsign eq '+'){$x->badd(1);}else{$x->bsub(1);}$x->{sign}='-';}}}$x->round(@r); +if($wantarray){unless($CALC->_is_zero($rem->{value})){if($xsign ne$ysign){$rem=$y->copy()->babs()->bsub($rem);}$rem->{sign}=$ysign;}$rem->{_a}=$x->{_a}; +$rem->{_p}=$x->{_p}; +$rem->round(@r); +return($x,$rem);}return$x;}sub btdiv{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('btdiv'); +my$wantarray=wantarray; +if($x->is_nan()||$y->is_nan()){return$wantarray?($x->bnan(),$class->bnan()):$x->bnan();}if($y->is_zero()){my$rem; +if($wantarray){$rem=$x->copy();}if($x->is_zero()){$x->bnan();}else{$x->binf($x->{sign});}return$wantarray?($x,$rem):$x;}if($x->is_inf()){my$rem; +$rem=$class->bnan()if$wantarray; +if($y->is_inf()){$x->bnan();}else{my$sign=$x->bcmp(0)==$y->bcmp(0)?'+':'-'; +$x->binf($sign);}return$wantarray?($x,$rem):$x;}if($y->is_inf()){my$rem; +$rem=$x->copy()if$wantarray; +$x->bzero(); +return$wantarray?($x,$rem):$x;}return$upgrade->btdiv($upgrade->new($x),$upgrade->new($y),@r)if defined$upgrade; +$r[3]=$y; +my$rem=$class->bzero(); +my$xsign=$x->{sign}; +my$ysign=$y->{sign}; +$y->{sign}=~tr/+-/-+/; +my$same=$xsign ne$x->{sign}; +$y->{sign}=$ysign; +if($same){$x->bone();}else{($x->{value},$rem->{value})=$CALC->_div($x->{value},$y->{value}); +$x->{sign}=$xsign eq$ysign?'+':'-'; +$x->{sign}='+' if$CALC->_is_zero($x->{value}); +$x->round(@r);}if(wantarray){$rem->{sign}=$xsign; +$rem->{sign}='+' if$CALC->_is_zero($rem->{value}); +$rem->{_a}=$x->{_a}; +$rem->{_p}=$x->{_p}; +$rem->round(@r); +return($x,$rem);}return$x;}sub bmod{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bmod'); +$r[3]=$y; +if($x->is_nan()||$y->is_nan()){return$x->bnan();}if($y->is_zero()){return$x;}if($x->is_inf()){return$x->bnan();}if($y->is_inf()){if($x->is_zero()||$x->bcmp(0)==$y->bcmp(0)){return$x;}else{return$x->binf($y->sign());}}$x->{value}=$CALC->_mod($x->{value},$y->{value}); +if($CALC->_is_zero($x->{value})){$x->{sign}='+';}else{$x->{value}=$CALC->_sub($y->{value},$x->{value},1)if($x->{sign}ne$y->{sign}); +$x->{sign}=$y->{sign};}$x->round(@r);}sub btmod{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('btmod'); +if($x->is_nan()||$y->is_nan()){return$x->bnan();}if($y->is_zero()){return$x;}if($x->is_inf()){return$x->bnan();}if($y->is_inf()){return$x;}return$upgrade->btmod($upgrade->new($x),$upgrade->new($y),@r)if defined$upgrade; +$r[3]=$y; +my$xsign=$x->{sign}; +my$ysign=$y->{sign}; +$x->{value}=$CALC->_mod($x->{value},$y->{value}); +$x->{sign}=$xsign; +$x->{sign}='+' if$CALC->_is_zero($x->{value}); +$x->round(@r); +return$x;}sub bmodinv{my($class,$x,$y,@r)=(undef,@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bmodinv'); +return$x->bnan()if($y->{sign}!~/^[+-]$/||$x->{sign}!~/^[+-]$/); +return$x->bnan()if$y->is_zero(); +return$x->bzero()if($y->is_one()||$y->is_one('-')); +$x->bmod($y); +return$x->bnan()if$x->is_zero(); +($x->{value},$x->{sign})=$CALC->_modinv($x->{value},$y->{value}); +return$x->bnan()if!defined$x->{value}; +$x->{sign}='+' unless defined$x->{sign}; +$x->bneg()if$y->{sign}eq '-'; +$x->bmod($y)if$x->{sign}ne$y->{sign}; +return$x;}sub bmodpow{my($class,$num,$exp,$mod,@r)=objectify(3,@_); +return$num if$num->modify('bmodpow'); +$num->bmodinv($mod)if($exp->{sign}eq '-'); +return$num->bnan()if($num->{sign}=~/NaN|inf/||$exp->{sign}=~/NaN|inf/||$mod->{sign}=~/NaN|inf/); +if($mod->is_zero()){if($num->is_zero()){return$class->bnan();}else{return$num->copy();}}my$value=$CALC->_modpow($num->{value},$exp->{value},$mod->{value}); +my$sign='+'; +unless($CALC->_is_zero($value)){if($num->{sign}eq '-'&&$exp->is_odd()){if($mod->{sign}eq '-'){$sign='-';}else{my$mod=$CALC->_copy($mod->{value}); +$value=$CALC->_sub($mod,$value); +$sign='+';}}else{if($mod->{sign}eq '-'){my$mod=$CALC->_copy($mod->{value}); +$value=$CALC->_sub($mod,$value); +$sign='-';}}}$num->{value}=$value; +$num->{sign}=$sign; +return$num;}sub bpow{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bpow'); +return$x->bnan()if$x->{sign}eq$nan||$y->{sign}eq$nan; +if(($x->{sign}=~/^[+-]inf$/)||($y->{sign}=~/^[+-]inf$/)){if(($x->{sign}=~/^[+-]inf$/)&&($y->{sign}=~/^[+-]inf$/)){return$x->bnan();}if($x->{sign}=~/^[+-]inf/){return$x->bnan()if$y->is_zero(); +return$x->bzero()if$y->is_one('-')&&$x->is_negative(); +return$x if$x->{sign}eq '+inf'; +return$x if$y->is_odd(); +return$x->babs();}return$x if$x->is_one(); +return$x if$x->is_zero()&&$y->{sign}=~/^[+]/; +return$x->binf()if$x->is_zero(); +return$x->bnan()if$x->is_one('-')&&$y->{sign}=~/^[-]/; +return$x->bzero()if$x->{sign}eq '-'&&$y->{sign}=~/^[-]/; +return$x->bnan()if$x->{sign}eq '-'; +return$x->binf()if$y->{sign}=~/^[+]/; +return$x->bzero();}return$upgrade->bpow($upgrade->new($x),$y,@r)if defined$upgrade&&(!$y->isa($class)||$y->{sign}eq '-'); +$r[3]=$y; +my$new_sign='+'; +$new_sign=$y->is_odd()?'-':'+' if($x->{sign}ne '+'); +return$x->binf()if$y->{sign}eq '-'&&$x->{sign}eq '+'&&$CALC->_is_zero($x->{value}); +return$x->bnan()if$y->{sign}eq '-'&&!$CALC->_is_one($x->{value}); +$x->{value}=$CALC->_pow($x->{value},$y->{value}); +$x->{sign}=$new_sign; +$x->{sign}='+' if$CALC->_is_zero($y->{value}); +$x->round(@r);}sub blog{my($class,$x,$base,@r); +if(!ref($_[0])&&$_[0]=~/^[A-Za-z]|::/){($class,$x,$base,@r)=defined$_[2]?objectify(2,@_):objectify(1,@_);}else{($class,$x,$base,@r)=defined$_[1]?objectify(2,@_):objectify(1,@_);}return$x if$x->modify('blog'); +return$x->bnan()if$x->is_nan(); +if(defined$base){$base=$class->new($base)unless ref$base; +if($base->is_nan()||$base->is_one()){return$x->bnan();}elsif($base->is_inf()||$base->is_zero()){return$x->bnan()if$x->is_inf()||$x->is_zero(); +return$x->bzero();}elsif($base->is_negative()){return$x->bzero()if$x->is_one(); +return$x->bone()if$x==$base; +return$x->bnan();}return$x->bone()if$x==$base;}return$x->binf('+')if$x->is_inf(); +return$x->bnan()if$x->is_neg(); +return$x->bzero()if$x->is_one(); +return$x->binf('-')if$x->is_zero(); +return$upgrade->blog($upgrade->new($x),$base,@r)if defined$upgrade; +if(!defined$base){require Math::BigFloat; +my$u=Math::BigFloat->blog(Math::BigFloat->new($x))->as_int(); +$x->{value}=$u->{value}; +$x->{sign}=$u->{sign}; +return$x;}my($rc,$exact)=$CALC->_log_int($x->{value},$base->{value}); +return$x->bnan()unless defined$rc; +$x->{value}=$rc; +$x->round(@r);}sub bexp{my($class,$x,@r)=ref($_[0])?(ref($_[0]),@_):objectify(1,@_); +return$x if$x->modify('bexp'); +return$x->bnan()if$x->{sign}eq 'NaN'; +return$x->bone()if$x->is_zero(); +return$x if$x->{sign}eq '+inf'; +return$x->bzero()if$x->{sign}eq '-inf'; +my$u; +{require Math::BigFloat unless defined$upgrade; +local$upgrade='Math::BigFloat' unless defined$upgrade; +$u=$upgrade->bexp($upgrade->new($x),@r);}if(defined$upgrade){$x=$u;}else{$u=$u->as_int(); +$x->{value}=$u->{value}; +$x->round(@r);}}sub bnok{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bnok'); +return$x->bnan()if$x->{sign}eq 'NaN'||$y->{sign}eq 'NaN'; +return$x->binf()if$x->{sign}eq '+inf'; +my$cmp=$x->bacmp($y); +return$x->bzero()if$cmp<0||substr($y->{sign},0,1)eq"-"; +if($CALC->can('_nok')){$x->{value}=$CALC->_nok($x->{value},$y->{value});}else{my$n=$x->{value}; +my$k=$y->{value}; +{my$twok=$CALC->_mul($CALC->_two(),$CALC->_copy($k)); +if($CALC->_acmp($twok,$n)>0){$k=$CALC->_sub($CALC->_copy($n),$k);}}if($CALC->_is_zero($k)){$n=$CALC->_one();}else{my$n_orig=$CALC->_copy($n); +$CALC->_sub($n,$k); +$CALC->_inc($n); +my$f=$CALC->_copy($n); +$CALC->_inc($f); +my$d=$CALC->_two(); +while($CALC->_acmp($f,$n_orig)<=0){$CALC->_mul($n,$f); +$CALC->_div($n,$d); +$CALC->_inc($f); +$CALC->_inc($d);}}$x->{value}=$n;}$x->round(@r);}sub bsin{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bsin'); +return$x->bnan()if$x->{sign}!~/^[+-]\z/; +return$upgrade->new($x)->bsin(@r)if defined$upgrade; +require Math::BigFloat; +my$t=Math::BigFloat->new($x)->bsin(@r)->as_int(); +$x->bone()if$t->is_one(); +$x->bzero()if$t->is_zero(); +$x->round(@r);}sub bcos{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bcos'); +return$x->bnan()if$x->{sign}!~/^[+-]\z/; +return$upgrade->new($x)->bcos(@r)if defined$upgrade; +require Math::BigFloat; +my$t=Math::BigFloat->new($x)->bcos(@r)->as_int(); +$x->bone()if$t->is_one(); +$x->bzero()if$t->is_zero(); +$x->round(@r);}sub batan{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('batan'); +return$x->bnan()if$x->{sign}!~/^[+-]\z/; +return$upgrade->new($x)->batan(@r)if defined$upgrade; +my$t=Math::BigFloat->new($x)->batan(@r); +$x->{value}=$CALC->_new($x->as_int()->bstr()); +$x->round(@r);}sub batan2{my($class,$y,$x,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$y,$x,@r)=objectify(2,@_);}return$y if$y->modify('batan2'); +return$y->bnan()if($y->{sign}eq$nan)||($x->{sign}eq$nan); +if($x->is_inf()||$y->is_inf()){return$upgrade->new($y)->batan2($upgrade->new($x),@r)if defined$upgrade; +if($y->is_inf()){if($x->{sign}eq '-inf'){$y->bone(substr($y->{sign},0,1)); +$y->bmul($class->new(2));}elsif($x->{sign}eq '+inf'){$y->bzero();}else{$y->bone(substr($y->{sign},0,1));}}else{if($x->{sign}eq '+inf'){$y->bzero();}else{$y->bone(substr($y->{sign},0,1)); +$y->bmul($class->new(3));}}return$y;}return$upgrade->new($y)->batan2($upgrade->new($x),@r)if defined$upgrade; +require Math::BigFloat; +my$r=Math::BigFloat->new($y)->batan2(Math::BigFloat->new($x),@r)->as_int(); +$x->{value}=$r->{value}; +$x->{sign}=$r->{sign}; +$x;}sub bsqrt{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bsqrt'); +return$x->bnan()if$x->{sign}!~/^\+/; +return$x if$x->{sign}eq '+inf'; +return$upgrade->bsqrt($x,@r)if defined$upgrade; +$x->{value}=$CALC->_sqrt($x->{value}); +$x->round(@r);}sub broot{my($class,$x,$y,@r)=(ref($_[0]),@_); +$y=$class->new(2)unless defined$y; +if((!ref($x))||(ref($x)ne ref($y))){($class,$x,$y,@r)=objectify(2,$class||$class,@_);}return$x if$x->modify('broot'); +return$x->bnan()if$x->{sign}!~/^\+/||$y->is_zero()||$y->{sign}!~/^\+$/; +return$x->round(@r)if$x->is_zero()||$x->is_one()||$x->is_inf()||$y->is_one(); +return$upgrade->new($x)->broot($upgrade->new($y),@r)if defined$upgrade; +$x->{value}=$CALC->_root($x->{value},$y->{value}); +$x->round(@r);}sub bfac{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bfac')||$x->{sign}eq '+inf'; +return$x->bnan()if$x->{sign}ne '+'; +$x->{value}=$CALC->_fac($x->{value}); +$x->round(@r);}sub bdfac{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bdfac')||$x->{sign}eq '+inf'; +return$x->bnan()if$x->{sign}ne '+'; +Carp::croak("bdfac() requires a newer version of the $CALC library.")unless$CALC->can('_dfac'); +$x->{value}=$CALC->_dfac($x->{value}); +$x->round(@r);}sub bfib{my($class,$x,@r)=objectify(1,@_); +Carp::croak("bfib() requires a newer version of the $CALC library.")unless$CALC->can('_fib'); +return$x if$x->modify('bfib'); +if(wantarray){return()if$x->is_nan(); +Carp::croak("bfib() can't return an infinitely long list of numbers")if$x->is_inf(); +my@values=$CALC->_fib($x->{value}); +for(my$i=0;$i<$#values;++$i){my$fib=$class->bzero(); +$fib->{value}=$values[$i]; +$values[$i]=$fib;}$x->{value}=$values[-1]; +$values[-1]=$x; +if($x->is_neg()){for(my$i=2;$i<=$#values;$i+=2){$values[$i]{sign}='-';}}@values=map{$_->round(@r)}@values; +return@values;}else{return$x if$x->modify('bdfac')||$x->is_inf('+'); +return$x->bnan()if$x->is_nan()||$x->is_inf('-'); +$x->{sign}=$x->is_neg()&&$x->is_even()?'-':'+'; +$x->{value}=$CALC->_fib($x->{value}); +return$x->round(@r);}}sub blucas{my($class,$x,@r)=objectify(1,@_); +Carp::croak("blucas() requires a newer version of the $CALC library.")unless$CALC->can('_lucas'); +return$x if$x->modify('blucas'); +if(wantarray){return()if$x->is_nan(); +Carp::croak("blucas() can't return an infinitely long list of numbers")if$x->is_inf(); +my@values=$CALC->_lucas($x->{value}); +for(my$i=0;$i<$#values;++$i){my$lucas=$class->bzero(); +$lucas->{value}=$values[$i]; +$values[$i]=$lucas;}$x->{value}=$values[-1]; +$values[-1]=$x; +if($x->is_neg()){for(my$i=2;$i<=$#values;$i+=2){$values[$i]{sign}='-';}}@values=map{$_->round(@r)}@values; +return@values;}else{return$x if$x->is_inf('+'); +return$x->bnan()if$x->is_nan()||$x->is_inf('-'); +$x->{sign}=$x->is_neg()&&$x->is_even()?'-':'+'; +$x->{value}=$CALC->_lucas($x->{value}); +return$x->round(@r);}}sub blsft{my($class,$x,$y,$b,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,$b,@r)=objectify(2,@_);}return$x if$x->modify('blsft'); +return$x->bnan()if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/); +return$x->round(@r)if$y->is_zero(); +$b=2 if!defined$b; +return$x->bnan()if$b<=0||$y->{sign}eq '-'; +$x->{value}=$CALC->_lsft($x->{value},$y->{value},$b); +$x->round(@r);}sub brsft{my($class,$x,$y,$b,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,$b,@r)=objectify(2,@_);}return$x if$x->modify('brsft'); +return$x->bnan()if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/); +return$x->round(@r)if$y->is_zero(); +return$x->bzero(@r)if$x->is_zero(); +$b=2 if!defined$b; +return$x->bnan()if$b<=0||$y->{sign}eq '-'; +if(($x->{sign}eq '-')&&($b==2)){return$x->round(@r)if$x->is_one('-'); +if(!$y->is_one()){$x->binc(); +my$bin=$x->as_bin(); +$bin=~s/^-0b//; +$bin=~tr/10/01/; +if($y>=CORE::length($bin)){$bin='0';}else{$bin=~s/.{$y}$//; +$bin='1'.$bin; +$bin=~tr/10/01/;}my$res=$class->new('0b'.$bin); +$res->binc(); +$x->{value}=$res->{value}; +return$x->round(@r);}$x->bdec();}$x->{value}=$CALC->_rsft($x->{value},$y->{value},$b); +$x->round(@r);}sub band{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('band'); +$r[3]=$y; +return$x->bnan()if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/); +my$sx=$x->{sign}eq '+'?1:-1; +my$sy=$y->{sign}eq '+'?1:-1; +if($sx==1&&$sy==1){$x->{value}=$CALC->_and($x->{value},$y->{value}); +return$x->round(@r);}if($CAN{signed_and}){$x->{value}=$CALC->_signed_and($x->{value},$y->{value},$sx,$sy); +return$x->round(@r);}require$EMU_LIB; +__emu_band($class,$x,$y,$sx,$sy,@r);}sub bior{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bior'); +$r[3]=$y; +return$x->bnan()if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/); +my$sx=$x->{sign}eq '+'?1:-1; +my$sy=$y->{sign}eq '+'?1:-1; +if($sx==1&&$sy==1){$x->{value}=$CALC->_or($x->{value},$y->{value}); +return$x->round(@r);}if($CAN{signed_or}){$x->{value}=$CALC->_signed_or($x->{value},$y->{value},$sx,$sy); +return$x->round(@r);}require$EMU_LIB; +__emu_bior($class,$x,$y,$sx,$sy,@r);}sub bxor{my($class,$x,$y,@r)=(ref($_[0]),@_); +if((!ref($_[0]))||(ref($_[0])ne ref($_[1]))){($class,$x,$y,@r)=objectify(2,@_);}return$x if$x->modify('bxor'); +$r[3]=$y; +return$x->bnan()if($x->{sign}!~/^[+-]$/||$y->{sign}!~/^[+-]$/); +my$sx=$x->{sign}eq '+'?1:-1; +my$sy=$y->{sign}eq '+'?1:-1; +if($sx==1&&$sy==1){$x->{value}=$CALC->_xor($x->{value},$y->{value}); +return$x->round(@r);}if($CAN{signed_xor}){$x->{value}=$CALC->_signed_xor($x->{value},$y->{value},$sx,$sy); +return$x->round(@r);}require$EMU_LIB; +__emu_bxor($class,$x,$y,$sx,$sy,@r);}sub bnot{my($class,$x,$a,$p,$r)=ref($_[0])?(undef,@_):objectify(1,@_); +return$x if$x->modify('bnot'); +$x->binc()->bneg();}sub round{my($self,$a,$p,$r,@args)=@_; +my$class=ref($self); +no strict 'refs'; +if(!defined$a){foreach($self,@args){$a=$_->{_a}if(defined$_->{_a})&&(!defined$a||$_->{_a}<$a);}}if(!defined$p){foreach($self,@args){$p=$_->{_p}if(defined$_->{_p})&&(!defined$p||$_->{_p}>$p);}}$a=${"$class\::accuracy"}unless defined$a; +$p=${"$class\::precision"}unless defined$p; +$a=undef if defined$a&&$a==0; +return$self unless defined$a||defined$p; +return$self->bnan()if defined$a&&defined$p; +$r=${"$class\::round_mode"}unless defined$r; +if($r!~/^(even|odd|[+-]inf|zero|trunc|common)$/){Carp::croak("Unknown round mode '$r'");}if(defined$a){$self->bround(int($a),$r)if!defined$self->{_a}||$self->{_a}>=$a;}else{$self->bfround(int($p),$r)if!defined$self->{_p}||$self->{_p}<=$p;}$self;}sub bround{my$x=shift; +$x=$class->new($x)unless ref$x; +my($scale,$mode)=$x->_scale_a(@_); +return$x if!defined$scale||$x->modify('bround'); +if($x->is_zero()||$scale==0){$x->{_a}=$scale if!defined$x->{_a}||$x->{_a}>$scale; +return$x;}return$x if$x->{sign}!~/^[+-]$/; +my$len=$x->length(); +$scale=$scale->numify()if ref($scale); +if(($scale<0&&$scale<-$len-1)||($scale>=$len)){$x->{_a}=$scale if!defined$x->{_a}||$x->{_a}>$scale; +return$x;}my($pad,$digit_round,$digit_after); +$pad=$len-$scale; +$pad=abs($scale-1)if$scale<0; +my$xs=$CALC->_str($x->{value}); +my$pl=-$pad-1; +$digit_round='0'; +$digit_round=substr($xs,$pl,1)if$pad<=$len; +$pl++; +$pl++ if$pad>=$len; +$digit_after='0'; +$digit_after=substr($xs,$pl,1)if$pad>0; +my$round_up=1; +$round_up-- if($mode eq 'trunc')||($digit_after=~/[01234]/)||($digit_after eq '5')&&($x->_scan_for_nonzero($pad,$xs,$len)==0)&&(($mode eq 'even')&&($digit_round=~/[24680]/)||($mode eq 'odd')&&($digit_round=~/[13579]/)||($mode eq '+inf')&&($x->{sign}eq '-')||($mode eq '-inf')&&($x->{sign}eq '+')||($mode eq 'zero')); +my$put_back=0; +if(($pad>0)&&($pad<=$len)){substr($xs,-$pad,$pad)='0' x$pad; +$put_back=1;}elsif($pad>$len){$x->bzero();}if($round_up){$put_back=1; +$pad=$len,$xs='0' x$pad if$scale<0; +my$c=0; +$pad++; +while($pad<=$len){$c=substr($xs,-$pad,1)+1; +$c='0' if$c eq '10'; +substr($xs,-$pad,1)=$c; +$pad++; +last if$c!=0;}$xs='1'.$xs if$c==0;}$x->{value}=$CALC->_new($xs)if$put_back==1; +$x->{_a}=$scale if$scale>=0; +if($scale<0){$x->{_a}=$len+$scale; +$x->{_a}=0 if$scale<-$len;}$x;}sub bfround{my$x=shift; +my$class=ref($x)||$x; +$x=$class->new($x)unless ref$x; +my($scale,$mode)=$x->_scale_p(@_); +return$x if!defined$scale||$x->modify('bfround'); +$x->bround($x->length()-$scale,$mode)if$scale>0; +delete$x->{_a}; +$x->{_p}=$scale; +$x;}sub fround{my$x=shift; +$x=$class->new($x)unless ref$x; +$x->bround(@_);}sub bfloor{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +$x->round(@r);}sub bceil{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +$x->round(@r);}sub bint{my($class,$x,@r)=ref($_[0])?(undef,@_):objectify(1,@_); +$x->round(@r);}sub bgcd{my($class,@args)=objectify(0,@_); +my$x=shift@args; +$x=ref($x)&&$x->isa($class)?$x->copy():$class->new($x); +return$class->bnan()if$x->{sign}!~/^[+-]$/; +while(@args){my$y=shift@args; +$y=$class->new($y)unless ref($y)&&$y->isa($class); +return$class->bnan()if$y->{sign}!~/^[+-]$/; +$x->{value}=$CALC->_gcd($x->{value},$y->{value}); +last if$CALC->_is_one($x->{value});}return$x->babs();}sub blcm{my($class,@args)=objectify(0,@_); +my$x=shift@args; +$x=ref($x)&&$x->isa($class)?$x->copy():$class->new($x); +return$class->bnan()if$x->{sign}!~/^[+-]$/; +while(@args){my$y=shift@args; +$y=$class->new($y)unless ref($y)&&$y->isa($class); +return$x->bnan()if$y->{sign}!~/^[+-]$/; +$x->{value}=$CALC->_lcm($x->{value},$y->{value});}return$x->babs();}sub sign{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +$x->{sign};}sub digit{my($class,$x,$n)=ref($_[0])?(undef,@_):objectify(1,@_); +$n=$n->numify()if ref($n); +$CALC->_digit($x->{value},$n||0);}sub length{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +my$e=$CALC->_len($x->{value}); +wantarray?($e,0):$e;}sub exponent{my($class,$x)=ref($_[0])?(ref($_[0]),$_[0]):objectify(1,@_); +if($x->{sign}!~/^[+-]$/){my$s=$x->{sign}; +$s=~s/^[+-]//; +return$class->new($s);}return$class->bzero()if$x->is_zero(); +$class->new($CALC->_zeros($x->{value}));}sub mantissa{my($class,$x)=ref($_[0])?(ref($_[0]),$_[0]):objectify(1,@_); +if($x->{sign}!~/^[+-]$/){return$class->new($x->{sign});}my$m=$x->copy(); +delete$m->{_p}; +delete$m->{_a}; +my$zeros=$CALC->_zeros($m->{value}); +$m->brsft($zeros,10)if$zeros!=0; +$m;}sub parts{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +($x->mantissa(),$x->exponent());}sub sparts{my$self=shift; +my$class=ref$self; +Carp::croak("sparts() is an instance method, not a class method")unless$class; +if($self->is_nan()){my$mant=$self->copy(); +return$mant unless wantarray; +my$expo=$class->bnan(); +return($mant,$expo);}if($self->is_inf()){my$mant=$self->copy(); +return$mant unless wantarray; +my$expo=$class->binf('+'); +return($mant,$expo);}my$mant=$self->copy(); +my$nzeros=$CALC->_zeros($mant->{value}); +$mant->brsft($nzeros,10)if$nzeros!=0; +return$mant unless wantarray; +my$expo=$class->new($nzeros); +return($mant,$expo);}sub nparts{my$self=shift; +my$class=ref$self; +Carp::croak("nparts() is an instance method, not a class method")unless$class; +if($self->is_nan()){my$mant=$self->copy(); +return$mant unless wantarray; +my$expo=$class->bnan(); +return($mant,$expo);}if($self->is_inf()){my$mant=$self->copy(); +return$mant unless wantarray; +my$expo=$class->binf('+'); +return($mant,$expo);}my($mant,$expo)=$self->sparts(); +if($mant->bcmp(0)){my($ndigtot,$ndigfrac)=$mant->length(); +my$expo10adj=$ndigtot-$ndigfrac-1; +if($expo10adj!=0){return$upgrade->new($self)->nparts()if$upgrade; +$mant->bnan(); +return$mant unless wantarray; +$expo->badd($expo10adj); +return($mant,$expo);}}return$mant unless wantarray; +return($mant,$expo);}sub eparts{my$self=shift; +my$class=ref$self; +Carp::croak("eparts() is an instance method, not a class method")unless$class; +return$self->sparts()if$self->is_nan()||$self->is_inf(); +my($mant,$expo)=$self->sparts(); +if($mant->bcmp(0)){my$ndigmant=$mant->length(); +$expo->badd($ndigmant); +my$c=$expo->copy()->bdec()->bmod(3)->binc(); +$expo->bsub($c); +if($ndigmant>$c){return$upgrade->new($self)->eparts()if$upgrade; +$mant->bnan(); +return$mant unless wantarray; +return($mant,$expo);}$mant->blsft($c-$ndigmant,10);}return$mant unless wantarray; +return($mant,$expo);}sub dparts{my$self=shift; +my$class=ref$self; +Carp::croak("dparts() is an instance method, not a class method")unless$class; +my$int=$self->copy(); +return$int unless wantarray; +my$frc=$class->bzero(); +return($int,$frc);}sub bstr{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +if($x->{sign}ne '+'&&$x->{sign}ne '-'){return$x->{sign}unless$x->{sign}eq '+inf'; +return 'inf';}my$str=$CALC->_str($x->{value}); +return$x->{sign}eq '-'?"-$str":$str;}sub bsstr{my($class,$x)=ref($_[0])?(undef,$_[0]):objectify(1,@_); +if($x->{sign}ne '+'&&$x->{sign}ne '-'){return$x->{sign}unless$x->{sign}eq '+inf'; +return 'inf';}my($m,$e)=$x->parts(); +my$str=$CALC->_str($m->{value}).'e+'.$CALC->_str($e->{value}); +return$x->{sign}eq '-'?"-$str":$str;}sub bnstr{my$x=shift; +if($x->{sign}ne '+'&&$x->{sign}ne '-'){return$x->{sign}unless$x->{sign}eq '+inf'; +return 'inf';}return$x->bstr()if$x->is_nan()||$x->is_inf(); +my($mant,$expo)=$x->parts(); +my$fracpos=$mant->length()-1; +if($fracpos==0){my$str=$CALC->_str($mant->{value})."e+".$CALC->_str($expo->{value}); +return$x->{sign}eq '-'?"-$str":$str;}$expo+=$fracpos; +my$mantstr=$CALC->_str($mant->{value}); +substr($mantstr,-$fracpos,0)='.'; +my$str=$mantstr.'e+'.$CALC->_str($expo->{value}); +return$x->{sign}eq '-'?"-$str":$str;}sub bestr{my$x=shift; +if($x->{sign}ne '+'&&$x->{sign}ne '-'){return$x->{sign}unless$x->{sign}eq '+inf'; +return 'inf';}my($mant,$expo)=$x->parts(); +my$sign=$mant->sign(); +$mant->babs(); +my$mantstr=$CALC->_str($mant->{value}); +my$mantlen=CORE::length($mantstr); +my$dotidx=1; +$expo+=$mantlen-1; +my$c=$expo->copy()->bmod(3); +$expo-=$c; +$dotidx+=$c; +if($mantlen<$dotidx){$mantstr.="0" x($dotidx-$mantlen);}elsif($mantlen>$dotidx){substr($mantstr,$dotidx,0)=".";}my$str=$mantstr.'e+'.$CALC->_str($expo->{value}); +return$sign eq"-"?"-$str":$str;}sub bdstr{my$x=shift; +if($x->{sign}ne '+'&&$x->{sign}ne '-'){return$x->{sign}unless$x->{sign}eq '+inf'; +return 'inf';}my$str=$CALC->_str($x->{value}); +return$x->{sign}eq '-'?"-$str":$str;}sub to_hex{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$hex=$CALC->_to_hex($x->{value}); +return$x->{sign}eq '-'?"-$hex":$hex;}sub to_oct{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$oct=$CALC->_to_oct($x->{value}); +return$x->{sign}eq '-'?"-$oct":$oct;}sub to_bin{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$bin=$CALC->_to_bin($x->{value}); +return$x->{sign}eq '-'?"-$bin":$bin;}sub to_bytes{my$x=shift; +$x=$class->new($x)if!ref($x); +Carp::croak("to_bytes() requires a finite, non-negative integer")if$x->is_neg()||!$x->is_int(); +Carp::croak("to_bytes() requires a newer version of the $CALC library.")unless$CALC->can('_to_bytes'); +return$CALC->_to_bytes($x->{value});}sub as_hex{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$hex=$CALC->_as_hex($x->{value}); +return$x->{sign}eq '-'?"-$hex":$hex;}sub as_oct{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$oct=$CALC->_as_oct($x->{value}); +return$x->{sign}eq '-'?"-$oct":$oct;}sub as_bin{my$x=shift; +$x=$class->new($x)if!ref($x); +return$x->bstr()if$x->{sign}!~/^[+-]$/; +my$bin=$CALC->_as_bin($x->{value}); +return$x->{sign}eq '-'?"-$bin":$bin;}*as_bytes=\&to_bytes; +sub numify{my$x=shift; +$x=$class->new($x)unless ref$x; +if($x->is_nan()){require Math::Complex; +my$inf=Math::Complex::Inf(); +return$inf-$inf;}if($x->is_inf()){require Math::Complex; +my$inf=Math::Complex::Inf(); +return$x->is_negative()?-$inf:$inf;}my$num=0+$CALC->_num($x->{value}); +return$x->{sign}eq '-'?-$num:$num;}sub objectify{return(ref($_[1]),$_[1])if@_==2&&($_[0]||0)==1&&ref($_[1]); +unless(wantarray){Carp::croak("${class}::objectify() needs list context");}my$count=shift; +my@a=@_; +my$class; +if(ref($a[0])){$class=ref($a[0]);}elsif($a[0]=~/^[A-Z].*::/){$class=shift@a;}else{$class=__PACKAGE__;}$count||=@a; +unshift@a,$class; +no strict 'refs'; +my$up=${"$a[0]::upgrade"}; +my$down; +if(defined${"$a[0]::downgrade"}){$down=${"$a[0]::downgrade"}; +${"$a[0]::downgrade"}=undef;}for my $i(1..$count){my$ref=ref$a[$i]; +unless($ref){$a[$i]=$a[0]->new($a[$i]); +next;}next if$ref->isa($a[0]); +if(defined$up&&$ref->isa($up)){next;}my$recheck=0; +if($a[0]->isa('Math::BigInt')){if($a[$i]->can('as_int')){$a[$i]=$a[$i]->as_int(); +$recheck=1;}elsif($a[$i]->can('as_number')){$a[$i]=$a[$i]->as_number(); +$recheck=1;}}elsif($a[0]->isa('Math::BigFloat')){if($a[$i]->can('as_float')){$a[$i]=$a[$i]->as_float(); +$recheck=$1;}}if($recheck){$ref=ref($a[$i]); +unless($ref){$a[$i]=$a[0]->new($a[$i]); +next;}next if$ref->isa($a[0]);}$a[$i]=$a[0]->new($a[$i]);}${"$a[0]::downgrade"}=$down; +return@a;}sub import{my$class=shift; +$IMPORT++; +my@a; +my$l=scalar@_; +my$warn_or_die=0; +for(my$i=0;$i<$l;$i++){if($_[$i]eq ':constant'){overload::constant integer=>sub{$class->new(shift)},binary=>sub{$class->new(shift)};}elsif($_[$i]eq 'upgrade'){$upgrade=$_[$i+1]; +$i++;}elsif($_[$i]=~/^(lib|try|only)\z/){$CALC=$_[$i+1]||''; +$warn_or_die=1 if$_[$i]eq 'lib'; +$warn_or_die=2 if$_[$i]eq 'only'; +$i++;}else{push@a,$_[$i];}}if(@a>0){require Exporter; +$class->SUPER::import(@a); +$class->export_to_level(1,$class,@a);}my@c=split/\s*,\s*/,$CALC||''; +foreach(@c){$_=~tr/a-zA-Z0-9://cd;}push@c,\'Calc' if$warn_or_die<2; +$CALC=''; +foreach my $l(@c){my$lib=$l; +$lib=$$l if ref($l); +next if($lib||'')eq ''; +$lib='Math::BigInt::'.$lib if$lib!~/^Math::BigInt/i; +$lib=~s/\.pm$//; +if($]<5.006){my@parts=split/::/,$lib; +my$file=pop@parts; +$file.='.pm'; +require File::Spec; +$file=File::Spec->catfile(@parts,$file); +eval{require"$file"; +$lib->import(@c);}}else{eval"use $lib qw/@c/;";}if($@eq ''){my$ok=1; +if($lib->can('_api_version')&&$lib->_api_version()>=1.0){$ok=0; +for my $method(qw/ +one two ten +str num +add mul div sub dec inc +acmp len digit is_one is_zero is_even is_odd +is_two is_ten +zeros new copy check +from_hex from_oct from_bin as_hex as_bin as_oct +rsft lsft xor and or +mod sqrt root fac pow modinv modpow log_int gcd +/){if(!$lib->can("_$method")){if(($WARN{$lib}||0)<2){Carp::carp("$lib is missing method '_$method'"); +$WARN{$lib}=1;}$ok++; +last;}}}if($ok==0){$CALC=$lib; +if($warn_or_die>0&&ref($l)){my$msg="Math::BigInt: couldn't load specified"." math lib(s), fallback to $lib"; +Carp::carp($msg)if$warn_or_die==1; +Carp::croak($msg)if$warn_or_die==2;}last;}else{if(($WARN{$lib}||0)<2){my$ver=eval"\$$lib\::VERSION"||'unknown'; +Carp::carp("Cannot load outdated $lib v$ver, please upgrade"); +$WARN{$lib}=2;}}}}if($CALC eq ''){if($warn_or_die==2){Carp::croak("Couldn't load specified math lib(s)"." and fallback disallowed");}else{Carp::croak("Couldn't load any math lib(s), not even fallback to Calc.pm");}}foreach my $class(keys%CALLBACKS){&{$CALLBACKS{$class}}($CALC);}%CAN=(); +for my $method(qw/ signed_and signed_or signed_xor /){$CAN{$method}=$CALC->can("_$method")?1:0;}}sub _register_callback{my($class,$callback)=@_; +if(ref($callback)ne 'CODE'){Carp::croak("$callback is not a coderef");}$CALLBACKS{$class}=$callback;}sub _split_dec_string{my$str=shift; +if($str=~s/ + ^ + + # leading whitespace + ( \s* ) + + # optional sign + ( [+-]? ) + + # significand + ( + \d+ (?: _ \d+ )* + (?: + \. + (?: \d+ (?: _ \d+ )* )? + )? + | + \. + \d+ (?: _ \d+ )* + ) + + # optional exponent + (?: + [Ee] + ( [+-]? ) + ( \d+ (?: _ \d+ )* ) + )? + + # trailing stuff + ( \D .*? )? + + \z + //x + ){my$leading=$1; +my$significand_sgn=$2||'+'; +my$significand_abs=$3; +my$exponent_sgn=$4||'+'; +my$exponent_abs=$5||'0'; +my$trailing=$6; +$significand_abs=~tr/_//d; +$exponent_abs=~tr/_//d; +$significand_abs=~s/^0+(.)/$1/; +$exponent_abs=~s/^0+(.)/$1/; +my$idx=index$significand_abs,'.'; +if($idx>-1){$significand_abs=~s/0+\z//; +substr($significand_abs,$idx,1)=''; +my$exponent=$exponent_sgn.$exponent_abs; +$exponent.=$idx-CORE::length($significand_abs); +$exponent_abs=abs$exponent; +$exponent_sgn=$exponent<0?'-':'+';}return($leading,$significand_sgn,$significand_abs,$exponent_sgn,$exponent_abs,$trailing);}return undef;}sub _split{my$x=shift; +$x=~s/^\s*([-]?)0*([0-9])/$1$2/g; +$x=~s/^\s+//; +$x=~s/\s+$//g; +if($x=~/^[+-]?[0-9]+\z/){$x=~s/^([+-])0*([0-9])/$2/; +my$sign=$1||'+'; +return(\$sign,\$x,\'',\'',\0);}return if$x!~/^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/; +return Math::BigInt->from_hex($x)if$x=~/^[+-]?0x/; +return Math::BigInt->from_bin($x)if$x=~/^[+-]?0b/; +$x=~s/([0-9])_([0-9])/$1$2/g; +$x=~s/([0-9])_([0-9])/$1$2/g; +my($m,$e,$last)=split/[Ee]/,$x; +return if defined$last; +$e='0' if!defined$e||$e eq""; +my($es,$ev,$mis,$miv,$mfv); +if($e=~/^([+-]?)0*([0-9]+)$/){$es=$1; +$ev=$2; +return if$m eq '.'||$m eq ''; +my($mi,$mf,$lastf)=split/\./,$m; +return if defined$lastf; +$mi='0' if!defined$mi; +$mi.='0' if$mi=~/^[\-\+]?$/; +$mf='0' if!defined$mf||$mf eq ''; +if($mi=~/^([+-]?)0*([0-9]+)$/){$mis=$1||'+'; +$miv=$2; +return unless($mf=~/^([0-9]*?)0*$/); +$mfv=$1; +$ev=0 if$miv eq '0'&&$mfv eq ''; +return(\$mis,\$miv,\$mfv,\$es,\$ev);}}return;}sub _trailing_zeros{my$x=shift; +$x=$class->new($x)unless ref$x; +return 0 if$x->{sign}!~/^[+-]$/; +$CALC->_zeros($x->{value});}sub _scan_for_nonzero{my($x,$pad,$xs,$len)=@_; +return 0 if$len==1; +my$follow=$pad-1; +return 0 if$follow>$len||$follow<1; +substr($xs,-$follow)=~/[^0]/?1:0;}sub _find_round_parameters{my($self,$a,$p,$r,@args)=@_; +my$class=ref($self); +no strict 'refs'; +$a=$a->can('numify')?$a->numify():"$a" if defined$a&&ref($a); +$p=$p->can('numify')?$p->numify():"$p" if defined$p&&ref($p); +if(!defined$a){foreach($self,@args){$a=$_->{_a}if(defined$_->{_a})&&(!defined$a||$_->{_a}<$a);}}if(!defined$p){foreach($self,@args){$p=$_->{_p}if(defined$_->{_p})&&(!defined$p||$_->{_p}>$p);}}$a=${"$class\::accuracy"}unless defined$a; +$p=${"$class\::precision"}unless defined$p; +$a=undef if defined$a&&$a==0; +return($self)unless defined$a||defined$p; +return($self->bnan())if defined$a&&defined$p; +$r=${"$class\::round_mode"}unless defined$r; +if($r!~/^(even|odd|[+-]inf|zero|trunc|common)$/){Carp::croak("Unknown round mode '$r'");}$a=int($a)if defined$a; +$p=int($p)if defined$p; +($self,$a,$p,$r);}sub modify (){0;}1; +package Math::BigInt::Calc; +use 5.006001; +use strict; +use warnings; +use Carp qw< carp croak >; +Math::BigInt::Lib->import(); +our$VERSION='1.999813'; +our@ISA=('Math::BigInt::Lib'); +sub _api_version (){2;}my($BASE,$BASE_LEN,$RBASE,$MAX_VAL); +my($AND_BITS,$XOR_BITS,$OR_BITS); +my($AND_MASK,$XOR_MASK,$OR_MASK); +sub _base_len{my($class,$b,$int)=@_; +if(defined$b){undef&_mul; +undef&_div; +if($]>=5.008&&$int&&$b>7){$BASE_LEN=$b; +*_mul=\&_mul_use_div_64; +*_div=\&_div_use_div_64; +$BASE=int("1e".$BASE_LEN); +$MAX_VAL=$BASE-1; +return$BASE_LEN unless wantarray; +return($BASE_LEN,$BASE,$AND_BITS,$XOR_BITS,$OR_BITS,$BASE_LEN,$MAX_VAL);}$BASE_LEN=$b+1; +my$caught=0; +while(--$BASE_LEN>5){$BASE=int("1e".$BASE_LEN); +$RBASE=abs('1e-'.$BASE_LEN); +$caught=0; +$caught+=1 if(int($BASE*$RBASE)!=1); +$caught+=2 if(int($BASE/$BASE)!=1); +last if$caught!=3;}$BASE=int("1e".$BASE_LEN); +$RBASE=abs('1e-'.$BASE_LEN); +$MAX_VAL=$BASE-1; +if($caught==2){*_mul=\&_mul_use_mul; +*_div=\&_div_use_mul;}else{*_mul=\&_mul_use_div; +*_div=\&_div_use_div;}}return$BASE_LEN unless wantarray; +return($BASE_LEN,$BASE,$AND_BITS,$XOR_BITS,$OR_BITS,$BASE_LEN,$MAX_VAL);}sub _new{my($class,$str)=@_; +my$input_len=length($str)-1; +return bless[$str],$class if$input_len<$BASE_LEN; +my$format="a".(($input_len%$BASE_LEN)+1); +$format.=$]<5.008?"a$BASE_LEN" x int($input_len/$BASE_LEN):"(a$BASE_LEN)*"; +my$self=[reverse(map{0+$_}unpack($format,$str))]; +return bless$self,$class;}BEGIN{my($e,$num)=3; +do{$num='9' x ++$e; +$num*=$num+1;}while$num=~/9{$e}0{$e}/; +$e--; +$e=5 if$^O=~/^uts/; +$e=5 if$^O=~/^unicos/; +my$int=0; +if($e>7){use integer; +my$e1=7; +$num=7; +do{$num=('9' x ++$e1)+0; +$num*=$num+1;}while("$num"=~/9{$e1}0{$e1}/); +$e1--; +if($e1>7){$int=1; +$e=$e1;}}__PACKAGE__->_base_len($e,$int); +use integer; +local$^W=0; +$AND_BITS=15; +$XOR_BITS=15; +$OR_BITS=15; +my$max=16; +while(2**$max<$BASE){$max++;}{no integer; +$max=16 if$]<5.006;}my($x,$y,$z); +do{$AND_BITS++; +$x=CORE::oct('0b'.'1' x$AND_BITS); +$y=$x&$x; +$z=(2**$AND_BITS)-1;}while($AND_BITS<$max&&$x==$z&&$y==$x); +$AND_BITS--; +do{$XOR_BITS++; +$x=CORE::oct('0b'.'1' x$XOR_BITS); +$y=$x^0; +$z=(2**$XOR_BITS)-1;}while($XOR_BITS<$max&&$x==$z&&$y==$x); +$XOR_BITS--; +do{$OR_BITS++; +$x=CORE::oct('0b'.'1' x$OR_BITS); +$y=$x|$x; +$z=(2**$OR_BITS)-1;}while($OR_BITS<$max&&$x==$z&&$y==$x); +$OR_BITS--; +$AND_MASK=__PACKAGE__->_new((2**$AND_BITS)); +$XOR_MASK=__PACKAGE__->_new((2**$XOR_BITS)); +$OR_MASK=__PACKAGE__->_new((2**$OR_BITS)); +*_alen=\&_len;}sub _zero{my$class=shift; +return bless[0],$class;}sub _one{my$class=shift; +return bless[1],$class;}sub _two{my$class=shift; +return bless[2],$class;}sub _ten{my$class=shift; +bless[10],$class;}sub _1ex{my$class=shift; +my$rem=$_[0]%$BASE_LEN; +my$parts=$_[0]/$BASE_LEN; +bless[(0)x$parts,'1'.('0' x$rem)],$class;}sub _copy{my$class=shift; +return bless[@{$_[0]}],$class;}sub import{}sub _str{my$ary=$_[1]; +my$idx=$#$ary; +if($idx<0){croak("$_[1] has no elements");}my$ret=int($ary->[$idx]); +if($idx>0){my$z='0' x($BASE_LEN-1); +while(--$idx>=0){$ret.=substr($z.$ary->[$idx],-$BASE_LEN);}}$ret;}sub _num{my$x=$_[1]; +return$x->[0]if@$x==1; +my$num=0; +for(my$i=$#$x;$i>=0;--$i){$num*=$BASE; +$num+=$x->[$i];}return$num;}sub _add{my($c,$x,$y)=@_; +return$x if@$y==1&&$y->[0]==0; +if(@$x==1&&$x->[0]==0){@$x=@$y; +return$x;}my$i; +my$car=0; +my$j=0; +for$i(@$y){$x->[$j]-=$BASE if$car=(($x->[$j]+=$i+$car)>=$BASE)?1:0; +$j++;}while($car!=0){$x->[$j]-=$BASE if$car=(($x->[$j]+=$car)>=$BASE)?1:0; +$j++;}$x;}sub _inc{my($c,$x)=@_; +for my $i(@$x){return$x if($i+=1)<$BASE; +$i=0;}push@$x,1 if$x->[-1]==0; +$x;}sub _dec{my($c,$x)=@_; +my$MAX=$BASE-1; +for my $i(@$x){last if($i-=1)>=0; +$i=$MAX;}pop@$x if$x->[-1]==0&&@$x>1; +$x;}sub _sub{my($c,$sx,$sy,$s)=@_; +my$car=0; +my$i; +my$j=0; +if(!$s){for$i(@$sx){last unless defined$sy->[$j]||$car; +$i+=$BASE if$car=(($i-=($sy->[$j]||0)+$car)<0); +$j++;}return __strip_zeros($sx);}for$i(@$sx){$sy->[$j]+=$BASE if$car=($sy->[$j]=$i-($sy->[$j]||0)-$car)<0; +$j++;}__strip_zeros($sy);}sub _mul_use_mul{my($c,$xv,$yv)=@_; +if(@$yv==1){if(@$xv==1){if(($xv->[0]*=$yv->[0])>=$BASE){$xv->[0]=$xv->[0]-($xv->[1]=int($xv->[0]*$RBASE))*$BASE;}return$xv;}if($yv->[0]==0){@$xv=(0); +return$xv;}my$y=$yv->[0]; +my$car=0; +foreach my $i(@$xv){$i=$i*$y+$car; +$car=int($i*$RBASE); +$i-=$car*$BASE;}push@$xv,$car if$car!=0; +return$xv;}return$xv if@$xv==1&&$xv->[0]==0; +$yv=[@$xv]if$xv==$yv; +my@prod=(); +my($prod,$car,$cty,$xi,$yi); +for$xi(@$xv){$car=0; +$cty=0; +$xi=(shift@prod||0),next if$xi==0; +for$yi(@$yv){$prod=$xi*$yi+($prod[$cty]||0)+$car; +$prod[$cty++]=$prod-($car=int($prod*$RBASE))*$BASE;}$prod[$cty]+=$car if$car; +$xi=shift@prod||0;}push@$xv,@prod; +$xv;}sub _mul_use_div_64{my($c,$xv,$yv)=@_; +use integer; +if(@$yv==1){if(@$xv==1){if(($xv->[0]*=$yv->[0])>=$BASE){$xv->[0]=$xv->[0]-($xv->[1]=$xv->[0]/$BASE)*$BASE;}return$xv;}if($yv->[0]==0){@$xv=(0); +return$xv;}my$y=$yv->[0]; +my$car=0; +foreach my $i(@$xv){$i=$i*$y+$car; +$i-=($car=$i/$BASE)*$BASE;}push@$xv,$car if$car!=0; +return$xv;}return$xv if(((@$xv==1)&&($xv->[0]==0))); +$yv=$c->_copy($xv)if$xv==$yv; +my@prod=(); +my($prod,$car,$cty,$xi,$yi); +for$xi(@$xv){$car=0; +$cty=0; +$xi=(shift@prod||0),next if$xi==0; +for$yi(@$yv){$prod=$xi*$yi+($prod[$cty]||0)+$car; +$prod[$cty++]=$prod-($car=$prod/$BASE)*$BASE;}$prod[$cty]+=$car if$car; +$xi=shift@prod||0;}push@$xv,@prod; +$xv;}sub _mul_use_div{my($c,$xv,$yv)=@_; +if(@$yv==1){if(@$xv==1){if(($xv->[0]*=$yv->[0])>=$BASE){$xv->[0]=$xv->[0]-($xv->[1]=int($xv->[0]/$BASE))*$BASE;}return$xv;}if($yv->[0]==0){@$xv=(0); +return$xv;}my$y=$yv->[0]; +my$car=0; +foreach my $i(@$xv){$i=$i*$y+$car; +$car=int($i/$BASE); +$i-=$car*$BASE;}push@$xv,$car if$car!=0; +return$xv;}return$xv if(((@$xv==1)&&($xv->[0]==0))); +$yv=$c->_copy($xv)if$xv==$yv; +my@prod=(); +my($prod,$car,$cty,$xi,$yi); +for$xi(@$xv){$car=0; +$cty=0; +$xi=(shift@prod||0),next if$xi==0; +for$yi(@$yv){$prod=$xi*$yi+($prod[$cty]||0)+$car; +$prod[$cty++]=$prod-($car=int($prod/$BASE))*$BASE;}$prod[$cty]+=$car if$car; +$xi=shift@prod||0;}push@$xv,@prod; +$xv;}sub _div_use_mul{my($c,$x,$yorg)=@_; +if(@$x==1&&@$yorg==1){if(wantarray){my$rem=[$x->[0]%$yorg->[0]]; +bless$rem,$c; +$x->[0]=int($x->[0]/$yorg->[0]); +return($x,$rem);}else{$x->[0]=int($x->[0]/$yorg->[0]); +return$x;}}if(@$yorg==1){my$rem; +$rem=$c->_mod($c->_copy($x),$yorg)if wantarray; +my$j=@$x; +my$r=0; +my$y=$yorg->[0]; +my$b; +while($j-- >0){$b=$r*$BASE+$x->[$j]; +$x->[$j]=int($b/$y); +$r=$b%$y;}pop@$x if@$x>1&&$x->[-1]==0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg>@$x){my$rem; +$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg==@$x){if(length(int($yorg->[-1]))>length(int($x->[-1]))){my$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(length(int($yorg->[-1]))==length(int($x->[-1]))){my$a=0; +my$j=@$x-1; +while($j>=0){last if($a=$x->[$j]-$yorg->[$j]); +$j--;}if($a<=0){my$rem=$a==0?$c->_zero():$c->_copy($x); +@$x=0; +$x->[0]=1 if$a==0; +return($x,$rem)if wantarray; +return$x;}}}my$y=$c->_copy($yorg); +my($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,$tmp,$q,$u2,$u1,$u0); +$car=$bar=$prd=0; +if(($dd=int($BASE/($y->[-1]+1)))!=1){for$xi(@$x){$xi=$xi*$dd+$car; +$xi-=($car=int($xi*$RBASE))*$BASE;}push(@$x,$car); +$car=0; +for$yi(@$y){$yi=$yi*$dd+$car; +$yi-=($car=int($yi*$RBASE))*$BASE;}}else{push(@$x,0);}@q=(); +($v2,$v1)=@$y[-2,-1]; +$v2=0 unless$v2; +while($#$x>$#$y){($u2,$u1,$u0)=@$x[-3..-1]; +$u2=0 unless$u2; +$q=(($u0==$v1)?$MAX_VAL:int(($u0*$BASE+$u1)/$v1)); +--$q while($v2*$q>($u0*$BASE+$u1-$q*$v1)*$BASE+$u2); +if($q){($car,$bar)=(0,0); +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$prd=$q*$y->[$yi]+$car; +$prd-=($car=int($prd*$RBASE))*$BASE; +$x->[$xi]+=$BASE if($bar=(($x->[$xi]-=$prd+$bar)<0));}if($x->[-1]<$car+$bar){$car=0; +--$q; +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$x->[$xi]-=$BASE if($car=(($x->[$xi]+=$y->[$yi]+$car)>=$BASE));}}}pop(@$x); +unshift(@q,$q);}if(wantarray){my$d=bless[],$c; +if($dd!=1){$car=0; +for$xi(reverse@$x){$prd=$car*$BASE+$xi; +$car=$prd-($tmp=int($prd/$dd))*$dd; +unshift(@$d,$tmp);}}else{@$d=@$x;}@$x=@q; +__strip_zeros($x); +__strip_zeros($d); +return($x,$d);}@$x=@q; +__strip_zeros($x); +$x;}sub _div_use_div_64{my($c,$x,$yorg)=@_; +use integer; +if(@$x==1&&@$yorg==1){if(wantarray){my$rem=[$x->[0]%$yorg->[0]]; +bless$rem,$c; +$x->[0]=int($x->[0]/$yorg->[0]); +return($x,$rem);}else{$x->[0]=int($x->[0]/$yorg->[0]); +return$x;}}if(@$yorg==1){my$rem; +$rem=$c->_mod($c->_copy($x),$yorg)if wantarray; +my$j=@$x; +my$r=0; +my$y=$yorg->[0]; +my$b; +while($j-- >0){$b=$r*$BASE+$x->[$j]; +$x->[$j]=int($b/$y); +$r=$b%$y;}pop@$x if@$x>1&&$x->[-1]==0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg>@$x){my$rem; +$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg==@$x){my$rem; +if(length(int($yorg->[-1]))>length(int($x->[-1]))){$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(length(int($yorg->[-1]))==length(int($x->[-1]))){my$a=0; +my$j=@$x-1; +while($j>=0){last if($a=$x->[$j]-$yorg->[$j]); +$j--;}if($a<=0){$rem=$c->_zero(); +$rem=$c->_copy($x)if$a!=0; +@$x=0; +$x->[0]=1 if$a==0; +return($x,$rem)if wantarray; +return$x;}}}my$y=$c->_copy($yorg); +my($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,$tmp,$q,$u2,$u1,$u0); +$car=$bar=$prd=0; +if(($dd=int($BASE/($y->[-1]+1)))!=1){for$xi(@$x){$xi=$xi*$dd+$car; +$xi-=($car=int($xi/$BASE))*$BASE;}push(@$x,$car); +$car=0; +for$yi(@$y){$yi=$yi*$dd+$car; +$yi-=($car=int($yi/$BASE))*$BASE;}}else{push(@$x,0);}@q=(); +($v2,$v1)=@$y[-2,-1]; +$v2=0 unless$v2; +while($#$x>$#$y){($u2,$u1,$u0)=@$x[-3..-1]; +$u2=0 unless$u2; +$q=(($u0==$v1)?$MAX_VAL:int(($u0*$BASE+$u1)/$v1)); +--$q while($v2*$q>($u0*$BASE+$u1-$q*$v1)*$BASE+$u2); +if($q){($car,$bar)=(0,0); +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$prd=$q*$y->[$yi]+$car; +$prd-=($car=int($prd/$BASE))*$BASE; +$x->[$xi]+=$BASE if($bar=(($x->[$xi]-=$prd+$bar)<0));}if($x->[-1]<$car+$bar){$car=0; +--$q; +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$x->[$xi]-=$BASE if($car=(($x->[$xi]+=$y->[$yi]+$car)>=$BASE));}}}pop(@$x); +unshift(@q,$q);}if(wantarray){my$d=bless[],$c; +if($dd!=1){$car=0; +for$xi(reverse@$x){$prd=$car*$BASE+$xi; +$car=$prd-($tmp=int($prd/$dd))*$dd; +unshift(@$d,$tmp);}}else{@$d=@$x;}@$x=@q; +__strip_zeros($x); +__strip_zeros($d); +return($x,$d);}@$x=@q; +__strip_zeros($x); +$x;}sub _div_use_div{my($c,$x,$yorg)=@_; +if(@$x==1&&@$yorg==1){if(wantarray){my$rem=[$x->[0]%$yorg->[0]]; +bless$rem,$c; +$x->[0]=int($x->[0]/$yorg->[0]); +return($x,$rem);}else{$x->[0]=int($x->[0]/$yorg->[0]); +return$x;}}if(@$yorg==1){my$rem; +$rem=$c->_mod($c->_copy($x),$yorg)if wantarray; +my$j=@$x; +my$r=0; +my$y=$yorg->[0]; +my$b; +while($j-- >0){$b=$r*$BASE+$x->[$j]; +$x->[$j]=int($b/$y); +$r=$b%$y;}pop@$x if@$x>1&&$x->[-1]==0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg>@$x){my$rem; +$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(@$yorg==@$x){my$rem; +if(length(int($yorg->[-1]))>length(int($x->[-1]))){$rem=$c->_copy($x)if wantarray; +@$x=0; +return($x,$rem)if wantarray; +return$x;}if(length(int($yorg->[-1]))==length(int($x->[-1]))){my$a=0; +my$j=@$x-1; +while($j>=0){last if($a=$x->[$j]-$yorg->[$j]); +$j--;}if($a<=0){$rem=$c->_zero(); +$rem=$c->_copy($x)if$a!=0; +@$x=0; +$x->[0]=0; +$x->[0]=1 if$a==0; +return($x,$rem)if wantarray; +return$x;}}}my$y=$c->_copy($yorg); +my($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0); +$car=$bar=$prd=0; +if(($dd=int($BASE/($y->[-1]+1)))!=1){for$xi(@$x){$xi=$xi*$dd+$car; +$xi-=($car=int($xi/$BASE))*$BASE;}push(@$x,$car); +$car=0; +for$yi(@$y){$yi=$yi*$dd+$car; +$yi-=($car=int($yi/$BASE))*$BASE;}}else{push(@$x,0);}@q=(); +($v2,$v1)=@$y[-2,-1]; +$v2=0 unless$v2; +while($#$x>$#$y){($u2,$u1,$u0)=@$x[-3..-1]; +$u2=0 unless$u2; +$q=(($u0==$v1)?$MAX_VAL:int(($u0*$BASE+$u1)/$v1)); +--$q while($v2*$q>($u0*$BASE+$u1-$q*$v1)*$BASE+$u2); +if($q){($car,$bar)=(0,0); +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$prd=$q*$y->[$yi]+$car; +$prd-=($car=int($prd/$BASE))*$BASE; +$x->[$xi]+=$BASE if($bar=(($x->[$xi]-=$prd+$bar)<0));}if($x->[-1]<$car+$bar){$car=0; +--$q; +for($yi=0,$xi=$#$x-$#$y-1;$yi<=$#$y;++$yi, ++$xi){$x->[$xi]-=$BASE if($car=(($x->[$xi]+=$y->[$yi]+$car)>=$BASE));}}}pop(@$x); +unshift(@q,$q);}if(wantarray){my$d=bless[],$c; +if($dd!=1){$car=0; +for$xi(reverse@$x){$prd=$car*$BASE+$xi; +$car=$prd-($tmp=int($prd/$dd))*$dd; +unshift(@$d,$tmp);}}else{@$d=@$x;}@$x=@q; +__strip_zeros($x); +__strip_zeros($d); +return($x,$d);}@$x=@q; +__strip_zeros($x); +$x;}sub _acmp{my($c,$cx,$cy)=@_; +return(($cx->[0]<=>$cy->[0])<=>0)if@$cx==1&&@$cy==1; +my$lxy=(@$cx-@$cy)||(length(int($cx->[-1]))-length(int($cy->[-1]))); +return-1 if$lxy<0; +return 1 if$lxy>0; +my$a; +my$j=@$cx; +while(--$j>=0){last if$a=$cx->[$j]-$cy->[$j];}$a<=>0;}sub _len{my$cx=$_[1]; +(@$cx-1)*$BASE_LEN+length(int($cx->[-1]));}sub _digit{my($c,$x,$n)=@_; +my$len=_len('',$x); +$n+=$len if$n<0; +return"0" if$n<0||$n>=$len; +my$elem=int($n/$BASE_LEN); +my$digit=$n%$BASE_LEN; +substr("0" x$BASE_LEN."$x->[$elem]",-1-$digit,1);}sub _zeros{my$x=$_[1]; +return 0 if@$x==1&&$x->[0]==0; +my$zeros=0; +foreach my $elem(@$x){if($elem!=0){$elem=~/[^0](0*)\z/; +$zeros+=length($1); +last;}$zeros+=$BASE_LEN;}$zeros;}sub _is_zero{@{$_[1]}==1&&$_[1]->[0]==0?1:0;}sub _is_even{$_[1]->[0]&1?0:1;}sub _is_odd{$_[1]->[0]&1?1:0;}sub _is_one{@{$_[1]}==1&&$_[1]->[0]==1?1:0;}sub _is_two{@{$_[1]}==1&&$_[1]->[0]==2?1:0;}sub _is_ten{@{$_[1]}==1&&$_[1]->[0]==10?1:0;}sub __strip_zeros{my$x=shift; +push@$x,0 if@$x==0; +return$x if@$x==1; +my$i=$#$x; +while($i>0){last if$x->[$i]!=0; +$i--;}$i++; +splice(@$x,$i)if$i<@$x; +$x;}sub _check{my($class,$x)=@_; +my$msg=$class->SUPER::_check($x); +return$msg if$msg; +my$n; +eval{$n=@$x}; +return"Not an array reference" unless$@eq ''; +return"Reference to an empty array" unless$n>0; +for(my$i=0;$i<=$#$x;++$i){my$e=$x->[$i]; +return"Element at index $i is undefined" unless defined$e; +return"Element at index $i is a '".ref($e)."', which is not a scalar" unless ref($e)eq""; +return"Element at index $i is '$e', which does not look like an"." normal integer" unless$e=~/^\d+\z/; +return"Element at index $i is '$e', which is not smaller than"." the base '$BASE'" if$e>=$BASE; +return"Element at index $i (last element) is zero" if$#$x>0&&$i==$#$x&&$e==0;}return 0;}sub _mod{my($c,$x,$yo)=@_; +if(@$yo>1){my($xo,$rem)=$c->_div($x,$yo); +@$x=@$rem; +return$x;}my$y=$yo->[0]; +if(@$x==1){$x->[0]%=$y; +return$x;}my$b=$BASE%$y; +if($b==0){$x->[0]%=$y;}elsif($b==1){my$r=0; +foreach(@$x){$r=($r+$_)%$y;}$r=0 if$r==$y; +$x->[0]=$r;}else{my$r=0; +my$bm=1; +foreach(@$x){$r=($_*$bm+$r)%$y; +$bm=($bm*$b)%$y;}$r=0 if$r==$y; +$x->[0]=$r;}@$x=$x->[0]; +return$x;}sub _rsft{my($c,$x,$y,$n)=@_; +if($n!=10){$n=$c->_new($n); +return scalar$c->_div($x,$c->_pow($n,$y));}my$dst=0; +my$src=$c->_num($y); +my$xlen=(@$x-1)*$BASE_LEN+length(int($x->[-1])); +if($src>=$xlen or($src==$xlen and!defined$x->[1])){splice(@$x,1); +$x->[0]=0; +return$x;}my$rem=$src%$BASE_LEN; +$src=int($src/$BASE_LEN); +if($rem==0){splice(@$x,0,$src);}else{my$len=@$x-$src; +my$vd; +my$z='0' x$BASE_LEN; +$x->[@$x]=0; +while($dst<$len){$vd=$z.$x->[$src]; +$vd=substr($vd,-$BASE_LEN,$BASE_LEN-$rem); +$src++; +$vd=substr($z.$x->[$src],-$rem,$rem).$vd; +$vd=substr($vd,-$BASE_LEN,$BASE_LEN)if length($vd)>$BASE_LEN; +$x->[$dst]=int($vd); +$dst++;}splice(@$x,$dst)if$dst>0; +pop@$x if$x->[-1]==0&&@$x>1;}$x;}sub _lsft{my($c,$x,$n,$b)=@_; +return$x if$c->_is_zero($x); +my$log10=sprintf"%.0f",log($b)/log(10); +if($b==10**$log10){$b=10; +$n=$c->_mul($n,$c->_new($log10)); +my$src=@$x; +my$len=$c->_num($n); +my$rem=$len%$BASE_LEN; +my$dst=$src+int($len/$BASE_LEN); +my$vd; +$x->[$src]=0; +my$z='0' x$BASE_LEN; +while($src>=0){$vd=$x->[$src]; +$vd=$z.$vd; +$vd=substr($vd,-$BASE_LEN+$rem,$BASE_LEN-$rem); +$vd.=$src>0?substr($z.$x->[$src-1],-$BASE_LEN,$rem):'0' x$rem; +$vd=substr($vd,-$BASE_LEN,$BASE_LEN)if length($vd)>$BASE_LEN; +$x->[$dst]=int($vd); +$dst--; +$src--;}while($dst>=0){$x->[$dst--]=0;}splice@$x,-1 if$x->[-1]==0; +return$x;}else{$b=$c->_new($b); +return$c->_mul($x,$c->_pow($b,$n));}}sub _pow{my($c,$cx,$cy)=@_; +if(@$cy==1&&$cy->[0]==0){splice(@$cx,1); +$cx->[0]=1; +return$cx;}if((@$cx==1&&$cx->[0]==1)||(@$cy==1&&$cy->[0]==1)){return$cx;}if(@$cx==1&&$cx->[0]==0){splice(@$cx,1); +$cx->[0]=0; +return$cx;}my$pow2=$c->_one(); +my$y_bin=$c->_as_bin($cy); +$y_bin=~s/^0b//; +my$len=length($y_bin); +while(--$len>0){$c->_mul($pow2,$cx)if substr($y_bin,$len,1)eq '1'; +$c->_mul($cx,$cx);}$c->_mul($cx,$pow2); +$cx;}sub _nok{my($c,$n,$k)=@_; +{my$twok=$c->_mul($c->_two(),$c->_copy($k)); +if($c->_acmp($twok,$n)>0){$k=$c->_sub($c->_copy($n),$k);}}if($c->_is_zero($k)){@$n=1;}else{my$n_orig=$c->_copy($n); +$c->_sub($n,$k); +$c->_inc($n); +my$f=$c->_copy($n); +$c->_inc($f); +my$d=$c->_two(); +while($c->_acmp($f,$n_orig)<=0){$c->_mul($n,$f); +$c->_div($n,$d); +$c->_inc($f); +$c->_inc($d);}}return$n;}my@factorials=(1,1,2,2*3,2*3*4,2*3*4*5,2*3*4*5*6,2*3*4*5*6*7,); +sub _fac{my($c,$cx)=@_; +if((@$cx==1)&&($cx->[0]<=7)){$cx->[0]=$factorials[$cx->[0]]; +return$cx;}if((@$cx==1)&&($cx->[0]>=12&&$cx->[0]<7000)){my$zero_elements=0; +my$k=$c->_num($cx); +my$even=1; +if(($k&1)==0){$even=$k; +$k--;}$k=($k+1)/2; +my$k2=$k*$k; +my$odd=1; +my$sum=1; +my$i=$k-1; +my$new_x=$c->_new($k*$even); +@$cx=@$new_x; +if($cx->[0]==0){$zero_elements++; +shift@$cx;}my$BASE2=int(sqrt($BASE))-1; +my$j=1; +while($j<=$i){my$m=($k2-$sum); +$odd+=2; +$sum+=$odd; +$j++; +while($j<=$i&&($m<$BASE2)&&(($k2-$sum)<$BASE2)){$m*=($k2-$sum); +$odd+=2; +$sum+=$odd; +$j++;}if($m<$BASE){$c->_mul($cx,[$m]);}else{$c->_mul($cx,$c->_new($m));}if($cx->[0]==0){$zero_elements++; +shift@$cx;}}unshift@$cx,(0)x$zero_elements; +return$cx;}my$steps=100; +$steps=$cx->[0]if@$cx==1; +my$r=2; +my$cf=3; +my$step=2; +my$last=$r; +while($r*$cf<$BASE&&$step<$steps){$last=$r; +$r*=$cf++; +$step++;}if((@$cx==1)&&$step==$cx->[0]){$cx->[0]=$r; +return$cx;}my$n; +if(@$cx==1){$n=$cx->[0];}else{$n=$c->_copy($cx);}$cx->[0]=$last; +splice(@$cx,1); +my$zero_elements=0; +if(ref$n eq 'ARRAY'){my$base_2=int(sqrt($BASE))-1; +while($step<$base_2){if($cx->[0]==0){$zero_elements++; +shift@$cx;}my$b=$step*($step+1); +$step+=2; +$c->_mul($cx,[$b]);}$step=[$step]; +while($c->_acmp($step,$n)<=0){if($cx->[0]==0){$zero_elements++; +shift@$cx;}$c->_mul($cx,$step); +$c->_inc($step);}}else{my$base_4=int(sqrt(sqrt($BASE)))-2; +my$n4=$n-4; +while($step<$n4&&$step<$base_4){if($cx->[0]==0){$zero_elements++; +shift@$cx;}my$b=$step*($step+1); +$step+=2; +$b*=$step*($step+1); +$step+=2; +$c->_mul($cx,[$b]);}my$base_2=int(sqrt($BASE))-1; +my$n2=$n-2; +while($step<$n2&&$step<$base_2){if($cx->[0]==0){$zero_elements++; +shift@$cx;}my$b=$step*($step+1); +$step+=2; +$c->_mul($cx,[$b]);}while($step<=$n){$c->_mul($cx,[$step]); +$step++; +if($cx->[0]==0){$zero_elements++; +shift@$cx;}}}unshift@$cx,(0)x$zero_elements; +$cx;}sub _log_int{my($c,$x,$base)=@_; +return if@$x==1&&$x->[0]==0; +return if@$base==1&&$base->[0]<2; +if(@$x==1&&$x->[0]==1){@$x=0; +return$x,1;}my$cmp=$c->_acmp($x,$base); +if($cmp==0){@$x=1; +return$x,1;}if($cmp<0){@$x=0; +return$x,0;}my$x_org=$c->_copy($x); +my$len=$c->_len($x_org); +my$log=log($base->[-1])/log(10); +$log+=(@$base-1)*$BASE_LEN; +my$res=int($len/$log); +@$x=$res; +my$trial=$c->_pow($c->_copy($base),$x); +my$acmp=$c->_acmp($trial,$x_org); +return$x,1 if$acmp==0; +while($acmp<0){$c->_mul($trial,$base); +$c->_inc($x); +$acmp=$c->_acmp($trial,$x_org);}while($acmp>0){$c->_div($trial,$base); +$c->_dec($x); +$acmp=$c->_acmp($trial,$x_org);}return$x,1 if$acmp==0; +return$x,0;}use constant DEBUG=>0; +my$steps=0; +sub steps{$steps}sub _sqrt{my($c,$x)=@_; +if(@$x==1){$x->[0]=int(sqrt($x->[0])); +return$x;}my$y=$c->_copy($x); +my$l=int(($c->_len($x)-1)/2); +my$lastelem=$x->[-1]; +my$elems=@$x-1; +if((length($lastelem)<=3)&&($elems>1)){my$len=length($lastelem)&1; +print"$lastelem => " if DEBUG; +$lastelem.=substr($x->[-2].'0' x$BASE_LEN,0,$BASE_LEN); +$lastelem=$lastelem/10 if(length($lastelem)&1)!=$len; +print"$lastelem\n" if DEBUG;}my$r=$l%$BASE_LEN; +$l=int($l/$BASE_LEN); +print"l = $l " if DEBUG; +splice@$x,$l; +print"$lastelem (elems $elems) => " if DEBUG; +$lastelem=$lastelem/10 if($elems&1==1); +my$g=sqrt($lastelem); +$g=~s/\.//; +$r-=1 if$elems&1==0; +$x->[$l--]=int(substr($g.'0' x$r,0,$r+1)); +print"now ",$x->[-1]if DEBUG; +print" would have been ",int('1'.'0' x$r),"\n" if DEBUG; +$x->[$l--]=0 while($l>=0); +print"start x= ",$c->_str($x),"\n" if DEBUG; +my$two=$c->_two(); +my$last=$c->_zero(); +my$lastlast=$c->_zero(); +$steps=0 if DEBUG; +while($c->_acmp($last,$x)!=0&&$c->_acmp($lastlast,$x)!=0){$steps++ if DEBUG; +$lastlast=$c->_copy($last); +$last=$c->_copy($x); +$c->_add($x,$c->_div($c->_copy($y),$x)); +$c->_div($x,$two); +print" x= ",$c->_str($x),"\n" if DEBUG;}print"\nsteps in sqrt: $steps, " if DEBUG; +$c->_dec($x)if$c->_acmp($y,$c->_mul($c->_copy($x),$x))<0; +print" final ",$x->[-1],"\n" if DEBUG; +$x;}sub _root{my($c,$x,$n)=@_; +if(@$x==1&&@$n==1){my$y=int($x->[0]**(1/$n->[0])); +my$yp1=$y+1; +$y=$yp1 if$yp1**$n->[0]==$x->[0]; +$x->[0]=$y; +return$x;}if((@$x>1||$x->[0]>0)&&$c->_acmp($x,$n)<=0){my$one=$x->_one(); +@$x=@$one; +return$x;}my$b=$c->_as_bin($n); +if($b=~/0b1(0+)$/){my$count=length($1); +my$cnt=$count; +unshift@$x,0; +while($cnt-- >0){unshift@$x,0; +$c->_sqrt($x);}shift@$x; +return$x;}my$DEBUG=0; +my$x_str=$c->_str($x); +my$xm=".".$x_str; +my$xe=length($x_str); +my$log10x=log($xm)/log(10)+$xe; +my$log10y=$log10x/$c->_num($n); +my$ye=int$log10y; +my$ym=10**($log10y-$ye); +if($DEBUG){print"\n"; +print"xm = $xm\n"; +print"xe = $xe\n"; +print"log10x = $log10x\n"; +print"log10y = $log10y\n"; +print"ym = $ym\n"; +print"ye = $ye\n"; +print"\n";}my$d=$ye<15?$ye:15; +$ym*=10**$d; +$ye-=$d; +my$y_str=sprintf('%.0f',$ym)."0" x$ye; +my$y=$c->_new($y_str); +if($DEBUG){print"ym = $ym\n"; +print"ye = $ye\n"; +print"\n"; +print"y_str = $y_str (initial guess)\n"; +print"\n";}my$trial=$c->_pow($c->_copy($y),$n); +my$acmp=$c->_acmp($trial,$x); +if($acmp==0){@$x=@$y; +return$x;}my$lower; +my$upper; +my$delta=$c->_new("1".("0" x$ye)); +my$two=$c->_two(); +if($acmp<0){$lower=$y; +while($acmp<0){$upper=$c->_add($c->_copy($lower),$delta); +if($DEBUG){print"lower = $lower\n"; +print"upper = $upper\n"; +print"delta = $delta\n"; +print"\n";}$acmp=$c->_acmp($c->_pow($c->_copy($upper),$n),$x); +if($acmp==0){@$x=@$upper; +return$x;}$delta=$c->_mul($delta,$two);}}elsif($acmp>0){$upper=$y; +while($acmp>0){if($c->_acmp($upper,$delta)<=0){$lower=$c->_zero(); +last;}$lower=$c->_sub($c->_copy($upper),$delta); +if($DEBUG){print"lower = $lower\n"; +print"upper = $upper\n"; +print"delta = $delta\n"; +print"\n";}$acmp=$c->_acmp($c->_pow($c->_copy($lower),$n),$x); +if($acmp==0){@$x=@$lower; +return$x;}$delta=$c->_mul($delta,$two);}}my$one=$c->_one(); +{$delta=$c->_sub($c->_copy($upper),$lower); +if($c->_acmp($delta,$one)<=0){@$x=@$lower; +return$x;}if($DEBUG){print"lower = $lower\n"; +print"upper = $upper\n"; +print"delta = $delta\n"; +print"\n";}$delta=$c->_div($delta,$two); +my$middle=$c->_add($c->_copy($lower),$delta); +$acmp=$c->_acmp($c->_pow($c->_copy($middle),$n),$x); +if($acmp<0){$lower=$middle;}elsif($acmp>0){$upper=$middle;}else{@$x=@$middle; +return$x;}redo;}$x;}sub _and{my($c,$x,$y)=@_; +return$x if$c->_acmp($x,$y)==0; +my$m=$c->_one(); +my($xr,$yr); +my$mask=$AND_MASK; +my$x1=$c->_copy($x); +my$y1=$c->_copy($y); +my$z=$c->_zero(); +use integer; +until($c->_is_zero($x1)||$c->_is_zero($y1)){($x1,$xr)=$c->_div($x1,$mask); +($y1,$yr)=$c->_div($y1,$mask); +$c->_add($z,$c->_mul([0+$xr->[0]&0+$yr->[0]],$m)); +$c->_mul($m,$mask);}@$x=@$z; +return$x;}sub _xor{my($c,$x,$y)=@_; +return$c->_zero()if$c->_acmp($x,$y)==0; +my$m=$c->_one(); +my($xr,$yr); +my$mask=$XOR_MASK; +my$x1=$c->_copy($x); +my$y1=$c->_copy($y); +my$z=$c->_zero(); +use integer; +until($c->_is_zero($x1)||$c->_is_zero($y1)){($x1,$xr)=$c->_div($x1,$mask); +($y1,$yr)=$c->_div($y1,$mask); +$c->_add($z,$c->_mul([0+$xr->[0]^0+$yr->[0]],$m)); +$c->_mul($m,$mask);}$c->_add($z,$c->_mul($x1,$m))if!$c->_is_zero($x1); +$c->_add($z,$c->_mul($y1,$m))if!$c->_is_zero($y1); +@$x=@$z; +return$x;}sub _or{my($c,$x,$y)=@_; +return$x if$c->_acmp($x,$y)==0; +my$m=$c->_one(); +my($xr,$yr); +my$mask=$OR_MASK; +my$x1=$c->_copy($x); +my$y1=$c->_copy($y); +my$z=$c->_zero(); +use integer; +until($c->_is_zero($x1)||$c->_is_zero($y1)){($x1,$xr)=$c->_div($x1,$mask); +($y1,$yr)=$c->_div($y1,$mask); +$c->_add($z,$c->_mul([0+$xr->[0]|0+$yr->[0]],$m)); +$c->_mul($m,$mask);}$c->_add($z,$c->_mul($x1,$m))if!$c->_is_zero($x1); +$c->_add($z,$c->_mul($y1,$m))if!$c->_is_zero($y1); +@$x=@$z; +return$x;}sub _as_hex{my($c,$x)=@_; +return sprintf("0x%x",$x->[0])if@$x==1; +my$x1=$c->_copy($x); +my$es=''; +my($xr,$h,$x10000); +if($]>=5.006){$x10000=[0x10000]; +$h='h4';}else{$x10000=[0x1000]; +$h='h3';}while(@$x1!=1||$x1->[0]!=0){($x1,$xr)=$c->_div($x1,$x10000); +$es.=unpack($h,pack('V',$xr->[0]));}$es=reverse$es; +$es=~s/^[0]+//; +'0x'.$es;}sub _as_bin{my($c,$x)=@_; +if($]<=5.005&&@$x==1&&$x->[0]==0){my$t='0b0'; +return$t;}if(@$x==1&&$]>=5.006){my$t=sprintf("0b%b",$x->[0]); +return$t;}my$x1=$c->_copy($x); +my$es=''; +my($xr,$b,$x10000); +if($]>=5.006){$x10000=[0x10000]; +$b='b16';}else{$x10000=[0x1000]; +$b='b12';}while(!(@$x1==1&&$x1->[0]==0)){($x1,$xr)=$c->_div($x1,$x10000); +$es.=unpack($b,pack('v',$xr->[0]));}$es=reverse$es; +$es=~s/^[0]+//; +'0b'.$es;}sub _as_oct{my($c,$x)=@_; +return sprintf("0%o",$x->[0])if@$x==1; +my$x1=$c->_copy($x); +my$es=''; +my$xr; +my$x1000=[0100000]; +while(@$x1!=1||$x1->[0]!=0){($x1,$xr)=$c->_div($x1,$x1000); +$es.=reverse sprintf("%05o",$xr->[0]);}$es=reverse$es; +$es=~s/^0+//; +'0'.$es;}sub _from_oct{my($c,$os)=@_; +my$m=[0100000]; +my$d=5; +my$mul=$c->_one(); +my$x=$c->_zero(); +my$len=int((length($os)-1)/$d); +my$val; +my$i=-$d; +while($len>=0){$val=substr($os,$i,$d); +$val=CORE::oct($val); +$i-=$d; +$len--; +my$adder=[$val]; +$c->_add($x,$c->_mul($adder,$mul))if$val!=0; +$c->_mul($mul,$m)if$len>=0;}$x;}sub _from_hex{my($c,$hs)=@_; +my$m=$c->_new(0x10000000); +my$d=7; +my$mul=$c->_one(); +my$x=$c->_zero(); +my$len=int((length($hs)-2)/$d); +my$val; +my$i=-$d; +while($len>=0){$val=substr($hs,$i,$d); +$val=~s/^0x// if$len==0; +$val=CORE::hex($val); +$i-=$d; +$len--; +my$adder=[$val]; +if(CORE::length($val)>$BASE_LEN){$adder=$c->_new($val);}$c->_add($x,$c->_mul($adder,$mul))if$val!=0; +$c->_mul($mul,$m)if$len>=0;}$x;}sub _from_bin{my($c,$bs)=@_; +my$hs=$bs; +$hs=~s/^[+-]?0b//; +my$l=length($hs); +$hs='0' x(8-($l%8)).$hs if($l%8)!=0; +my$h='0x'.unpack('H*',pack('B*',$hs)); +$c->_from_hex($h);}sub _modinv{my($c,$x,$y)=@_; +if($c->_is_zero($y)){return undef,undef;}if($c->_is_one($y)){return$c->_zero(),'+';}my$u=$c->_zero(); +my$v=$c->_one(); +my$a=$c->_copy($y); +my$b=$c->_copy($x); +my$q; +my$sign=1; +{($a,$q,$b)=($b,$c->_div($a,$b)); +last if$c->_is_zero($b); +my$t=$c->_add($c->_mul($c->_copy($v),$q),$u); +$u=$v; +$v=$t; +$sign=-$sign; +redo;}return(undef,undef)unless$c->_is_one($a); +($v,$sign==1?'+':'-');}sub _modpow{my($c,$num,$exp,$mod)=@_; +if($c->_is_one($mod)){@$num=0; +return$num;}if($c->_is_zero($num)){if($c->_is_zero($exp)){@$num=1;}else{@$num=0;}return$num;}my$acc=$c->_copy($num); +my$t=$c->_one(); +my$expbin=$c->_as_bin($exp); +$expbin=~s/^0b//; +my$len=length($expbin); +while(--$len>=0){if(substr($expbin,$len,1)eq '1'){$t=$c->_mul($t,$acc); +$t=$c->_mod($t,$mod);}$acc=$c->_mul($acc,$acc); +$acc=$c->_mod($acc,$mod);}@$num=@$t; +$num;}sub _gcd{my($c,$x,$y)=@_; +if(@$x==1&&$x->[0]==0){if(@$y==1&&$y->[0]==0){@$x=0;}else{@$x=@$y;}return$x;}until(@$y==1&&$y->[0]==0){$c->_mod($x,$y); +my$tmp=$c->_copy($x); +@$x=@$y; +$y=$tmp;}return$x;}package Math::BigInt::Lib; +use 5.006001; +use strict; +use warnings; +our$VERSION='1.999813'; +use Carp; +use overload '+'=>sub{my$class=ref$_[0]; +my$x=$class->_copy($_[0]); +my$y=ref($_[1])?$_[1]:$class->_new($_[1]); +return$class->_add($x,$y);},'-'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_sub($x,$y);},'*'=>sub{my$class=ref$_[0]; +my$x=$class->_copy($_[0]); +my$y=ref($_[1])?$_[1]:$class->_new($_[1]); +return$class->_mul($x,$y);},'/'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_div($x,$y);},'%'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_mod($x,$y);},'**'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_pow($x,$y);},'<<'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$class->_num($_[0]); +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$_[0]; +$y=ref($_[1])?$class->_num($_[1]):$_[1];}return$class->_blsft($x,$y);},'>>'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_brsft($x,$y);},'<'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_acmp($x,$y)<0;},'<='=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_acmp($x,$y)<=0;},'>'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_acmp($x,$y)>0;},'>='=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_acmp($x,$y)>=0;},'=='=>sub{my$class=ref$_[0]; +my$x=$class->_copy($_[0]); +my$y=ref($_[1])?$_[1]:$class->_new($_[1]); +return$class->_acmp($x,$y)==0;},'!='=>sub{my$class=ref$_[0]; +my$x=$class->_copy($_[0]); +my$y=ref($_[1])?$_[1]:$class->_new($_[1]); +return$class->_acmp($x,$y)!=0;},'<=>'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_acmp($x,$y);},'&'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_and($x,$y);},'|'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_or($x,$y);},'^'=>sub{my$class=ref$_[0]; +my($x,$y); +if($_[2]){$y=$_[0]; +$x=ref($_[1])?$_[1]:$class->_new($_[1]);}else{$x=$class->_copy($_[0]); +$y=ref($_[1])?$_[1]:$class->_new($_[1]);}return$class->_xor($x,$y);},'abs'=>sub{$_[0]},'sqrt'=>sub{my$class=ref$_[0]; +return$class->_sqrt($class->_copy($_[0]));},'int'=>sub{$_[0]},'bool'=>sub{ref($_[0])->_is_zero($_[0])?'':1;},'""'=>sub{ref($_[0])->_str($_[0]);},'0+'=>sub{ref($_[0])->_num($_[0]);},'='=>sub{ref($_[0])->_copy($_[0]);},; +sub api_version (){croak"@{[(caller 0)[3]]} method not implemented";}sub _new{croak"@{[(caller 0)[3]]} method not implemented";}sub _zero{my$class=shift; +return$class->_new("0");}sub _one{my$class=shift; +return$class->_new("1");}sub _two{my$class=shift; +return$class->_new("2");}sub _ten{my$class=shift; +return$class->_new("10");}sub _1ex{my($class,$exp)=@_; +$exp=$class->_num($exp)if ref($exp); +return$class->_new("1".("0" x$exp));}sub _copy{my($class,$x)=@_; +return$class->_new($class->_str($x));}sub import{}sub _str{croak"@{[(caller 0)[3]]} method not implemented";}sub _num{my($class,$x)=@_; +0+$class->_str($x);}sub _add{croak"@{[(caller 0)[3]]} method not implemented";}sub _sub{croak"@{[(caller 0)[3]]} method not implemented";}sub _mul{my($class,$x,$y)=@_; +my$sum=$class->_zero(); +my$i=$class->_zero(); +while($class->_acmp($i,$y)<0){$sum=$class->_add($sum,$x); +$i=$class->_inc($i);}return$sum;}sub _div{my($class,$x,$y)=@_; +croak"@{[(caller 0)[3]]} requires non-zero divisor" if$class->_is_zero($y); +my$r=$class->_copy($x); +my$q=$class->_zero(); +while($class->_acmp($r,$y)>=0){$q=$class->_inc($q); +$r=$class->_sub($r,$y);}return$q,$r if wantarray; +return$q;}sub _inc{my($class,$x)=@_; +$class->_add($x,$class->_one());}sub _dec{my($class,$x)=@_; +$class->_sub($x,$class->_one());}sub _acmp{my($class,$x,$y)=@_; +my$xstr=$class->_str($x); +my$ystr=$class->_str($y); +length($xstr)<=>length($ystr)||$xstr cmp$ystr;}sub _len{my($class,$x)=@_; +CORE::length($class->_str($x));}sub _alen{my($class,$x)=@_; +$class->_len($x);}sub _digit{my($class,$x,$n)=@_; +substr($class->_str($x),-($n+1),1);}sub _zeros{my($class,$x)=@_; +my$str=$class->_str($x); +$str=~/[^0](0*)\z/?CORE::length($1):0;}sub _is_zero{my($class,$x)=@_; +$class->_str($x)==0;}sub _is_even{my($class,$x)=@_; +substr($class->_str($x),-1,1)%2==0;}sub _is_odd{my($class,$x)=@_; +substr($class->_str($x),-1,1)%2!=0;}sub _is_one{my($class,$x)=@_; +$class->_str($x)==1;}sub _is_two{my($class,$x)=@_; +$class->_str($x)==2;}sub _is_ten{my($class,$x)=@_; +$class->_str($x)==10;}sub _check{my($class,$x)=@_; +return"Input is undefined" unless defined$x; +return"$x is not a reference" unless ref($x); +return 0;}sub _mod{my($class,$x,$y)=@_; +croak"@{[(caller 0)[3]]} requires non-zero second operand" if$class->_is_zero($y); +if($class->can('_div')){$x=$class->_copy($x); +my($q,$r)=$class->_div($x,$y); +return$r;}else{my$r=$class->_copy($x); +while($class->_acmp($r,$y)>=0){$r=$class->_sub($r,$y);}return$r;}}sub _rsft{my($class,$x,$n,$b)=@_; +$b=$class->_new($b)unless ref$b; +return scalar$class->_div($x,$class->_pow($class->_copy($b),$n));}sub _lsft{my($class,$x,$n,$b)=@_; +$b=$class->_new($b)unless ref$b; +return$class->_mul($x,$class->_pow($class->_copy($b),$n));}sub _pow{my($class,$x,$y)=@_; +if($class->_is_zero($y)){return$class->_one();}if(($class->_is_one($x))||($class->_is_one($y))){return$x;}if($class->_is_zero($x)){return$class->_zero();}my$pow2=$class->_one(); +my$y_bin=$class->_as_bin($y); +$y_bin=~s/^0b//; +my$len=length($y_bin); +while(--$len>0){$pow2=$class->_mul($pow2,$x)if substr($y_bin,$len,1)eq '1'; +$x=$class->_mul($x,$x);}$x=$class->_mul($x,$pow2); +return$x;}sub _nok{my($class,$n,$k)=@_; +{my$twok=$class->_mul($class->_two(),$class->_copy($k)); +if($class->_acmp($twok,$n)>0){$k=$class->_sub($class->_copy($n),$k);}}if($class->_is_zero($k)){return$class->_one();}my$n_orig=$class->_copy($n); +$n=$class->_sub($n,$k); +$n=$class->_inc($n); +my$f=$class->_copy($n); +$f=$class->_inc($f); +my$d=$class->_two(); +while($class->_acmp($f,$n_orig)<=0){$n=$class->_mul($n,$f); +$n=$class->_div($n,$d); +$f=$class->_inc($f); +$d=$class->_inc($d);}return$n;}sub _fac{my($class,$x)=@_; +my$two=$class->_two(); +if($class->_acmp($x,$two)<0){return$class->_one();}my$i=$class->_copy($x); +while($class->_acmp($i,$two)>0){$i=$class->_dec($i); +$x=$class->_mul($x,$i);}return$x;}sub _dfac{my($class,$x)=@_; +my$two=$class->_two(); +if($class->_acmp($x,$two)<0){return$class->_one();}my$i=$class->_copy($x); +while($class->_acmp($i,$two)>0){$i=$class->_sub($i,$two); +$x=$class->_mul($x,$i);}return$x;}sub _log_int{my($class,$x,$base)=@_; +return if$class->_is_zero($x); +$base=$class->_new(2)unless defined($base); +$base=$class->_new($base)unless ref($base); +return if$class->_is_zero($base)||$class->_is_one($base); +if($class->_is_one($x)){return$class->_zero(),1;}my$cmp=$class->_acmp($x,$base); +if($cmp==0){return$class->_one(),1;}if($cmp<0){return$class->_zero(),0;}my$y; +{my$x_str=$class->_str($x); +my$b_str=$class->_str($base); +my$xm=".".$x_str; +my$bm=".".$b_str; +my$xe=length($x_str); +my$be=length($b_str); +my$log10=log(10); +my$guess=int((log($xm)+$xe*$log10)/(log($bm)+$be*$log10)); +$y=$class->_new($guess);}my$trial=$class->_pow($class->_copy($base),$y); +my$acmp=$class->_acmp($trial,$x); +return$y,1 if$acmp==0; +while($acmp<0){$trial=$class->_mul($trial,$base); +$y=$class->_inc($y); +$acmp=$class->_acmp($trial,$x);}while($acmp>0){$trial=$class->_div($trial,$base); +$y=$class->_dec($y); +$acmp=$class->_acmp($trial,$x);}return$y,1 if$acmp==0; +return$y,0;}sub _sqrt{my($class,$y)=@_; +return$y if$class->_is_zero($y); +my$y_str=$class->_str($y); +my$y_len=length($y_str); +my$xm; +my$xe; +if($y_len%2==0){$xm=sqrt(".".$y_str); +$xe=$y_len/2; +$xm=sprintf"%.0f",int($xm*1e15); +$xe-=15;}else{$xm=sqrt(".0".$y_str); +$xe=($y_len+1)/2; +$xm=sprintf"%.0f",int($xm*1e16); +$xe-=16;}my$x; +if($xe<0){$x=substr$xm,0,length($xm)+$xe;}else{$x=$xm.("0" x$xe);}$x=$class->_new($x); +my$xsq=$class->_mul($class->_copy($x),$x); +my$acmp=$class->_acmp($xsq,$y); +my$two; +$two=$class->_two()if$acmp!=0; +if($acmp<0){my$numer=$class->_sub($class->_copy($y),$xsq); +my$denom=$class->_mul($class->_copy($two),$x); +my$delta=$class->_div($numer,$denom); +unless($class->_is_zero($delta)){$x=$class->_add($x,$delta); +$xsq=$class->_mul($class->_copy($x),$x); +$acmp=$class->_acmp($xsq,$y);}}while($acmp>0){my$numer=$class->_sub($xsq,$y); +my$denom=$class->_mul($class->_copy($two),$x); +my$delta=$class->_div($numer,$denom); +last if$class->_is_zero($delta); +$x=$class->_sub($x,$delta); +$xsq=$class->_mul($class->_copy($x),$x); +$acmp=$class->_acmp($xsq,$y);}while($acmp>0){$x=$class->_dec($x); +$xsq=$class->_mul($class->_copy($x),$x); +$acmp=$class->_acmp($xsq,$y);}return$x;}sub _root{my($class,$y,$n)=@_; +return$y if$class->_is_zero($y)||$class->_is_one($y)||$class->_is_one($n); +return$class->_one()if$class->_acmp($y,$n)<=0; +my$DEBUG=0; +my$y_str=$class->_str($y); +my$ym=".".$y_str; +my$ye=length($y_str); +my$log10y=log($ym)/log(10)+$ye; +my$log10x=$log10y/$class->_num($n); +my$xe=int$log10x; +my$xm=10**($log10x-$xe); +if($DEBUG){print"\n"; +print"y_str = $y_str\n"; +print"ym = $ym\n"; +print"ye = $ye\n"; +print"log10y = $log10y\n"; +print"log10x = $log10x\n"; +print"xm = $xm\n"; +print"xe = $xe\n";}my$d=$xe<15?$xe:15; +$xm*=10**$d; +$xe-=$d; +if($DEBUG){print"\n"; +print"xm = $xm\n"; +print"xe = $xe\n";}my$xm_int=int($xm); +my$x_str=sprintf '%.0f',$xm>$xm_int?$xm_int+1:$xm_int; +$x_str.="0" x$xe; +my$x=$class->_new($x_str); +if($DEBUG){print"xm = $xm\n"; +print"xe = $xe\n"; +print"\n"; +print"x_str = $x_str (initial guess)\n"; +print"\n";}my$nm1=$class->_dec($class->_copy($n)); +my$xpownm1=$class->_pow($class->_copy($x),$nm1); +my$xpown=$class->_mul($class->_copy($xpownm1),$x); +my$acmp=$class->_acmp($xpown,$y); +if($DEBUG){print"\n"; +print"x = ",$class->_str($x),"\n"; +print"x^n = ",$class->_str($xpown),"\n"; +print"y = ",$class->_str($y),"\n"; +print"acmp = $acmp\n";}if($acmp<0){my$numer=$class->_sub($class->_copy($y),$xpown); +my$denom=$class->_mul($class->_copy($n),$xpownm1); +my$delta=$class->_div($numer,$denom); +if($DEBUG){print"\n"; +print"numer = ",$class->_str($numer),"\n"; +print"denom = ",$class->_str($denom),"\n"; +print"delta = ",$class->_str($delta),"\n";}unless($class->_is_zero($delta)){$x=$class->_add($x,$delta); +$xpownm1=$class->_pow($class->_copy($x),$nm1); +$xpown=$class->_mul($class->_copy($xpownm1),$x); +$acmp=$class->_acmp($xpown,$y); +if($DEBUG){print"\n"; +print"x = ",$class->_str($x),"\n"; +print"x^n = ",$class->_str($xpown),"\n"; +print"y = ",$class->_str($y),"\n"; +print"acmp = $acmp\n";}}}while($acmp>0){my$numer=$class->_sub($class->_copy($xpown),$y); +my$denom=$class->_mul($class->_copy($n),$xpownm1); +if($DEBUG){print"numer = ",$class->_str($numer),"\n"; +print"denom = ",$class->_str($denom),"\n";}my$delta=$class->_div($numer,$denom); +if($DEBUG){print"delta = ",$class->_str($delta),"\n";}last if$class->_is_zero($delta); +$x=$class->_sub($x,$delta); +$xpownm1=$class->_pow($class->_copy($x),$nm1); +$xpown=$class->_mul($class->_copy($xpownm1),$x); +$acmp=$class->_acmp($xpown,$y); +if($DEBUG){print"\n"; +print"x = ",$class->_str($x),"\n"; +print"x^n = ",$class->_str($xpown),"\n"; +print"y = ",$class->_str($y),"\n"; +print"acmp = $acmp\n";}}while($acmp>0){$x=$class->_dec($x); +$xpown=$class->_pow($class->_copy($x),$n); +$acmp=$class->_acmp($xpown,$y);}return$x;}sub _and{my($class,$x,$y)=@_; +return$x if$class->_acmp($x,$y)==0; +my$m=$class->_one(); +my$mask=$class->_new("32768"); +my($xr,$yr); +my$xc=$class->_copy($x); +my$yc=$class->_copy($y); +my$z=$class->_zero(); +until($class->_is_zero($xc)||$class->_is_zero($yc)){($xc,$xr)=$class->_div($xc,$mask); +($yc,$yr)=$class->_div($yc,$mask); +my$bits=$class->_new($class->_num($xr)&$class->_num($yr)); +$z=$class->_add($z,$class->_mul($bits,$m)); +$m=$class->_mul($m,$mask);}return$z;}sub _xor{my($class,$x,$y)=@_; +return$class->_zero()if$class->_acmp($x,$y)==0; +my$m=$class->_one(); +my$mask=$class->_new("32768"); +my($xr,$yr); +my$xc=$class->_copy($x); +my$yc=$class->_copy($y); +my$z=$class->_zero(); +until($class->_is_zero($xc)||$class->_is_zero($yc)){($xc,$xr)=$class->_div($xc,$mask); +($yc,$yr)=$class->_div($yc,$mask); +my$bits=$class->_new($class->_num($xr)^$class->_num($yr)); +$z=$class->_add($z,$class->_mul($bits,$m)); +$m=$class->_mul($m,$mask);}$z=$class->_add($z,$class->_mul($xc,$m))unless$class->_is_zero($xc); +$z=$class->_add($z,$class->_mul($yc,$m))unless$class->_is_zero($yc); +return$z;}sub _or{my($class,$x,$y)=@_; +return$x if$class->_acmp($x,$y)==0; +my$m=$class->_one(); +my$mask=$class->_new("32768"); +my($xr,$yr); +my$xc=$class->_copy($x); +my$yc=$class->_copy($y); +my$z=$class->_zero(); +until($class->_is_zero($xc)||$class->_is_zero($yc)){($xc,$xr)=$class->_div($xc,$mask); +($yc,$yr)=$class->_div($yc,$mask); +my$bits=$class->_new($class->_num($xr)|$class->_num($yr)); +$z=$class->_add($z,$class->_mul($bits,$m)); +$m=$class->_mul($m,$mask);}$z=$class->_add($z,$class->_mul($xc,$m))unless$class->_is_zero($xc); +$z=$class->_add($z,$class->_mul($yc,$m))unless$class->_is_zero($yc); +return$z;}sub _to_bin{my($class,$x)=@_; +my$str=''; +my$tmp=$class->_copy($x); +my$chunk=$class->_new("16777216"); +my$rem; +until($class->_acmp($tmp,$chunk)<0){($tmp,$rem)=$class->_div($tmp,$chunk); +$str=sprintf("%024b",$class->_num($rem)).$str;}unless($class->_is_zero($tmp)){$str=sprintf("%b",$class->_num($tmp)).$str;}return length($str)?$str:'0';}sub _to_oct{my($class,$x)=@_; +my$str=''; +my$tmp=$class->_copy($x); +my$chunk=$class->_new("16777216"); +my$rem; +until($class->_acmp($tmp,$chunk)<0){($tmp,$rem)=$class->_div($tmp,$chunk); +$str=sprintf("%08o",$class->_num($rem)).$str;}unless($class->_is_zero($tmp)){$str=sprintf("%o",$class->_num($tmp)).$str;}return length($str)?$str:'0';}sub _to_hex{my($class,$x)=@_; +my$str=''; +my$tmp=$class->_copy($x); +my$chunk=$class->_new("16777216"); +my$rem; +until($class->_acmp($tmp,$chunk)<0){($tmp,$rem)=$class->_div($tmp,$chunk); +$str=sprintf("%06x",$class->_num($rem)).$str;}unless($class->_is_zero($tmp)){$str=sprintf("%x",$class->_num($tmp)).$str;}return length($str)?$str:'0';}sub _as_bin{my($class,$x)=@_; +return '0b'.$class->_to_bin($x);}sub _as_oct{my($class,$x)=@_; +return '0'.$class->_to_oct($x);}sub _as_hex{my($class,$x)=@_; +return '0x'.$class->_to_hex($x);}sub _to_bytes{my($class,$x)=@_; +my$str=''; +my$tmp=$class->_copy($x); +my$chunk=$class->_new("65536"); +my$rem; +until($class->_is_zero($tmp)){($tmp,$rem)=$class->_div($tmp,$chunk); +$str=pack('n',$class->_num($rem)).$str;}$str=~s/^\0+//; +return length($str)?$str:"\x00";}*_as_bytes=\&_to_bytes; +sub _from_hex{my($class,$hex)=@_; +$hex=~s/^0[xX]//; +my$len=length$hex; +my$rem=1+($len-1)%7; +my$ret=$class->_new(int hex substr$hex,0,$rem); +return$ret if$rem==$len; +my$shift=$class->_new(1 <<(4*7)); +for(my$offset=$rem;$offset<$len;$offset+=7){my$part=int hex substr$hex,$offset,7; +$ret=$class->_mul($ret,$shift); +$ret=$class->_add($ret,$class->_new($part));}return$ret;}sub _from_oct{my($class,$oct)=@_; +my$len=length$oct; +my$rem=1+($len-1)%10; +my$ret=$class->_new(int oct substr$oct,0,$rem); +return$ret if$rem==$len; +my$shift=$class->_new(1 <<(3*10)); +for(my$offset=$rem;$offset<$len;$offset+=10){my$part=int oct substr$oct,$offset,10; +$ret=$class->_mul($ret,$shift); +$ret=$class->_add($ret,$class->_new($part));}return$ret;}sub _from_bin{my($class,$bin)=@_; +$bin=~s/^0[bB]//; +my$len=length$bin; +my$rem=1+($len-1)%31; +my$ret=$class->_new(int oct '0b'.substr$bin,0,$rem); +return$ret if$rem==$len; +my$shift=$class->_new(1 <<31); +for(my$offset=$rem;$offset<$len;$offset+=31){my$part=int oct '0b'.substr$bin,$offset,31; +$ret=$class->_mul($ret,$shift); +$ret=$class->_add($ret,$class->_new($part));}return$ret;}sub _from_bytes{my($class,$str)=@_; +my$x=$class->_zero(); +my$base=$class->_new("256"); +my$n=length($str); +for(my$i=0;$i<$n;++$i){$x=$class->_mul($x,$base); +my$byteval=$class->_new(unpack 'C',substr($str,$i,1)); +$x=$class->_add($x,$byteval);}return$x;}sub _modinv{my($class,$x,$y)=@_; +if($class->_is_zero($y)){return(undef,undef);}if($class->_is_one($y)){return($class->_zero(),'+');}my$u=$class->_zero(); +my$v=$class->_one(); +my$a=$class->_copy($y); +my$b=$class->_copy($x); +my$q; +my$sign=1; +{($a,$q,$b)=($b,$class->_div($a,$b)); +last if$class->_is_zero($b); +my$vq=$class->_mul($class->_copy($v),$q); +my$t=$class->_add($vq,$u); +$u=$v; +$v=$t; +$sign=-$sign; +redo;}return(undef,undef)unless$class->_is_one($a); +($v,$sign==1?'+':'-');}sub _modpow{my($class,$num,$exp,$mod)=@_; +if($class->_is_one($mod)){return$class->_zero();}if($class->_is_zero($num)){return$class->_is_zero($exp)?$class->_one():$class->_zero();}my$acc=$class->_copy($num); +my$t=$class->_one(); +my$expbin=$class->_as_bin($exp); +$expbin=~s/^0b//; +my$len=length($expbin); +while(--$len>=0){if(substr($expbin,$len,1)eq '1'){$t=$class->_mul($t,$acc); +$t=$class->_mod($t,$mod);}$acc=$class->_mul($acc,$acc); +$acc=$class->_mod($acc,$mod);}return$t;}sub _gcd{my($class,$x,$y)=@_; +if($class->_acmp($x,$y)==0){return$class->_copy($x);}if($class->_is_zero($x)){if($class->_is_zero($y)){return$class->_zero();}else{return$class->_copy($y);}}else{if($class->_is_zero($y)){return$class->_copy($x);}else{$x=$class->_copy($x); +until($class->_is_zero($y)){$x=$class->_mod($x,$y); +my$tmp=$x; +$x=$class->_copy($y); +$y=$tmp;}return$x;}}}sub _lcm{my($class,$x,$y)=@_; +return$class->_zero()if($class->_is_zero($x)||$class->_is_zero($y)); +my$gcd=$class->_gcd($class->_copy($x),$y); +$x=$class->_div($x,$gcd); +$x=$class->_mul($x,$y); +return$x;}sub _lucas{my($class,$n)=@_; +$n=$class->_num($n)if ref$n; +if(wantarray){my@y; +push@y,$class->_two(); +return@y if$n==0; +push@y,$class->_one(); +return@y if$n==1; +for(my$i=2;$i<=$n;++$i){$y[$i]=$class->_add($class->_copy($y[$i-1]),$y[$i-2]);}return@y;}require Scalar::Util; +return$class->_two()if$n==0; +return$class->_add(scalar$class->_fib($n-1),scalar$class->_fib($n+1));}sub _fib{my($class,$n)=@_; +$n=$class->_num($n)if ref$n; +if(wantarray){my@y; +push@y,$class->_zero(); +return@y if$n==0; +push@y,$class->_one(); +return@y if$n==1; +for(my$i=2;$i<=$n;++$i){$y[$i]=$class->_add($class->_copy($y[$i-1]),$y[$i-2]);}return@y;}my$cache={}; +my$two=$class->_two(); +my$fib; +$fib=sub{my$n=shift; +return$class->_zero()if$n<=0; +return$class->_one()if$n<=2; +return$cache->{$n}if exists$cache->{$n}; +my$k=int($n/2); +my$a=$fib->($k+1); +my$b=$fib->($k); +my$y; +if($n%2==1){$y=$class->_add($class->_mul($class->_copy($a),$a),$class->_mul($class->_copy($b),$b));}else{$y=$class->_mul($class->_sub($class->_mul($class->_copy($two),$a),$b),$b);}$cache->{$n}=$y; +return$y;}; +return$fib->($n);}1; diff --git a/src/main/resources/project/pdk/FlowPDF/StepParameters.pm b/src/main/resources/project/pdk/FlowPDF/StepParameters.pm new file mode 100644 index 00000000..49141795 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/StepParameters.pm @@ -0,0 +1,307 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::StepParameters + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class represents current step parameters, that are defined for current procedure step or current pipeline task. + +=head1 SYNOPSIS + +To get a FlowPDF::StepParameters object you need to use getStepParameters() method from L. + +=head1 METHODS + +=cut + +package FlowPDF::StepParameters; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + parametersList => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Scalar()), + parameters => FlowPDF::Types::Reference('HASH'), +}); + +use strict; +use warnings; +use Carp; + +use FlowPDF::Helpers qw/bailOut/; + +# sub isParameterExists {}; +# sub getParameter {}; +# sub setParameter {}; +# sub setCredential {}; +# sub getCredential {}; + + +=head2 isParameterExists() + +=head3 Description + +Returns true if parameter exists in the current step. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (Boolean) True if parameter exists. + +=back + +=head3 Usage + +%%%LANG=perl%%% + + if ($stepParameters->isParameterExists('query')) { + ...; + } + +%%%LANG%%% + +=cut + +sub isParameterExists { + my ($self, $parameterName) = @_; + + my $p = $self->getParameters(); + if (exists $p->{$parameterName}) { + return 1; + } + return 0; +} + +=head2 getParameter($parameterName) + +=head3 Description + +Returns an L object or L object. + +=head3 Parameters + +=over 4 + +=item (String) Name of parameter to get. + +=back + +=head3 Returns + +=over 4 + +=item (L|L) Parameter or credential by it's name + +=back + +=head3 Usage + +To get parameter object: + +%%%LANG=perl%%% + + my $query = $stepParameters->getParameter('query'); + +%%%LANG%%% + +If your parameter is an L object, you can get its value either by getValue() method, or using string context: + +%%%LANG=perl%%% + + print "Query:", $query->getValue(); + +%%%LANG%%% + +Or: + +%%%LANG=perl%%% + + print "Query: $query" + +%%%LANG%%% + +If your parameter is L, follow its own documentation. + +=cut + + + +sub getParameter { + my ($self, $parameterName) = @_; + + if (!defined $parameterName) { + bailOut("Parameter name is mandatory parameter"); + } + if (!$self->isParameterExists($parameterName)) { + return undef; + } + + return $self->getParameters()->{$parameterName}; +} + + +=head2 getRequiredParameter($parameterName) + +=head3 Description + +Returns an L object or L object if this parameter exists. + +If parameter does not exist, this method aborts execution with exit code 1. + +This exception can't be catched. + +=head3 Parameters + +=over 4 + +=item (String) Name of parameter to get. + +=back + +=head3 Returns + +=over 4 + +=item (L|L) Parameter or credential by it's name + +=back + +=head3 Usage + +To get parameter object: + +%%%LANG=perl%%% + + my $query = $stepParameters->getRequiredParameter('query'); + +%%%LANG%%% + +If your parameter is an L object, you can get its value either by getValue() method, or using string context: + +%%%LANG=perl%%% + + print "Query:", $query->getValue(); + +%%%LANG%%% + +Or: + +%%%LANG=perl%%% + + print "Query: $query" + +%%%LANG%%% + +If your parameter is L, follow its own documentation. + +=cut + +# TODO: Switch from BailOut to exception here. +sub getRequiredParameter { + my ($self, $parameterName) = @_; + + my $value = $self->getParameter($parameterName); + if (!defined $value) { + bailOut("Required parameter $parameterName does not exist"); + } + + return $value; +} + + +=head2 asHashref() + +=head3 Description + +This function returns a HASH reference that is made from FlowPDF::StepParameters object. +Where key is a name of parameter and value is a value of parameter. + +For credentials the same pattern as for getRuntimeParameters from L is being followed. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (HASH reference) A HASH reference to a HASH with step parameters. + +=back + +=head3 Exceptions + +=over 4 + +=item None + +=back + +=head3 Usage + +%%%LANG=perl%%% + + my $stepParameters = $context->getStepParameters()->asHashref(); + logInfo("Application path is: $stepParameters->{applicationPath}"); + +%%%LANG%%% + +=cut + +sub asHashref { + my ($self) = @_; + + my $retval = {}; + my $parametersList = $self->getParametersList(); + for my $key (@$parametersList) { + my $row = $self->getParameter($key); + + next unless $row; + if (ref $row eq 'FlowPDF::Credential') { + my $prefix = ''; + + if ($key =~ m/^(.*?_)credential/) { + $prefix = $1; + } + + my $userName = $row->getUserName(); + my $password = $row->getSecretValue(); + + if ($userName) { + $retval->{$prefix . 'user'} = $userName; + } + if ($password) { + $retval->{$prefix . 'password'} = $password; + } + } + else { + $retval->{$key} = $row->getValue(); + } + } + + return $retval; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/StepResult.pm b/src/main/resources/project/pdk/FlowPDF/StepResult.pm new file mode 100644 index 00000000..7d185ab6 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/StepResult.pm @@ -0,0 +1,628 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::StepResult + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class sets various output results of step run in pipeline of procedure context. + +=head1 METHODS + +=cut + +package FlowPDF::StepResult; + +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; +__PACKAGE__->defineClass({ + context => FlowPDF::Types::Reference('FlowPDF::Context'), + actions => FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('FlowPDF::StepResult::Action')), + cache => FlowPDF::Types::Reference('HASH'), + isApplied => FlowPDF::Types::Enum(1, 0) +}); + +use strict; +use warnings; +use Carp; +use Data::Dumper; +use FlowPDF::StepResult::Action; +use FlowPDF::Log; +use FlowPDF::Log::FW; +use FlowPDF::EF::OutputParameters; +use FlowPDF::Helpers qw/inArray/; + +sub getCacheForAction { + my ($self, $actionType, $name) = @_; + + my $cache = $self->getCache(); + if ($cache->{$actionType} && $cache->{$actionType}->{$name}) { + return $cache->{$actionType}->{$name}; + } + return ''; +} + +sub setCacheForAction { + my ($self, $actionType, $name, $value) = @_; + + fwLogDebug("Parameters for set cache: '$actionType', '$name', '$value'"); + my $cache = $self->getCache(); + my $line = $self->getCacheForAction($actionType, $name); + if ($line) { + $line = $line . "\n" . $value; + } + else { + $line = $value; + } + $cache->{$actionType}->{$name} = $line; + return $line; +} + + +=head2 setJobStepOutcome($jobStepOutcome) + +=head3 Description + +Schedules setting of a job step outcome. Could be warning, success or an error. + +=head3 Parameters + +=over 4 + +=item (Required)(String) desired procedure/task outcome. Could be one of: warning, success, error. + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->setJobStepOutcome('warning'); + +%%%LANG%%% + +=cut + +sub setJobStepOutcome { + my ($self, $path, $outcome) = @_; + + if ($path && !$outcome) { + $outcome = $path; + $path = '/myJobStep/outcome'; + } + if ($outcome !~ m/^(?:error|warning|success)$/s) { + croak "Outcome is expected to be one of: error, warning, success. Got: $outcome\n"; + } + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setJobOutcome', + entityName => $path, + entityValue => $outcome + }); + + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; + +} + + +=head2 setPipelineSummary($pipelineSummaryName, $pipelineSummaryText) + +=head3 Description + +Sets the summary of the current pipeline task. + +Summaries of pipelien tasks are available on pipeline stage execution result under the "Summary" link. + +Following code will set pipeline summary with name 'Procedure Exectuion Result:' to 'All tests are ok' + +=head3 Parameters + +=over + +=item (Required)(String) Pipeline Summary Property Text + +=item (Required)(String) Pipeline Summary Value. + +=back + +=head3 Returns + +=over + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->setPipelineSummary('Procedure Execution Result:', 'All tests are ok'); + +%%%LANG%%% + +=cut + +sub setPipelineSummary { + my ($self, $pipelineProperty, $pipelineSummary) = @_; + + if (!$pipelineProperty || !$pipelineSummary) { + croak "pipelineProperty and pipelineSummary are mandatory.\n"; + } + + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setPipelineSummary', + entityName => '/myPipelineStageRuntime/ec_summary/' . $pipelineProperty, + entityValue => $pipelineSummary + }); + + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + + +=head2 setJobStepSummary($jobStepSummary) + +=head3 Description + +Sets the summary of the current B. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Job Step Summary + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->setJobStepSummary('All tests are ok in this step.'); + +%%%LANG%%% + +=cut + +sub setJobStepSummary { + my ($self, $summary) = @_; + + if (!$summary) { + croak "Summary is mandatory in setJobStepSummary\n"; + } + + my $property = '/myJobStep/summary'; + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setJobStepSummary', + entityName => $property, + entityValue => $summary, + }); + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + + +=head2 setJobSummary($jobSummary) + +=head3 Description + +Sets the summary of the current B. + +=head3 Parameters + +=over 4 + +=item (Requried)(String) Job Summary + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->setJobSummary('All tests are ok'); + +%%%LANG%%% + +=cut + +sub setJobSummary { + my ($self, $summary) = @_; + + if (!$summary) { + croak "Summary is mandatory in setJobStepSummary\n"; + } + + my $property = '/myCall/summary'; + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setJobSummary', + entityName => $property, + entityValue => $summary + }); + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + +=head2 setOutcomeProperty($propertyPath, $propertyValue) + +=head3 Description + +Sets the outcome property. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Property Path + +=item (Required)(String) Value of property to be set + +=back + +=head3 Returns + +=over + +=item (FlowPDF::StepResult) self + +=back + +%%%LANG=perl%%% + + $stepResult->setOutcomeProperty('/myJob/buildNumber', '42'); + +%%%LANG%%% + +=cut + + +sub setOutcomeProperty { + my ($self, $propertyPath, $propertyValue) = @_; + + if (!defined $propertyPath || !defined $propertyValue) { + croak "PropertyPath and PropertyValue are mandatory"; + } + + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setOutcomeProperty', + entityName => $propertyPath, + entityValue => $propertyValue + }); + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + + +=head2 setOutputParameter($parameterName, $parameterValue) + +=head3 Description + +Sets an output parameter for a job. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Output parameter name + +=item (Required)(String) Output parameter value + +=back + +=head3 Returns + +=over + +=item (FlowPDF::StepResult) self + +=back + +%%%LANG=perl%%% + + $stepResult->setOutputParameter('Last Build Number', '42'); + +%%%LANG%%% + +=cut + +sub setOutputParameter { + my ($self, $name, $value) = @_; + + if (!defined $name || !defined $value) { + croak "Parameter name and parameter value are mandatory when set output parameter is scheduled"; + } + + my $action = FlowPDF::StepResult::Action->new({ + actionType => 'setOutputParameter', + entityName => $name, + entityValue => $value + }); + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + + +=head2 setReportUrl($reportName, $reportUrl) + +=head3 Description + +Sets a report and it's URL for the job. +If it is being invoked in pipeline runs, sets also a property with a link to the pipeline summary. + +=head3 Parameters + +=over 4 + +=item (Required)(String) Report name + +=item (Required)(String) Report URL + +=back + +=head3 Returns + +=over + +=item (FlowPDF::StepResult) self + +=back + +%%%LANG=perl%%% + + $stepResult->setReportUrl('Build Link #42', 'http://localhost:8080/job/HelloWorld/42'); + +%%%LANG%%% + +=cut + +sub setReportUrl { + my ($self, $reportName, $reportUrl) = @_; + + if (!defined $reportName || !defined $reportUrl) { + croak "Report name and report url are mandatory for setReportUrl."; + } + + # if we have a pipeline run, we need to set an ec summary. + if ($self->getContext()->getRunContext() eq 'pipeline') { + my $summary = qq|Download Report|; + $self->setPipelineSummary($reportName . ':', $summary); + } + + $self->setOutcomeProperty(qq|/myJob/report-urls/$reportName|, $reportUrl); + + return $self; +} + + +sub newAction { + my ($self, @params) = @_; + + my $action = FlowPDF::StepResult::Action->new(@params); + my $actions = $self->getActions(); + push @$actions, $action; + $self->setIsApplied(0); + return $self; +} + +=head2 apply() + +=head3 Description + +Applies scheduled changes without schedule cleanup in queue order: first scheduled, first executed. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +%%%LANG=perl%%% + + $stepResult->apply(); + +%%%LANG%%% + +=cut + +sub apply { + my ($self) = @_; + + $self->setIsApplied(1); + my $actions = $self->getActions(); + for my $action (@$actions) { + if (!ref $action) { + croak "Reference is expected for action. Got scalar."; + } + if (ref $action ne 'FlowPDF::StepResult::Action') { + croak "FlowPDF::StepResult::Action is expected. Got: ", ref $action; + } + + my $currentAction = $action->getActionType(); + my $left = $action->getEntityName(); + my $right = $action->getEntityValue(); + my $ec = $self->getContext()->getEc(); + if ($currentAction eq 'setJobOutcome' || $currentAction eq 'setJobStepOutcome') { + $ec->setProperty($left, $right); + } + # elsif ($currentAction eq 'setPipelineSummary' || $currentAction eq 'setOutcomeProperty' || $currentAction eq 'setJobSummary' || $currentAction eq 'setJobStepSummary') { + elsif (inArray($currentAction, ('setPipelineSummary', 'setOutcomeProperty', 'setJobSummary', 'setJobStepSummary'))) { + + my $line; + if ($currentAction ne 'setOutcomeProperty') { + $line = $self->setCacheForAction($currentAction, $left, $right); + } + else { + $line = $right; + } + fwLogDebug("Got line: $line\n"); + $ec->setProperty($left, $line); + } + elsif ($currentAction eq 'setOutputParameter') { + my $op = FlowPDF::EF::OutputParameters->new({ + ec => $ec + }); + $op->setOutputParameter($left, $right, {}); + # croak "Output parameters are not implemented yet for StepResult\n"; + } + else { + croak "Action $currentAction is not implemented yet\n"; + } + } + logTrace("Actions: ", Dumper $self->{actions}); + logTrace("Actions cache: ", Dumper $self->{cache}); + return $self; + +} + + +=head2 flush() + +=head3 Description + +Flushes scheduled actions. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->flush(); + +%%%LANG%%% + +=cut + +sub flush { + my ($self) = @_; + + my $actions = $self->getActions(); + # now we're copying an actions array because it is a reference. + my @clonedActions = @$actions; + $self->setActions([]); + $self->setCache({}); + + return \@clonedActions; +} + + +=head2 applyAndFlush + +=head3 Description + +Executes the schedule queue and flushes it then. + +=head3 Parameters + +=over 4 + +=item None + +=back + +=head3 Returns + +=over 4 + +=item (FlowPDF::StepResult) self + +=back + +=head3 Usage + +%%%LANG=perl%%% + + $stepResult->applyAndFlush(); + +%%%LANG%%% + +=cut + +sub applyAndFlush { + my ($self) = @_; + + $self->apply(); + return $self->flush(); +} + + +sub applyIfNotApplied { + my ($self) = @_; + + my $actions = $self->getActions(); + if (@$actions and !$self->getIsApplied()) { + fwLogDebug("Executing auto-apply for FlowPDF::StepResult object."); + return $self->apply(); + } + return $self; +} +1; + diff --git a/src/main/resources/project/pdk/FlowPDF/StepResult/Action.pm b/src/main/resources/project/pdk/FlowPDF/StepResult/Action.pm new file mode 100644 index 00000000..49f94359 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/StepResult/Action.pm @@ -0,0 +1,50 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::StepResult::Action; +use base qw/FlowPDF::BaseClass2/; +use FlowPDF::Types; + +__PACKAGE__->defineClass({ + actionType => FlowPDF::Types::Scalar(), + entityName => FlowPDF::Types::Scalar(), + entityValue => FlowPDF::Types::Scalar(), +}); + +use strict; +use warnings; +use Carp; + +my $supportedActions = { + setOutputParameter => 1, + setPipelineSummary => 1, + setJobStepOutcome => 1, + setJobOutcome => 1, + setOutcomeProperty => 1, + setJobSummary => 1, + setJobStepSummary => 1, + setReportUrl => 1, +}; + + +sub classDefinition { + return { + actionType => 'str', + entityName => 'str', + entityValue => 'str' + }; +} + + +sub new { + my ($class, $params) = @_; + + if (!$supportedActions->{$params->{actionType}}) { + croak "Action Type $params->{actionType} is not supported. Supported actions are: ", join(', ', keys %$supportedActions); + } + + return $class->SUPER::new($params); +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Throwable.pm b/src/main/resources/project/pdk/FlowPDF/Throwable.pm new file mode 100644 index 00000000..19d56226 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Throwable.pm @@ -0,0 +1,211 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Throwable; + +=head1 NAME + +FlowPDF::Throwable + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This class provides a low-level base class for exceptions that is being used in FlowPDF development. + +If you're a framework developer and know what are you doing, use this class. +If you're looking for a base class for custom Exceptions, visit L. + +B + +This class and inherited classes have automatic toString call in the scalar context. +It has been done to allow exceptions be used with regular croak or die function in the scalar context. + +=head3 METHODS + +This class provides following getters and setters: + +=over + +=item new($hashref) + +Constructor. Accepts hash reference that may have fields: callInfo, message and code. + +=item getMessage() + +=item setMessage($str) + +=item getCode() + +=item setCode($str) + +=item getCallInfo() + +=item setCallInfo($str) + +=item throw() + +This function throws an exception. + +=item toString() + +Converts a throwable object into string. Automatically being applied in the scalar context. + +=item is($reference) + +Returns a true if $reference has the same reference as current throwable object. It is done for simplification of exception handling. +For example: + +%%%LANG=perl%%% + +try { + $exception->throw(); +} catch { + my ($e) = @_; + if ($e->is('CustomException1')) { + ...; + } + elsif ($e->is('CustomException2')) { + ...; + } +} + +%%%LANG%%% + +=back + +=cut + + + + +use overload '""' => 'toString'; + +use strict; +use warnings; +use Data::Dumper; +use Carp; +use FlowPDF::Types; +use FlowPDF::Devel::Stacktrace; + + +# This class has been created without inheriting of BaseClass or BaseClass2 for a reason. +# Since this is a very generic class and it is being used everywhere, including BaseClass and BaseClass2, it could not be extending that classes +# to avoid any circular depenencies. That is also a reason, why it is not annotated too much and annotations are not very user-friendly. + +sub getMessage { + my ($self) = @_; + + return $self->{message}; +} + +sub setMessage { + my ($self, $message) = @_; + + $self->{message} = $message; + return 1; +} + +sub getCode { + my ($self) = @_; + + return $self->{code}; +} + +sub setCode { + my ($self, $code) = @_; + + $self->{code} = $code; + return 1; +} + +sub getCallInfo { + my ($self) = @_; + + return $self->{callInfo}; +} + +sub setCallInfo { + my ($self, $callInfo) = @_; + + $self->{callInfo} = $callInfo; + return 1; +} + +sub new { + my ($class, $params) = @_; + + my $self = {}; + bless $self, $class; + + if (defined $params->{message}) { + $self->setMessage($params->{message}); + } + + if (defined $params->{code}) { + $self->setCode($params->{code}); + } + + if (defined $params->{callInfo}) { + $self->setCallInfo($params->{callInfo}); + } + return $self; +} + + +sub toString { + my ($self, $options) = @_; + + if (!$options) { + $options = {}; + } + my $finalMessage = ''; + + my $code = $self->getCode(); + if ($code) { + my $code = $self->getCode(); + $finalMessage .= sprintf '[%s]: ', $code; + } + + $finalMessage .= $self->getMessage(); + + my $callInfo = $self->getCallInfo(); + my $tail = ''; + if ($callInfo && !$options->{dropStackTrace}) { + $tail = "\n" . $callInfo->toString(); + } + + $finalMessage .= $tail; + return $finalMessage; +} + +sub throw { + my ($self) = @_; + + $self->setCallInfo(FlowPDF::Devel::Stacktrace->new()); + + croak $self; +} + +sub is { + my ($self, $what) = @_; + + # TODO: Validate here. + unless (defined $what) { + return undef; + } + my $class = ref $what ? ref $what : $what; + if (ref $self eq $class) { + return 1; + } + return 0; +} + + +1; + + +# throw new FlowPDF::Throwable (''); diff --git a/src/main/resources/project/pdk/FlowPDF/Types.pm b/src/main/resources/project/pdk/FlowPDF/Types.pm new file mode 100644 index 00000000..4713bcef --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types.pm @@ -0,0 +1,178 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +=head1 NAME + +FlowPDF::Types + +=head1 AUTHOR + +CloudBees + +=head1 DESCRIPTION + +This module provides type validation system for FlowPDF. This module is intended to be used by FlowPDF developers. + +Each type has a method called match and describe. Match should accept a value that should be validated, +describe() returns a string with current object description, to be used, for example, as error message. + +=head1 TYPES + +=head2 FlowPDF::Types::Any + +This type represents an any value. + +%%%LANG=perl%%% + + my $any = FlowPDF::Types::Any(); + if ($any->match('any value') { + print "Match!\n" + } + else { + print "No match: ", $arrayref->describe(), "\n"; + } + +%%%LANG%%% + +=head2 FlowPDF::Types::ArrayrefOf + +This type represents an array reference with other types as references. +For example, to check that you have an array reference of hashes. + +%%%LANG=perl%%% + + my $arrayref = FlowPDF::Types::ArrayrefOf(FlowPDF::Types::Reference('HASH')); + my $records = [ + {one => 'two'}, + {one => 'two'}, + ]; + if ($arrayref->match($records)) { + print "Match!\n"; + } + else { + print "No match: ", $arrayref->describe(), "\n"; + } + +%%%LANG%%% + +=head2 FlowPDF::Types::Enum + +This type is designed for pre-defined scalar values. For example, procedure context that could be one of: 'procedure', 'schedule', 'pipeline'. + +%%%LANG=perl%%% + + my $enum = FlowPDF::Types::Enum('procedure', 'schedule', 'pipeline'); + my $value = 'pipeline'; + if ($enum->match($value)) { + print "Match!\n"; + } + else { + print "No match: ", $arrayref->describe(), "\n"; + } + +%%%LANG%%% + +=head2 FlowPDF::Types::Scalar + +This type represents a scalar string value. It could check that value is just scalar, or a scalar with special value. + +%%%LANG=perl%%% + + my $scalar1 = FlowPDF::Types::Scalar('foo'); + my $scalar2 = FlowPDF::Types::Scalar(); + if ($scalar1->match('bar') { + print "Match!\n" + } + # will no match now because scalar with exact value is expected for $scalar1 validator. + else { + print "No match: ", $arrayref->describe(), "\n"; + } + + # scalar2 will match any scalar, because it was created without value + if ($scalar2->match('bar') { + print "Match!\n" + } + +%%%LANG%%% + +=head2 FlowPDF::Types::Reference + +This type is for references. If you need to check object or any reference. May accept multiple references. + +%%%LANG%%% + + my $ref = FlowPDF::Types::Reference('HASH', 'ElectricCommander'); + if ($ref->match({})) { + print "Match!\n"; + } + else { + print "No match: ", $arrayref->describe(), "\n"; + } + +%%%LANG%%% + +=head2 FlowPDF::Types::Regexp + +This type represents regexp and validates strings. + +%%%LANG=perl%%% + + my $reg = FlowPDF::Types::Regexp(qr/^[A-Z]+$/, qr/^[a-z]+$/); + if ($reg->match("ASDF")) { + print "Match!\n"; + } + else { + print "No match: ", $arrayref->describe(), "\n"; + } + +%%%LANG%%% + +=cut + +package FlowPDF::Types; +use strict; +use warnings; +use Data::Dumper; + +use FlowPDF::Types::Any; +use FlowPDF::Types::Reference; +use FlowPDF::Types::Scalar; +use FlowPDF::Types::Enum; +use FlowPDF::Types::ArrayrefOf; +use FlowPDF::Types::Regexp; + +sub Reference { + my (@refs) = @_; + + return FlowPDF::Types::Reference->new(@refs); +} + +sub Enum { + my (@vals) = @_; + + return FlowPDF::Types::Enum->new(@vals); +} + +sub Scalar { + my ($value) = @_; + return FlowPDF::Types::Scalar->new($value); +} + +sub Any { + return FlowPDF::Types::Any->new(); +} + +sub ArrayrefOf { + my (@refs) = @_; + + return FlowPDF::Types::ArrayrefOf->new(@refs); +} + +sub Regexp { + my (@refs) = @_; + + return FlowPDF::Types::Regexp->new(@refs); +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/Any.pm b/src/main/resources/project/pdk/FlowPDF/Types/Any.pm new file mode 100644 index 00000000..b5e63144 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/Any.pm @@ -0,0 +1,26 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::Any; +use strict; +use warnings; + +sub new { + my ($class) = @_; + my $self = {}; + bless $self, $class; + return $self; +} + + +sub match { + return 1; +} + + +sub describe { + return "an any type of data"; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/ArrayrefOf.pm b/src/main/resources/project/pdk/FlowPDF/Types/ArrayrefOf.pm new file mode 100644 index 00000000..ea159a36 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/ArrayrefOf.pm @@ -0,0 +1,58 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::ArrayrefOf; +use strict; +use warnings; + + +sub new { + my ($class, @refs) = @_; + + my $self = { + refs => \@refs + }; + bless $self, $class; + return $self; +} + + +sub match { + my ($self, $value) = @_; + + if (!ref $value) { + return 0; + } + + if (ref $value ne 'ARRAY') { + return 0; + } + + my $size = scalar @$value; + my $match = 0; + my $refs = $self->{refs}; + for my $elem (@$value) { + for my $ref (@$refs) { + if ($ref->match($elem)) { + $match++; + } + } + } + if ($match == $size) { + return 1; + } + return 0; +} + + +sub describe { + my ($self) = @_; + + my $refs = $self->{refs}; + + my @values = map {$_ = "\n" . $_->describe(); $_;} @$refs; + my $strValues = join ', ', @values; + return "an one of: $strValues"; +} +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/Enum.pm b/src/main/resources/project/pdk/FlowPDF/Types/Enum.pm new file mode 100644 index 00000000..1cf70928 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/Enum.pm @@ -0,0 +1,40 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::Enum; +use strict; +use warnings; + +sub new { + my ($class, @values) = @_; + + my $self = { + values => \@values + }; + bless $self, $class; + return $self; +} + + +sub match { + my ($self, $value) = @_; + + for my $v (@{$self->{values}}) { + return 1 if $value eq $v; + } + + return 0; +} + + +sub describe { + my ($self) = @_; + + my $values = $self->{values}; + + my $strValues = join ', ', @$values; + return "an one of $strValues"; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/Reference.pm b/src/main/resources/project/pdk/FlowPDF/Types/Reference.pm new file mode 100644 index 00000000..924704d8 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/Reference.pm @@ -0,0 +1,46 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::Reference; +use strict; +use warnings; +use Carp; + +sub new { + my ($class, @references) = @_; + + unless (@references) { + croak "References are mandatory for this type definition"; + } + my $self = { + references => \@references + }; + bless $self, $class; + return $self; +} + + +sub match { + my ($self, $value) = @_; + + return 0 if !ref $value; + for my $ref (@{$self->{references}}) { + if (ref $value eq $ref) { + return 1; + } + } + return 0; +} + +sub describe { + my ($self) = @_; + + my $refs = $self->{references}; + + my $strRefs = join ', ', @$refs; + my $str = "a reference to one of: $strRefs"; + return $str; +} + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/Regexp.pm b/src/main/resources/project/pdk/FlowPDF/Types/Regexp.pm new file mode 100644 index 00000000..98154b2f --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/Regexp.pm @@ -0,0 +1,61 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::Regexp; +use strict; +use warnings; +use Carp; + +use FlowPDF::Exception::MissingFunctionArgument; +use FlowPDF::Exception::WrongFunctionArgumentType; + +sub new { + my ($class, @regexps) = @_; + + if (!@regexps) { + FlowPDF::Exception::MissingFunctionArgument->new({ + argument => 'Regexps' + })->throw(); + } + + for my $reg (@regexps) { + if (ref $reg ne 'Regexp') { + FlowPDF::Exception::WrongFunctionArgumentType->new({ + argument =>'Regexps', + got => ref $reg, + expected => 'Regexp' + })->throw(); + } + } + my $self = { + regexps => \@regexps, + }; + bless $self, $class; + return $self; +} + +sub match { + my ($self, $value) = @_; + + if (ref $value) { + return 0; + } + for my $reg (@{$self->{regexps}}) { + if ($value =~ m/$reg/ms) { + return 1; + } + } + return 0; +} + + +sub describe { + my ($self) = @_; + + my $regs = join ', ', @{$self->{regexps}}; + return "a scalar value that matches following regexps: ($regs)."; +} + + +1; diff --git a/src/main/resources/project/pdk/FlowPDF/Types/Scalar.pm b/src/main/resources/project/pdk/FlowPDF/Types/Scalar.pm new file mode 100644 index 00000000..be482d28 --- /dev/null +++ b/src/main/resources/project/pdk/FlowPDF/Types/Scalar.pm @@ -0,0 +1,47 @@ +# WARNING +# Do not edit this file manually. Your changes will be overwritten with next FlowPDF update. +# WARNING + +package FlowPDF::Types::Scalar; +use strict; +use warnings; + +sub new { + my ($class, $value) = @_; + + $value ||= ''; + + my $self = { + value => $value + }; + bless $self, $class; + return $self; +} + +sub match { + my ($self, $value) = @_; + + if (ref $value) { + return 0; + } + if ($self->{value} && $self->{value} eq $value) { + return 1; + } + if (!$self->{value}) { + return 1; + } + return 0; +} + + +sub describe { + my ($self) = @_; + + if (!$self->{value}) { + return "a scalar value"; + } + return "a scalar value: '$self->{value}'"; +} + + +1; diff --git a/src/main/resources/project/pdk/Try/Tiny.pm b/src/main/resources/project/pdk/Try/Tiny.pm new file mode 100644 index 00000000..300561e4 --- /dev/null +++ b/src/main/resources/project/pdk/Try/Tiny.pm @@ -0,0 +1,677 @@ +package Try::Tiny; +BEGIN { + $Try::Tiny::AUTHORITY = 'cpan:NUFFIN'; +} +$Try::Tiny::VERSION = '0.22'; +use 5.006; +# ABSTRACT: minimal try/catch with proper preservation of $@ + +use strict; +use warnings; + +use Exporter 5.57 'import'; +our @EXPORT = our @EXPORT_OK = qw(try catch finally); + +use Carp; +$Carp::Internal{+__PACKAGE__}++; + +BEGIN { eval "use Sub::Name; 1" or *{subname} = sub {1} } + +# Need to prototype as @ not $$ because of the way Perl evaluates the prototype. +# Keeping it at $$ means you only ever get 1 sub because we need to eval in a list +# context & not a scalar one + +sub try (&;@) { + my ( $try, @code_refs ) = @_; + + # we need to save this here, the eval block will be in scalar context due + # to $failed + my $wantarray = wantarray; + + # work around perl bug by explicitly initializing these, due to the likelyhood + # this will be used in global destruction (perl rt#119311) + my ( $catch, @finally ) = (); + + # find labeled blocks in the argument list. + # catch and finally tag the blocks by blessing a scalar reference to them. + foreach my $code_ref (@code_refs) { + + if ( ref($code_ref) eq 'Try::Tiny::Catch' ) { + croak 'A try() may not be followed by multiple catch() blocks' + if $catch; + $catch = ${$code_ref}; + } elsif ( ref($code_ref) eq 'Try::Tiny::Finally' ) { + push @finally, ${$code_ref}; + } else { + croak( + 'try() encountered an unexpected argument (' + . ( defined $code_ref ? $code_ref : 'undef' ) + . ') - perhaps a missing semi-colon before or' + ); + } + } + + # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's + # not perfect, but we could provide a list of additional errors for + # $catch->(); + + # name the blocks if we have Sub::Name installed + my $caller = caller; + subname("${caller}::try {...} " => $try); + subname("${caller}::catch {...} " => $catch) if $catch; + subname("${caller}::finally {...} " => $_) foreach @finally; + + # save the value of $@ so we can set $@ back to it in the beginning of the eval + # and restore $@ after the eval finishes + my $prev_error = $@; + + my ( @ret, $error ); + + # failed will be true if the eval dies, because 1 will not be returned + # from the eval body + my $failed = not eval { + $@ = $prev_error; + + # evaluate the try block in the correct context + if ( $wantarray ) { + @ret = $try->(); + } elsif ( defined $wantarray ) { + $ret[0] = $try->(); + } else { + $try->(); + }; + + return 1; # properly set $fail to false + }; + + # preserve the current error and reset the original value of $@ + $error = $@; + $@ = $prev_error; + + # set up a scope guard to invoke the finally block at the end + my @guards = + map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) } + @finally; + + # at this point $failed contains a true value if the eval died, even if some + # destructor overwrote $@ as the eval was unwinding. + if ( $failed ) { + # if we got an error, invoke the catch block. + if ( $catch ) { + # This works like given($error), but is backwards compatible and + # sets $_ in the dynamic scope for the body of C<$catch> + for ($error) { + return $catch->($error); + } + + # in case when() was used without an explicit return, the C + # loop will be aborted and there's no useful return value + } + + return; + } else { + # no failure, $@ is back to what it was, everything is fine + return $wantarray ? @ret : $ret[0]; + } +} + +sub catch (&;@) { + my ( $block, @rest ) = @_; + + croak 'Useless bare catch()' unless wantarray; + + return ( + bless(\$block, 'Try::Tiny::Catch'), + @rest, + ); +} + +sub finally (&;@) { + my ( $block, @rest ) = @_; + + croak 'Useless bare finally()' unless wantarray; + + return ( + bless(\$block, 'Try::Tiny::Finally'), + @rest, + ); +} + +{ + package # hide from PAUSE + Try::Tiny::ScopeGuard; + + use constant UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0; + + sub _new { + shift; + bless [ @_ ]; + } + + sub DESTROY { + my ($code, @args) = @{ $_[0] }; + + local $@ if UNSTABLE_DOLLARAT; + eval { + $code->(@args); + 1; + } or do { + warn + "Execution of finally() block $code resulted in an exception, which " + . '*CAN NOT BE PROPAGATED* due to fundamental limitations of Perl. ' + . 'Your program will continue as if this event never took place. ' + . "Original exception text follows:\n\n" + . (defined $@ ? $@ : '$@ left undefined...') + . "\n" + ; + } + } +} + +__PACKAGE__ + +__END__ + +=pod + +=encoding UTF-8 + +=head1 NAME + +Try::Tiny - minimal try/catch with proper preservation of $@ + +=head1 VERSION + +version 0.22 + +=head1 SYNOPSIS + +You can use Try::Tiny's C and C to expect and handle exceptional +conditions, avoiding quirks in Perl and common mistakes: + + # handle errors with a catch handler + try { + die "foo"; + } catch { + warn "caught error: $_"; # not $@ + }; + +You can also use it like a standalone C to catch and ignore any error +conditions. Obviously, this is an extreme measure not to be undertaken +lightly: + + # just silence errors + try { + die "foo"; + }; + +=head1 DESCRIPTION + +This module provides bare bones C/C/C statements that are designed to +minimize common mistakes with eval blocks, and NOTHING else. + +This is unlike L which provides a nice syntax and avoids adding +another call stack layer, and supports calling C from the C block to +return from the parent subroutine. These extra features come at a cost of a few +dependencies, namely L and L which are +occasionally problematic, and the additional catch filtering uses L +type constraints which may not be desirable either. + +The main focus of this module is to provide simple and reliable error handling +for those having a hard time installing L, but who still want to +write correct C blocks without 5 lines of boilerplate each time. + +It's designed to work as correctly as possible in light of the various +pathological edge cases (see L) and to be compatible with any style +of error values (simple strings, references, objects, overloaded objects, etc). + +If the C block dies, it returns the value of the last statement executed in +the C block, if there is one. Otherwise, it returns C in scalar +context or the empty list in list context. The following examples all +assign C<"bar"> to C<$x>: + + my $x = try { die "foo" } catch { "bar" }; + my $x = try { die "foo" } || { "bar" }; + my $x = (try { die "foo" }) // { "bar" }; + + my $x = eval { die "foo" } || "bar"; + +You can add C blocks, yielding the following: + + my $x; + try { die 'foo' } finally { $x = 'bar' }; + try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' }; + +C blocks are always executed making them suitable for cleanup code +which cannot be handled using local. You can add as many C blocks to a +given C block as you like. + +Note that adding a C block without a preceding C block +suppresses any errors. This behaviour is consistent with using a standalone +C, but it is not consistent with C/C patterns found in +other programming languages, such as Java, Python, Javascript or C#. If you +learnt the C/C pattern from one of these languages, watch out for +this. + +=head1 EXPORTS + +All functions are exported by default using L. + +If you need to rename the C, C or C keyword consider using +L to get L's flexibility. + +=over 4 + +=item try (&;@) + +Takes one mandatory C subroutine, an optional C subroutine and C +subroutine. + +The mandatory subroutine is evaluated in the context of an C block. + +If no error occurred the value from the first block is returned, preserving +list/scalar context. + +If there was an error and the second subroutine was given it will be invoked +with the error in C<$_> (localized) and as that block's first and only +argument. + +C<$@> does B contain the error. Inside the C block it has the same +value it had before the C block was executed. + +Note that the error may be false, but if that happens the C block will +still be invoked. + +Once all execution is finished then the C block, if given, will execute. + +=item catch (&;@) + +Intended to be used in the second argument position of C. + +Returns a reference to the subroutine it was given but blessed as +C which allows try to decode correctly what to do +with this code reference. + + catch { ... } + +Inside the C block the caught error is stored in C<$_>, while previous +value of C<$@> is still available for use. This value may or may not be +meaningful depending on what happened before the C, but it might be a good +idea to preserve it in an error stack. + +For code that captures C<$@> when throwing new errors (i.e. +L), you'll need to do: + + local $@ = $_; + +=item finally (&;@) + + try { ... } + catch { ... } + finally { ... }; + +Or + + try { ... } + finally { ... }; + +Or even + + try { ... } + finally { ... } + catch { ... }; + +Intended to be the second or third element of C. C blocks are always +executed in the event of a successful C or if C is run. This allows +you to locate cleanup code which cannot be done via C e.g. closing a file +handle. + +When invoked, the C block is passed the error that was caught. If no +error was caught, it is passed nothing. (Note that the C block does not +localize C<$_> with the error, since unlike in a C block, there is no way +to know if C<$_ == undef> implies that there were no errors.) In other words, +the following code does just what you would expect: + + try { + die_sometimes(); + } catch { + # ...code run in case of error + } finally { + if (@_) { + print "The try block died with: @_\n"; + } else { + print "The try block ran without error.\n"; + } + }; + +B block>. C will +not do anything about handling possible errors coming from code located in these +blocks. + +Furthermore B blocks are not trappable and are unable +to influence the execution of your program>. This is due to limitation of +C-based scope guards, which C is implemented on top of. This +may change in a future version of Try::Tiny. + +In the same way C blesses the code reference this subroutine does the same +except it bless them as C. + +=back + +=head1 BACKGROUND + +There are a number of issues with C. + +=head2 Clobbering $@ + +When you run an C block and it succeeds, C<$@> will be cleared, potentially +clobbering an error that is currently being caught. + +This causes action at a distance, clearing previous errors your caller may have +not yet handled. + +C<$@> must be properly localized before invoking C in order to avoid this +issue. + +More specifically, C<$@> is clobbered at the beginning of the C, which +also makes it impossible to capture the previous error before you die (for +instance when making exception objects with error stacks). + +For this reason C will actually set C<$@> to its previous value (the one +available before entering the C block) in the beginning of the C +block. + +=head2 Localizing $@ silently masks errors + +Inside an C block, C behaves sort of like: + + sub die { + $@ = $_[0]; + return_undef_from_eval(); + } + +This means that if you were polite and localized C<$@> you can't die in that +scope, or your error will be discarded (printing "Something's wrong" instead). + +The workaround is very ugly: + + my $error = do { + local $@; + eval { ... }; + $@; + }; + + ... + die $error; + +=head2 $@ might not be a true value + +This code is wrong: + + if ( $@ ) { + ... + } + +because due to the previous caveats it may have been unset. + +C<$@> could also be an overloaded error object that evaluates to false, but +that's asking for trouble anyway. + +The classic failure mode is: + + sub Object::DESTROY { + eval { ... } + } + + eval { + my $obj = Object->new; + + die "foo"; + }; + + if ( $@ ) { + + } + +In this case since C is not localizing C<$@> but still uses +C, it will set C<$@> to C<"">. + +The destructor is called when the stack is unwound, after C sets C<$@> to +C<"foo at Foo.pm line 42\n">, so by the time C is evaluated it has +been cleared by C in the destructor. + +The workaround for this is even uglier than the previous ones. Even though we +can't save the value of C<$@> from code that doesn't localize, we can at least +be sure the C was aborted due to an error: + + my $failed = not eval { + ... + + return 1; + }; + +This is because an C that caught a C will always return a false +value. + +=head1 SHINY SYNTAX + +Using Perl 5.10 you can use L. + +The C block is invoked in a topicalizer context (like a C block), +but note that you can't return a useful value from C using the C +blocks without an explicit C. + +This is somewhat similar to Perl 6's C blocks. You can use it to +concisely match errors: + + try { + require Foo; + } catch { + when (/^Can't locate .*?\.pm in \@INC/) { } # ignore + default { die $_ } + }; + +=head1 CAVEATS + +=over 4 + +=item * + +C<@_> is not available within the C block, so you need to copy your +arglist. In case you want to work with argument values directly via C<@_> +aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference: + + sub foo { + my ( $self, @args ) = @_; + try { $self->bar(@args) } + } + +or + + sub bar_in_place { + my $self = shift; + my $args = \@_; + try { $_ = $self->bar($_) for @$args } + } + +=item * + +C returns from the C block, not from the parent sub (note that +this is also how C works, but not how L works): + + sub parent_sub { + try { + die; + } + catch { + return; + }; + + say "this text WILL be displayed, even though an exception is thrown"; + } + +Instead, you should capture the return value: + + sub parent_sub { + my $success = try { + die; + 1; + }; + return unless $success; + + say "This text WILL NEVER appear!"; + } + # OR + sub parent_sub_with_catch { + my $success = try { + die; + 1; + } + catch { + # do something with $_ + return undef; #see note + }; + return unless $success; + + say "This text WILL NEVER appear!"; + } + +Note that if you have a C block, it must return C for this to work, +since if a C block exists, its return value is returned in place of C +when an exception is thrown. + +=item * + +C introduces another caller stack frame. L is not used. L +will not report this when using full stack traces, though, because +C<%Carp::Internal> is used. This lack of magic is considered a feature. + +=item * + +The value of C<$_> in the C block is not guaranteed to be the value of +the exception thrown (C<$@>) in the C block. There is no safe way to +ensure this, since C may be used unhygenically in destructors. The only +guarantee is that the C will be called if an exception is thrown. + +=item * + +The return value of the C block is not ignored, so if testing the result +of the expression for truth on success, be sure to return a false value from +the C block: + + my $obj = try { + MightFail->new; + } catch { + ... + + return; # avoid returning a true value; + }; + + return unless $obj; + +=item * + +C<$SIG{__DIE__}> is still in effect. + +Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of +C blocks, since it isn't people have grown to rely on it. Therefore in +the interests of compatibility, C does not disable C<$SIG{__DIE__}> for +the scope of the error throwing code. + +=item * + +Lexical C<$_> may override the one set by C. + +For example Perl 5.10's C form uses a lexical C<$_>, creating some +confusing behavior: + + given ($foo) { + when (...) { + try { + ... + } catch { + warn $_; # will print $foo, not the error + warn $_[0]; # instead, get the error like this + } + } + } + +Note that this behavior was changed once again in L. +However, since the entirety of lexical C<$_> is now L, it +is unclear whether the new version 18 behavior is final. + +=back + +=head1 SEE ALSO + +=over 4 + +=item L + +Much more feature complete, more convenient semantics, but at the cost of +implementation complexity. + +=item L + +Automatic error throwing for builtin functions and more. Also designed to +work well with C/C. + +=item L + +A lightweight role for rolling your own exception classes. + +=item L + +Exception object implementation with a C statement. Does not localize +C<$@>. + +=item L + +Provides a C statement, but properly calling C is your +responsibility. + +The C keyword pushes C<$@> onto an error stack, avoiding some of the +issues with C<$@>, but you still need to localize to prevent clobbering. + +=back + +=head1 LIGHTNING TALK + +I gave a lightning talk about this module, you can see the slides (Firefox +only): + +L + +Or read the source: + +L + +=head1 VERSION CONTROL + +L + +=head1 AUTHORS + +=over 4 + +=item * + +Yuval Kogman + +=item * + +Jesse Luehrs + +=back + +=head1 COPYRIGHT AND LICENSE + +This software is Copyright (c) 2014 by Yuval Kogman. + +This is free software, licensed under: + + The MIT (X11) License + +=cut diff --git a/src/main/resources/project/procedures_with_credentials.json b/src/main/resources/project/procedures_with_credentials.json new file mode 100644 index 00000000..ea89696d --- /dev/null +++ b/src/main/resources/project/procedures_with_credentials.json @@ -0,0 +1,234 @@ +[ + { + "procedureName": "StopServer", + "stepName": "StopInstance" + }, + { + "procedureName": "CheckServerStatus", + "stepName": "CheckServerStatus" + }, + { + "procedureName": "RunCustomJob", + "stepName": "RunJob" + }, + { + "procedureName": "StartApp", + "stepName": "StartApp" + }, + { + "procedureName": "StopApp", + "stepName": "StopApp" + }, + { + "stepName": "DeployApp", + "procedureName": "DeployApp" + }, + { + "procedureName": "UndeployApp", + "stepName": "UndeployApp" + }, + { + "procedureName": "CheckApp", + "stepName": "CheckApp" + }, + { + "stepName": "DeployEnterpriseApp", + "procedureName": "DeployEnterpriseApp" + }, + { + "stepName": "UpdateApp", + "procedureName": "UpdateApp" + }, + { + "stepName": "ConfigEJBContainer", + "procedureName": "ConfigEJBContainer" + }, + { + "procedureName": "CreateEndToEndMailProvider", + "stepName": "CreateEndToEndMailProvider" + }, + { + "procedureName": "DeployOSGiApp", + "stepName": "DeployOSGiApp" + }, + { + "procedureName": "publishWSDL", + "stepName": "publishWSDL" + }, + { + "procedureName": "RemoveClusterMembers", + "stepName": "RemoveClusterMembers" + }, + { + "stepName": "DeleteCluster", + "procedureName": "DeleteCluster" + }, + { + "procedureName": "ListClusterMembers", + "stepName": "ListClusterMembers" + }, + { + "stepName": "StartCluster", + "procedureName": "StartCluster" + }, + { + "stepName": "StopCluster", + "procedureName": "StopCluster" + }, + { + "stepName": "CreateCluster", + "procedureName": "CreateCluster" + }, + { + "stepName": "ConfigureSession", + "procedureName": "ConfigureSession" + }, + { + "stepName": "CreateJMSProvider", + "procedureName": "CreateJMSProvider" + }, + { + "stepName": "CreateMailSession", + "procedureName": "CreateMailSession" + }, + { + "procedureName": "Discover", + "stepName": "DiscoverResources" + }, + { + "procedureName": "DiscoverResource", + "stepName": "DiscoverResource" + }, + { + "procedureName": "MapSharedLibrary", + "stepName": "MapSharedLibrary" + }, + { + "procedureName": "ModifyApplicationClassLoader", + "stepName": "ModifyApplicationClassLoader" + }, + { + "procedureName": "SyncNodes", + "stepName": "SyncNodes" + }, + { + "stepName": "CheckNodeStatus", + "procedureName": "CheckNodeStatus" + }, + { + "stepName": "CreateJDBCProvider", + "procedureName": "CreateJDBCProvider" + }, + { + "procedureName": "DeleteJDBCProvider", + "stepName": "DeleteJDBCProvider" + }, + { + "procedureName": "CreateDatasource", + "stepName": "CreateDatasource" + }, + { + "procedureName": "DeleteDatasource", + "stepName": "DeleteDatasource" + }, + { + "procedureName": "CreateOrUpdateJMSQueue", + "stepName": "CreateOrUpdateJMSQueue" + }, + { + "stepName": "CreateOrUpdateJMSTopic", + "procedureName": "CreateOrUpdateJMSTopic" + }, + { + "stepName": "DeleteJMSQueue", + "procedureName": "DeleteJMSQueue" + }, + { + "procedureName": "DeleteJMSTopic", + "stepName": "DeleteJMSTopic" + }, + { + "stepName": "CreateOrUpdateWMQJMSActivationSpec", + "procedureName": "CreateOrUpdateWMQJMSActivationSpec" + }, + { + "procedureName": "CreateOrUpdateSIBJMSActivationSpec", + "stepName": "CreateOrUpdateSIBJMSActivationSpec" + }, + { + "stepName": "DeleteJMSActivationSpec", + "procedureName": "DeleteJMSActivationSpec" + }, + { + "procedureName": "CreateOrUpdateWMQJMSConnectionFactory", + "stepName": "CreateOrUpdateWMQJMSConnectionFactory" + }, + { + "stepName": "CreateOrUpdateSIBJMSConnectionFactory", + "procedureName": "CreateOrUpdateSIBJMSConnectionFactory" + }, + { + "stepName": "DeleteJMSConnectionFactory", + "procedureName": "DeleteJMSConnectionFactory" + }, + { + "stepName": "DeleteJMSProvider", + "procedureName": "DeleteJMSProvider" + }, + { + "procedureName": "CreateApplicationServer", + "stepName": "CreateApplicationServer" + }, + { + "procedureName": "CreateApplicationServerTemplate", + "stepName": "CreateApplicationServerTemplate" + }, + { + "procedureName": "DeleteApplicationServerTemplate", + "stepName": "DeleteApplicationServerTemplate" + }, + { + "stepName": "StartApplicationServers", + "procedureName": "StartApplicationServers" + }, + { + "procedureName": "StopApplicationServers", + "stepName": "StopApplicationServers" + }, + { + "procedureName": "ExportApplicationServer", + "stepName": "ExportApplicationServer" + }, + { + "procedureName": "ImportApplicationServer", + "stepName": "ImportApplicationServer" + }, + { + "procedureName": "DeleteApplicationServer", + "stepName": "DeleteApplicationServer" + }, + { + "procedureName": "StartDeploymentManager", + "stepName": "StartDeploymentManager" + }, + { + "procedureName": "StopDeploymentManager", + "stepName": "StopDeploymentManager" + }, + { + "procedureName": "StopNode", + "stepName": "StopNode" + }, + { + "stepName": "StartNode", + "procedureName": "StartNode" + }, + { + "stepName": "CreateFirstClusterMember", + "procedureName": "CreateFirstClusterMember" + }, + { + "stepName": "CreateClusterMembers", + "procedureName": "CreateClusterMembers" + } +] diff --git a/src/main/resources/project/project.xml b/src/main/resources/project/project.xml index 2344023a..7ccb2f7b 100644 --- a/src/main/resources/project/project.xml +++ b/src/main/resources/project/project.xml @@ -6,11 +6,356 @@ Integration with WebSphere + + ec_configPropertySheet + websphere_cfgs + ec_icon images/icon-plugin.svg + + + + pdk + + + FlowPDF + + + Component.pm + + + + Parameter.pm + + + + ComponentManager.pm + + + + Types + + + Any.pm + + + + Reference.pm + + + + ArrayrefOf.pm + + + + Scalar.pm + + + + Regexp.pm + + + + Enum.pm + + + + + + Helpers.pm + + + + Exception + + + RuntimeException.pm + + + + ConfigDoesNotExist.pm + + + + WrongFunctionArgumentValue.pm + + + + MissingFunctionDefinition.pm + + + + EntityDoesNotExist.pm + + + + WrongFunctionArgumentType.pm + + + + MissingFunctionArgument.pm + + + + UnexpectedMissingValue.pm + + + + EntityAlreadyExists.pm + + + + UnexpectedEmptyValue.pm + + + + + + Types.pm + + + + Exception.pm + + + + Constants.pm + + + + Context.pm + + + + Component + + + CLI + + + ExecutionResult.pm + + + + Command.pm + + + + + + OAuth.pm + + + + CLI.pm + + + + EF.pm + + + + Proxy.pm + + + + EF + + + Reporting + + + Dataset.pm + + + + Transformer.pm + + + + MetadataFactory.pm + + + + Engine.pm + + + + Metadata.pm + + + + Data.pm + + + + Payload.pm + + + + Payloadset.pm + + + + + + Reporting.pm + + + + + + + + BaseClass.pm + + + + Config.pm + + + + Credential.pm + + + + Log + + + FW.pm + + + + + + Log.pm + + + + Client + + + REST.pm + + + + REST + + + Auth.pm + + + + + + + + StepResult + + + Action.pm + + + + + + EF + + + PostP.pm + + + + OutputParameters.pm + + + + + + StepParameters.pm + + + + StepResult.pm + + + + Throwable.pm + + + + ContextFactory.pm + + + + Devel + + + Stacktrace.pm + + + + + + Service + + + Bootstrap.pm + + + + RSA.pm + + + + + + BaseClass2.pm + + + + + + FlowPDF.pm + + + + Bytes + + + Random + + + Secure + + + Tiny.pm + + + + + + + + + + Try + + + Tiny.pm + + + + + + + + + + @@ -433,6 +778,10 @@ @PLUGIN_KEY@-@PLUGIN_VERSION@ + + ec_stepsWithAttachedCredentials + + ec_customEditorData @@ -642,7 +991,7 @@ Create a WebSphere configuration - failProcedure + abortProcedure 0 0 @@ -669,41 +1018,6 @@ - - - CreateAndAttachCredential - 0 - 0 - - - - failProcedure - 0 - - 0 - - 0 - local - 0 - ec-perl - 5 - minutes - - - CreateConfiguration - @PLUGIN_KEY@-@PLUGIN_VERSION@ - - - ec_customEditorData - - - formType - 1 - command - - - - credential @@ -909,6 +1223,44 @@ credential + + EditConfiguration + 0 + 0 + + + Edit a WebSphere configuration + abortProcedure + 0 + + 0 + postp + 0 + local + 0 + ec-perl + 5 + minutes + + + EditConfiguration + @PLUGIN_KEY@-@PLUGIN_VERSION@ + + + ec_customEditorData + + + formType + 1 + command + + + + + + credential + + DeleteConfiguration From ffa6a0f38f5b256773baa88812bb127261030142 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Mon, 1 Feb 2021 18:14:44 +0200 Subject: [PATCH 20/47] Updated Util.pm and WebSphere.pm to support external credentials retrieval --- src/main/resources/project/WebSphere/Util.pm | 132 +++++++++++++++--- .../resources/project/WebSphere/WebSphere.pm | 130 ++++++++++++++--- src/main/resources/project/server/stopApp.pl | 6 +- 3 files changed, 228 insertions(+), 40 deletions(-) diff --git a/src/main/resources/project/WebSphere/Util.pm b/src/main/resources/project/WebSphere/Util.pm index 94e8627f..0af48fdb 100644 --- a/src/main/resources/project/WebSphere/Util.pm +++ b/src/main/resources/project/WebSphere/Util.pm @@ -32,8 +32,56 @@ use ElectricCommander::PropDB; use strict; use warnings; -use Exporter; +BEGIN { + require ElectricCommander; + import ElectricCommander; + + my $ec = ElectricCommander->new(); + my @locations = ( + '/myProject/pdk/', + # '/myProject/perl/core/lib/', + # '/myProject/perl/lib/' + ); + my $display; + my $pdk_loader = sub { + my ($self, $target) = @_; + + $display = '[EC]@PLUGIN_KEY@-@PLUGIN_VERSION@/' . $target; + # Undo perl'd require transformation + # Retrieving framework part and lib part. + my $code; + for my $prefix (@locations) { + my $prop = $target; + # $prop =~ s#\.pm$##; + + $prop = "$prefix$prop"; + $code = eval { + $ec->getProperty("$prop")->findvalue('//value')->string_value; + }; + last if $code; + } + return unless $code; # let other module paths try ;) + + # Prepend comment for correct error attribution + $code = qq{# line 1 "$display"\n$code}; + + # We must return a file in perl < 5.10, in 5.10+ just return \$code + # would suffice. + open my $fd, "<", \$code + or die "Redirect failed when loading $target from $display"; + + return $fd; + }; + + push @INC, $pdk_loader; +} +use FlowPDF; +use FlowPDF::Context; +use FlowPDF::ContextFactory; +use Exporter; +use Try::Tiny; +use Data::Dumper; our @ISA = qw(Exporter); our @EXPORT = qw( trim @@ -88,29 +136,73 @@ use constant { sub getConfiguration { my ($ec, $configName) = @_; - my %configToUse; - my $pluginConfigs = new ElectricCommander::PropDB($ec,"/myProject/websphere_cfgs"); - my %configRow = $pluginConfigs->getRow($configName); - - # Check if configuration exists - unless(keys(%configRow)) { - print "Error: Configuration '$configName' doesn't exist\n"; - exit ERROR; + ### FlowPDF part. Detecting procedure name and step name: + my $procedureName = $ec->getProperty('/myProcedure/procedureName')->findvalue('//value')->string_value(); + my $stepName = $ec->getProperty('/myJobStep/stepName')->findvalue('//value')->string_value(); + ### + my $flowpdf = FlowPDF->new({ + pluginName => '@PLUGIN_KEY@', + pluginVersion => '@PLUGIN_VERSION@', + configFields => ['config', 'config_name', 'configurationName', 'configName', 'configname'], + configLocations => ['websphere_cfgs', 'ec_plugin_cfgs'], + contextFactory => FlowPDF::ContextFactory->new({ + procedureName => $procedureName, + stepName => $stepName + }) + }); + + my $cfg = undef; + try { + $cfg = $flowpdf->getContext()->getConfigValuesAsHashref(); + } catch { + my ($e) = @_; + print "ERROR: ", Dumper $e; + die "Something has happened during config retrieval...\n"; + # my ($e) = @_; + # unless (ref $e) { + # $self->bail_out($e); + # } + # my $err_msg = $e->getMessage(); + # if ($e->is('FlowPDF::Exception::ConfigDoesNotExist')) { + # if ($err_msg =~ m/Configuration\s'(.*?)'/s) { + # $err_msg = qq|Configuration "$1" does not exist|; + # } + # } + # $self->error($err_msg); + # $self->bail_out($err_msg); + }; + my %configuration = %$cfg; + $configuration{configurationName} = $configName; + if (wantarray()) { + return %configuration; } + return \%configuration; - # Get user/password out of credential - my $xpath = $ec->getFullCredential($configRow{credential}); - $configToUse{'user'} = $xpath->findvalue("//userName"); - $configToUse{'password'} = $xpath->findvalue("//password"); - foreach my $c (keys %configRow) { - #getting all values except the credential that was read previously - if($c ne 'credential'){ - $configToUse{$c} = $configRow{$c}; - } - } + ### End of flowpdf part + # my %configToUse; + # my $pluginConfigs = new ElectricCommander::PropDB($ec,"/myProject/websphere_cfgs"); + # my %configRow = $pluginConfigs->getRow($configName); + + # # Check if configuration exists + # unless(keys(%configRow)) { + # print "Error: Configuration '$configName' doesn't exist\n"; + # exit ERROR; + # } + + # # Get user/password out of credential + # my $xpath = $ec->getFullCredential($configRow{credential}); + # $configToUse{'user'} = $xpath->findvalue("//userName"); + # $configToUse{'password'} = $xpath->findvalue("//password"); + + # foreach my $c (keys %configRow) { + # #getting all values except the credential that was read previously + # if($c ne 'credential'){ + # $configToUse{$c} = $configRow{$c}; + # } + # } - return %configToUse; + # return %configToUse; } diff --git a/src/main/resources/project/WebSphere/WebSphere.pm b/src/main/resources/project/WebSphere/WebSphere.pm index 21b980bf..af6f7f42 100644 --- a/src/main/resources/project/WebSphere/WebSphere.pm +++ b/src/main/resources/project/WebSphere/WebSphere.pm @@ -17,6 +17,51 @@ All rights reserved use strict; no strict "subs"; + +BEGIN { + require ElectricCommander; + import ElectricCommander; + + my $ec = ElectricCommander->new(); + my @locations = ( + '/myProject/pdk/', + # '/myProject/perl/core/lib/', + # '/myProject/perl/lib/' + ); + my $display; + my $pdk_loader = sub { + my ($self, $target) = @_; + + $display = '[EC]@PLUGIN_KEY@-@PLUGIN_VERSION@/' . $target; + # Undo perl'd require transformation + # Retrieving framework part and lib part. + my $code; + for my $prefix (@locations) { + my $prop = $target; + # $prop =~ s#\.pm$##; + + $prop = "$prefix$prop"; + $code = eval { + $ec->getProperty("$prop")->findvalue('//value')->string_value; + }; + last if $code; + } + return unless $code; # let other module paths try ;) + + # Prepend comment for correct error attribution + $code = qq{# line 1 "$display"\n$code}; + + # We must return a file in perl < 5.10, in 5.10+ just return \$code + # would suffice. + open my $fd, "<", \$code + or die "Redirect failed when loading $target from $display"; + + return $fd; + }; + + push @INC, $pdk_loader; +} + use ElectricCommander; use ElectricCommander::PropDB; use JSON; @@ -24,6 +69,10 @@ use Carp; use Data::Dumper; use WebSphere::Util; use File::Copy qw/cp/; +use FlowPDF; +use FlowPDF::Context; +use FlowPDF::ContextFactory; +use Try::Tiny; $| = 1; @@ -54,6 +103,8 @@ $| = 1; }; +# Loading PDK + =head1 METHODS =head2 C @@ -90,6 +141,23 @@ sub new { # wsadminPath => $wsadminPath }; bless $self, $class; + + ### FlowPDF part. Detecting procedure name and step name: + my $procedureName = $ec->getProperty('/myProcedure/procedureName')->findvalue('//value')->string_value(); + my $stepName = $ec->getProperty('/myJobStep/stepName')->findvalue('//value')->string_value(); + ### + my $flowpdf = FlowPDF->new({ + pluginName => '@PLUGIN_KEY@', + pluginVersion => '@PLUGIN_VERSION@', + configFields => ['config', 'config_name', 'configurationName', 'configName', 'configname'], + configLocations => ['websphere_cfgs', 'ec_plugin_cfgs'], + contextFactory => FlowPDF::ContextFactory->new({ + procedureName => $procedureName, + stepName => $stepName + }) + }); + $self->{flowpdf} = $flowpdf; + ### End of flowpdf part my $log = EC::Plugin::Logger->new(0); $self->{_log} = $log; @@ -1076,28 +1144,52 @@ sub _create_runfile { } sub _getConfiguration { - my ( $self, $configurationName ) = @_; - my $ec = $self->{ec}; - - my $configurations = - new ElectricCommander::PropDB( $ec, '/myProject/websphere_cfgs' ); - my %configuration = $configurations->getRow($configurationName); - - # Check if configuration exists - unless ( keys(%configuration) ) { - my $error_string = "Configuration '$configurationName' doesn't exist"; - print "Error: $error_string\n"; - $self->setSummary("$error_string"); - return undef; - } - - # Get user/password out of credential - my $xpath = $ec->getFullCredential( $configuration{credential} ); - $configuration{user} = $xpath->findvalue("//userName"); - $configuration{password} = $xpath->findvalue("//password"); + my ($self, $configurationName) = @_; + + my $flowpdf = $self->{flowpdf}; + my $cfg = undef; + print "CALLING FLOWPDF:\n"; + try { + $cfg = $flowpdf->getContext()->getConfigValuesAsHashref(); + } catch { + my ($e) = @_; + unless (ref $e) { + $self->bail_out($e); + } + my $err_msg = $e->getMessage(); + if ($e->is('FlowPDF::Exception::ConfigDoesNotExist')) { + if ($err_msg =~ m/Configuration\s'(.*?)'/s) { + $err_msg = qq|Configuration "$1" does not exist|; + } + } + $self->error($err_msg); + $self->bail_out($err_msg); + }; + print "FLOWPDF RESULT: ", Dumper $cfg; + my %configuration = %$cfg; $configuration{configurationName} = $configurationName; return \%configuration; + # my $ec = $self->{ec}; + + # my $configurations = new ElectricCommander::PropDB($ec, '/myProject/websphere_cfgs'); + # my %configuration = $configurations->getRow($configurationName); + + # # Check if configuration exists + # unless ( keys(%configuration) ) { + # my $error_string = "Configuration '$configurationName' doesn't exist"; + # print "Error: $error_string\n"; + # $self->setSummary("$error_string"); + # return undef; + # } + + # # Get user/password out of credential + # my $xpath = $ec->getFullCredential( $configuration{credential} ); + # $configuration{user} = $xpath->findvalue("//userName"); + # $configuration{password} = $xpath->findvalue("//password"); + # $configuration{configurationName} = $configurationName; + + # return \%configuration; } =head2 write_jython_script diff --git a/src/main/resources/project/server/stopApp.pl b/src/main/resources/project/server/stopApp.pl index 123259bc..69cc9e3f 100644 --- a/src/main/resources/project/server/stopApp.pl +++ b/src/main/resources/project/server/stopApp.pl @@ -36,6 +36,7 @@ my $gClusterName = trim(q($[clusterName])); my $gServerName = trim(q($[serverName])); +$::gAppName = trim(q($[appname])); if ($gClusterName) { $::gScriptFile = "AdminApplication.stopApplicationOnCluster('$::gAppName', '$gClusterName')"; @@ -49,6 +50,7 @@ 'AdminControl.invoke(appmgr,\'stopApplication\',\'' . $::gAppName . '\')'; } +# my $wsadmin_abs_path = trim(q($[wsadminabspath])); $::gWSAdminAbsPath = trim(q($[wsadminabspath])); $::gClasspath = trim(q($[classpath])); $::gJavaParams = trim(q($[javaparams])); @@ -87,7 +89,9 @@ () if ($::gConfigurationName ne '') { %configuration = getConfiguration($ec, $::gConfigurationName); } - + if (!$::gWSAdminAbsPath) { + $fixedLocation = $::gWSAdminAbsPath = $configuration{wsadminabspath}; + } push(@args, '"'.$fixedLocation.'"'); if ($::gAdditionalOptions && $::gAdditionalOptions ne '') { From b9b4c4fae6c7b8ec88da07c5d2c9038a79f45c88 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Tue, 2 Feb 2021 16:08:18 +0200 Subject: [PATCH 21/47] Updated logic of error handling during get config calls --- src/main/resources/project/WebSphere/Util.pm | 27 +++++++++---------- .../resources/project/WebSphere/WebSphere.pm | 22 ++++++++------- .../project/conf/attemptConnection.pl | 2 ++ 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/resources/project/WebSphere/Util.pm b/src/main/resources/project/WebSphere/Util.pm index 0af48fdb..3df662d1 100644 --- a/src/main/resources/project/WebSphere/Util.pm +++ b/src/main/resources/project/WebSphere/Util.pm @@ -156,20 +156,19 @@ sub getConfiguration { $cfg = $flowpdf->getContext()->getConfigValuesAsHashref(); } catch { my ($e) = @_; - print "ERROR: ", Dumper $e; - die "Something has happened during config retrieval...\n"; - # my ($e) = @_; - # unless (ref $e) { - # $self->bail_out($e); - # } - # my $err_msg = $e->getMessage(); - # if ($e->is('FlowPDF::Exception::ConfigDoesNotExist')) { - # if ($err_msg =~ m/Configuration\s'(.*?)'/s) { - # $err_msg = qq|Configuration "$1" does not exist|; - # } - # } - # $self->error($err_msg); - # $self->bail_out($err_msg); + + unless (ref $e) { + print "Error: Configuration '$configName' doesn't exist\n"; + exit ERROR; + } + my $err_msg = $e->getMessage(); + if ($e->is('FlowPDF::Exception::ConfigDoesNotExist')) { + if ($err_msg =~ m/Configuration\s'(.*?)'/s) { + $err_msg = qq|Configuration "$1" does not exist|; + } + } + print "Error: Configuration '$configName' doesn't exist\n"; + exit ERROR; }; my %configuration = %$cfg; $configuration{configurationName} = $configName; diff --git a/src/main/resources/project/WebSphere/WebSphere.pm b/src/main/resources/project/WebSphere/WebSphere.pm index af6f7f42..f245afb7 100644 --- a/src/main/resources/project/WebSphere/WebSphere.pm +++ b/src/main/resources/project/WebSphere/WebSphere.pm @@ -1148,24 +1148,26 @@ sub _getConfiguration { my $flowpdf = $self->{flowpdf}; my $cfg = undef; - print "CALLING FLOWPDF:\n"; try { $cfg = $flowpdf->getContext()->getConfigValuesAsHashref(); } catch { my ($e) = @_; unless (ref $e) { - $self->bail_out($e); + print "Error: $e\n"; + my $error_string = "Configuration '$configurationName' doesn't exist"; + $self->setSummary($error_string); } - my $err_msg = $e->getMessage(); - if ($e->is('FlowPDF::Exception::ConfigDoesNotExist')) { - if ($err_msg =~ m/Configuration\s'(.*?)'/s) { - $err_msg = qq|Configuration "$1" does not exist|; - } + else { + my $err_msg = $e->getMessage(); + print "Error: $err_msg\n"; + my $error_string = "Configuration '$configurationName' doesn't exist"; + print "Error: $error_string\n"; + $self->setSummary($error_string); } - $self->error($err_msg); - $self->bail_out($err_msg); }; - print "FLOWPDF RESULT: ", Dumper $cfg; + if (!defined $cfg) { + return undef; + } my %configuration = %$cfg; $configuration{configurationName} = $configurationName; diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl index 4381b390..71dd08e1 100644 --- a/src/main/resources/project/conf/attemptConnection.pl +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -31,7 +31,9 @@ my $credential = '$[credential]'; my $debug_level = '$[debug]'; +print "Got credential: $credential\n"; my $cred_xpath = $ec->getFullCredential($credential); +print "CRED XML: $cred_xpath->{_xml}\n"; my $username = $cred_xpath->findvalue("//userName"); my $password = $cred_xpath->findvalue("//password"); From 31c1ca09b08b431f7a95d2e5bc2bdec38ccbcf21 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Wed, 3 Feb 2021 21:28:41 +0200 Subject: [PATCH 22/47] Fixed tests, still in progress --- specs/build.gradle | 3 +- .../spec/CreateConfigurationsSuite.groovy | 29 +++++++++- .../plugin/spec/PluginTestHelper.groovy | 55 +++++++++++++++++-- specs/src/test/resources/dsl/GetResources.dsl | 19 ++++++- 4 files changed, 95 insertions(+), 11 deletions(-) diff --git a/specs/build.gradle b/specs/build.gradle index f7fc30e3..bd615a9d 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -27,7 +27,8 @@ repositories { dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.5:indy' compile 'org.spockframework:spock-core:1.1-groovy-2.4' - compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' + compile 'com.electriccloud:ec-specs-plugins-core:1.9.2' + // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0-SNAPSHOT' compile 'com.jayway.restassured:rest-assured:2.4.0' testCompile( 'com.athaydes:spock-reports:1.6.0' ) { diff --git a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy index 655b32ed..251ead1e 100644 --- a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy +++ b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy @@ -15,11 +15,15 @@ import com.electriccloud.plugin.spec.PluginTestHelper *following envs should be present: */ @Stepwise -class CreateConfigurationsSute extends PluginTestHelper { +class CreateConfigurationsSuite extends PluginTestHelper { @Shared String resourceName def doSetupSpec() { + // TODO: Move credentials from Default project to the project that has been created specially for CreateConfiguration tests. + def username = System.getenv('WAS_USERNAME') ?: 'wsadmin' + def password = System.getenv('WAS_PASSWORD') ?: 'changeme' + createCDCredential("Default", "websphere_credential", username, password) resourceName = createWebSphereResource() } @@ -27,6 +31,29 @@ class CreateConfigurationsSute extends PluginTestHelper { } String conntype + @IgnoreRest + def "Creation of Configuration that has external credential - Positive" () { + conntype = "SOAP" + when: 'Creation Runs' + def wasResourceName = System.getenv('WAS_HOST'); + createWorkspace(wasResourceName) + def inputData = [ + websphere_url: System.getenv('WAS_HOST'), + websphere_port: System.getenv('WAS_PORT') ?: '', + + conntype: conntype, + wsadminabspath: System.getenv('WSADMIN_PATH') ?: '', + test_connection: 1, + credential: 'websphere_credential', + test_connection_res: wasResourceName, + debug: 1 + ] + def credentialReferences = [ + websphere_credential: "/projects/Default/credentials/websphere_credential" + ] + createCustomConfigurationWithExternalCredentials("ConfigWithExternalCred", inputData, credentialReferences) + then: 'Wait until job is completed.' + } def "Creation SOAP configuration for testing - Positive" () { conntype = "SOAP" diff --git a/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy b/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy index b178440e..df2bd625 100644 --- a/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy +++ b/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy @@ -184,6 +184,33 @@ try { ) } + def createCustomConfigurationWithExternalCredentials(String configName, def parameters, def credentialReferences) { + parameters.config = configName + def parametersString = parameters.collect { k, v -> "$k: '$v'" }.join(', ') + def credRefString = credentialReferences.collect { k, v -> "$k: '$v'" }.join(', ') + def code = """ + runProcedure( + "projectName": '/plugins/EC-WebSphere/project', + "procedureName": 'CreateConfiguration', + "actualParameter": [ + $parametersString + ], + "credentialReferenceParameter": [ + $credRefString + ] + ) + """ + def result = dslWithTimeout(code) + waitUntil { + try { + jobCompleted(result) + } catch (Exception e) { + println e.getMessage() + } + } + return result + } + def createWebSphereResource() { def hostname = System.getenv('WEBSPHERE_RESOURCE_HOST') def resources = dsl "getResources()" @@ -255,16 +282,32 @@ try { def shell = System.getenv('IS_WINDOWS') == "1" ? 'powershell' : 'bash' def result = """ runProcedure( - projectName: '$projectName', - procedureName: 'runCustomShellCommand', - actualParameter: [ - cli_command: '$command', - stepRes: '$res', - shellCommand:'$shell', + "projectName": '$projectName', + "procedureName": 'runCustomShellCommand', + "actualParameter": [ + "cli_command": '$command', + "stepRes": '$res', + "shellCommand":'$shell', ] ) """ return dslWithTimeout(result) } + def createCDCredential(projectName, credentialName, userName, password) { + def result = """ + try { + createCredential([ + "projectName": "$projectName", + "credentialName": "$credentialName", + "userName" : "$userName", + "password" : "$password" + ]) + } catch (Exception e) { + println(e.getMessage()) + } + """ + return dsl(result) + } + } diff --git a/specs/src/test/resources/dsl/GetResources.dsl b/specs/src/test/resources/dsl/GetResources.dsl index f8499f91..8e946e2a 100644 --- a/specs/src/test/resources/dsl/GetResources.dsl +++ b/specs/src/test/resources/dsl/GetResources.dsl @@ -42,8 +42,21 @@ procedure 'GetResources', { description = '' alwaysRun = '0' broadcast = '0' - command = '''URL penny = new URL(\'$[fileURL]\') -new File(\'$[filePath]\') << penny.openStream() + command = ''' +use strict; +use warnings; +use Data::Dumper; +use LWP::UserAgent; +my $file_path = '$[filePath]'; + +my $ua = LWP::UserAgent->new(); +my $url = '$[fileURL]'; +my $response = $ua->get($url); +open (my $fh, '>', $file_path) or die "Cant open file: $!\\n"; +binmode $fh; + +my $content = $response->decoded_content(); +print $fh $content; ''' condition = '' @@ -56,7 +69,7 @@ new File(\'$[filePath]\') << penny.openStream() projectName = testProjectName releaseMode = 'none' resourceName = '$[wasResourceName]' - shell = 'ec-groovy' + shell = 'ec-perl' subprocedure = null subproject = null timeLimit = '' From e83c36da199590407a6b1e3a5a2d9dc7be3b852b Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Thu, 4 Feb 2021 10:25:22 +0200 Subject: [PATCH 23/47] Spec tests and minor bugfixes --- .../spec/CreateConfigurationsSuite.groovy | 73 +++++++++++++++++-- .../plugin/spec/PluginTestHelper.groovy | 37 +++++++++- .../project/conf/attemptConnection.pl | 8 +- 3 files changed, 109 insertions(+), 9 deletions(-) diff --git a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy index 251ead1e..259b8393 100644 --- a/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy +++ b/specs/src/test/groovy/com/electriccloud/plugin/spec/CreateConfigurationsSuite.groovy @@ -1,5 +1,6 @@ package com.electriccloud.plugin.spec +import jdk.nashorn.internal.objects.Global import spock.lang.* import com.electriccloud.spec.SpockTestSupport import com.electriccloud.plugin.spec.PluginTestHelper @@ -18,12 +19,40 @@ import com.electriccloud.plugin.spec.PluginTestHelper class CreateConfigurationsSuite extends PluginTestHelper { @Shared String resourceName + @Shared + String testProjectName = "CreateConfigurationTestProject" + @Shared + def external_credentials = [ + correct_cred_project: testProjectName, + correct_cred_name: 'websphere_credential', + incorrect_cred_project: testProjectName, + incorrect_cred_name : 'websphere_credential_wrong' + ] + @Shared + String correct_external_cred_path = + "/projects/${external_credentials.correct_cred_project}/credentials/${external_credentials.correct_cred_name}" + + @Shared + String incorrect_external_cred_path = + "/projects/${external_credentials.incorrect_cred_project}/credentials/${external_credentials.incorrect_cred_name}" def doSetupSpec() { - // TODO: Move credentials from Default project to the project that has been created specially for CreateConfiguration tests. + createProjectForCreateConfiguration(external_credentials.correct_cred_project) def username = System.getenv('WAS_USERNAME') ?: 'wsadmin' def password = System.getenv('WAS_PASSWORD') ?: 'changeme' - createCDCredential("Default", "websphere_credential", username, password) + def wrong_username = 'wcadmin' + createCDCredential( + external_credentials.correct_cred_project, + external_credentials.correct_cred_name, + username, + password + ) + createCDCredential( + external_credentials.incorrect_cred_project, + external_credentials.incorrect_cred_name, + wrong_username, + password + ) resourceName = createWebSphereResource() } @@ -31,7 +60,7 @@ class CreateConfigurationsSuite extends PluginTestHelper { } String conntype - @IgnoreRest + def "Creation of Configuration that has external credential - Positive" () { conntype = "SOAP" when: 'Creation Runs' @@ -44,16 +73,48 @@ class CreateConfigurationsSuite extends PluginTestHelper { conntype: conntype, wsadminabspath: System.getenv('WSADMIN_PATH') ?: '', test_connection: 1, - credential: 'websphere_credential', + credential: external_credentials.correct_cred_name, + test_connection_res: wasResourceName, + debug: 1 + ] + def credentialReferences = [ + "${external_credentials.correct_cred_name}": correct_external_cred_path + ] + def jobResult = createCustomConfigurationWithExternalCredentials("ConfigWithExternalCred", inputData, credentialReferences) + then: 'Wait until job is completed.' + def outcome = getJobProperty('/myJob/outcome', jobResult.jobId) + assert outcome == "success" + } + + + def "Creation of Configuration that has external credential - Negative" () { + conntype = "SOAP" + when: 'Creation Runs' + def wasResourceName = System.getenv('WAS_HOST'); + createWorkspace(wasResourceName) + def inputData = [ + websphere_url: System.getenv('WAS_HOST'), + websphere_port: System.getenv('WAS_PORT') ?: '', + + conntype: conntype, + wsadminabspath: System.getenv('WSADMIN_PATH') ?: '', + test_connection: 1, + credential: external_credentials.incorrect_cred_name, test_connection_res: wasResourceName, debug: 1 ] def credentialReferences = [ - websphere_credential: "/projects/Default/credentials/websphere_credential" + "${external_credentials.incorrect_cred_name}": incorrect_external_cred_path ] - createCustomConfigurationWithExternalCredentials("ConfigWithExternalCred", inputData, credentialReferences) + + def jobResult = createCustomConfigurationWithExternalCredentials("ConfigWithExternalCred", inputData, credentialReferences) then: 'Wait until job is completed.' + def outcome = getJobProperty('/myJob/outcome', jobResult.jobId) + assert outcome == "error" + def jobSummary = getJobProperty("/myJob/jobSteps/AttemptConnection/summary", jobResult.jobId) + assert jobSummary =~ "Error occurred while trying to create the configuration. Check the job log for more details." } + def "Creation SOAP configuration for testing - Positive" () { conntype = "SOAP" diff --git a/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy b/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy index df2bd625..89973db0 100644 --- a/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy +++ b/specs/src/test/groovy/com/electriccloud/plugin/spec/PluginTestHelper.groovy @@ -184,8 +184,28 @@ try { ) } - def createCustomConfigurationWithExternalCredentials(String configName, def parameters, def credentialReferences) { + def createCustomConfigurationWithExternalCredentials(String configName, def parameters, def credentialReferences, boolean recreate=true) { parameters.config = configName + + if (recreate) { + def deleteConfigCode = """ + runProcedure( + "projectName": '/plugins/EC-WebSphere/project', + "procedureName": 'DeleteConfiguration', + "actualParameter": [ + "config": "$configName" + ] + ) + """ + def deleteResult = dslWithTimeout(deleteConfigCode) + waitUntil { + try { + jobCompleted(deleteResult) + } catch (Exception e) { + println e.getMessage() + } + } + } def parametersString = parameters.collect { k, v -> "$k: '$v'" }.join(', ') def credRefString = credentialReferences.collect { k, v -> "$k: '$v'" }.join(', ') def code = """ @@ -296,6 +316,12 @@ try { def createCDCredential(projectName, credentialName, userName, password) { def result = """ + try { + deleteCredential([ + "projectName": "$projectName", + "credentialName": "$credentialName", + ]) + } catch (Exception e) {} try { createCredential([ "projectName": "$projectName", @@ -309,5 +335,14 @@ try { """ return dsl(result) } + def createProjectForCreateConfiguration(projectName) { + def code = """ + try { + createProject("$projectName") + } + catch (Exception e) {} + """ + return dsl(code) + } } diff --git a/src/main/resources/project/conf/attemptConnection.pl b/src/main/resources/project/conf/attemptConnection.pl index 71dd08e1..23f63a87 100644 --- a/src/main/resources/project/conf/attemptConnection.pl +++ b/src/main/resources/project/conf/attemptConnection.pl @@ -31,9 +31,7 @@ my $credential = '$[credential]'; my $debug_level = '$[debug]'; -print "Got credential: $credential\n"; my $cred_xpath = $ec->getFullCredential($credential); -print "CRED XML: $cred_xpath->{_xml}\n"; my $username = $cred_xpath->findvalue("//userName"); my $password = $cred_xpath->findvalue("//password"); @@ -202,6 +200,12 @@ sub runCommand { } } + # sometimes it returns exit code 1 instead of 0. + if ($code == 0 && $stdout =~ m/java\.lang/s && $stdout =~ m/Exception/s && $stdout =~ m/Caused\sby/s) { + $errmsg = "Error occurred while trying to create the configuration. Check the job log for more details.\n"; + $code = 1; + } + return ($code, $stdout, $stderr, $errmsg); } ## end sub runCommand From 604be56f7710cf8effb27fd1f1c1511cc9633f15 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Thu, 4 Feb 2021 10:26:48 +0200 Subject: [PATCH 24/47] Fixed typos in help file --- help/help.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/help/help.adoc b/help/help.adoc index 7eac13f7..409c15b1 100644 --- a/help/help.adoc +++ b/help/help.adoc @@ -4424,16 +4424,16 @@ Discover WebSphere instance configuration on a resources or environment [[rns]] == Release notes -=== EC-WebSphere 3.9.0 +=== EC-WebSphere 2.9.0 - External credentials support has been added. -=== EC-WebSphere 3.8.1 +=== EC-WebSphere 2.8.1 - The documentation has been migrated to the main documentation site. -=== EC-WebSphere 3.8.0 +=== EC-WebSphere 2.8.0 - Add checking connection while creating a configuration. From 440e85cca6d118fac17819012ef9487bfef752a5 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Thu, 4 Feb 2021 10:27:30 +0200 Subject: [PATCH 25/47] Changed build repo --- build.gradle | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index 34d5da07..093e8a9e 100644 --- a/build.gradle +++ b/build.gradle @@ -18,23 +18,23 @@ buildscript { } repositories { - maven { - url "http://artifactory.electric-cloud.com/artifactory/repo" - } - // maven { - // url 'https://nexus-internal.cloudbees.com/content/repositories/snapshots' - // credentials { - // username = nexusUsername - // password = nexusPassword - // } - // } - // maven { - // url 'https://nexus-internal.cloudbees.com/service/local/staging/deploy/maven2' - // credentials { - // username = nexusUsername - // password = nexusPassword - // } - // } + // maven { + // url "http://artifactory.electric-cloud.com/artifactory/repo" + // } + maven { + url 'https://nexus-internal.cloudbees.com/content/repositories/snapshots' + credentials { + username = nexusUsername + password = nexusPassword + } + } + maven { + url 'https://nexus-internal.cloudbees.com/service/local/staging/deploy/maven2' + credentials { + username = nexusUsername + password = nexusPassword + } + } maven { url 'http://35.234.102.60/artifactory/ec' credentials { From ec873c7addb9c1e523f68cb217e52558a1aeb163 Mon Sep 17 00:00:00 2001 From: Dmitriy Shamatrin Date: Tue, 2 Mar 2021 15:37:30 +0200 Subject: [PATCH 26/47] Added detailed description --- src/main/resources/META-INF/plugin.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 32d798bb..46f7bc77 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -35,5 +35,11 @@ true + + Use this plugin to interact with an IBM WebSphere Server: + * Start and stop the server. + * Manage applications within the server (start, deploy, undeploy, stop or custom task) using the provided WebSphere scripts in the bin directory under the installation home directory (wsadmin, startServer, stopServer). + * Run Jython scripts that are provided by the user or defined when a procedure is created. + WebSphere From 2dc8274997f279660012cb92080987b441dd1059 Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 12:27:22 +0200 Subject: [PATCH 27/47] updated build.gradle for hen dependencies --- specs/build.gradle | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/specs/build.gradle b/specs/build.gradle index bd615a9d..34b12fb4 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -1,6 +1,23 @@ +buildscript { + repositories { + mavenCentral() + jcenter() + maven { + url "https://dl.bintray.com/ecpluginsdev/maven" + } + } + dependencies { + classpath "com.cloudbees:hen:1.2.1" + } +} + +plugins { + id "com.cloudbees.cd.plugins.specs" version "1.8.1.0" +} apply plugin: "groovy" apply plugin: 'idea' +apply plugin: 'com.cloudbees.cd.plugins.specs-hen' version = "1.0" description = "EC-WebSphere Specs" @@ -24,17 +41,32 @@ repositories { // } } +generateHenClasses { + println System.getenv() + pluginName = 'EC-WebSphere' +} + dependencies { - compile 'org.codehaus.groovy:groovy-all:2.4.5:indy' + compile 'org.codehaus.groovy:groovy-all:2.5.5' compile 'org.spockframework:spock-core:1.1-groovy-2.4' - compile 'com.electriccloud:ec-specs-plugins-core:1.9.2' + compile ('com.electriccloud:ec-specs-plugins-core:1.9.2' ) { + exclude(group: "org.codehaus.groovy", module: "groovy-all") + } // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0-SNAPSHOT' compile 'com.jayway.restassured:rest-assured:2.4.0' testCompile( 'com.athaydes:spock-reports:1.6.0' ) { transitive = false // this avoids affecting your version of Groovy/Spock } + compile("com.cloudbees:hen:1.2.1") { + exclude(group: "org.codehaus.groovy", module: "groovy-all") + } + +} + +sendAllureReports { + projectName = 'ec-websphere' } test { From 088c6b604b254ed74cdb977e867078f17d6f432d Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 12:28:37 +0200 Subject: [PATCH 28/47] updated gradle version --- specs/gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/gradle/wrapper/gradle-wrapper.properties b/specs/gradle/wrapper/gradle-wrapper.properties index 74bb7784..3c9d0852 100644 --- a/specs/gradle/wrapper/gradle-wrapper.properties +++ b/specs/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip From 767b2a813a8e7b9b95e7dfc82901ac41da60a74a Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 12:31:54 +0200 Subject: [PATCH 29/47] updated plugin.specs version --- specs/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/build.gradle b/specs/build.gradle index 34b12fb4..d199f2e4 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -12,7 +12,7 @@ buildscript { } plugins { - id "com.cloudbees.cd.plugins.specs" version "1.8.1.0" + id "com.cloudbees.cd.plugins.specs" version "1.9.2.0" } apply plugin: "groovy" From 2e238e742993cd9bfa6bd0cf309b48afea3417c9 Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 12:34:59 +0200 Subject: [PATCH 30/47] added plugin classes generated by hen framework --- .../com/cloudbees/pdk/hen/WebSphere.groovy | 156 ++++++++++ .../pdk/hen/procedures/CheckApp.groovy | 83 +++++ .../pdk/hen/procedures/CheckNodeStatus.groovy | 74 +++++ .../pdk/hen/procedures/CheckPageStatus.groovy | 77 +++++ .../hen/procedures/CheckServerStatus.groovy | 63 ++++ .../hen/procedures/ConfigEJBContainer.groovy | 119 +++++++ .../hen/procedures/ConfigureSession.groovy | 108 +++++++ .../procedures/CreateApplicationServer.groovy | 78 +++++ .../CreateApplicationServerTemplate.groovy | 66 ++++ .../pdk/hen/procedures/CreateCluster.groovy | 126 ++++++++ .../procedures/CreateClusterMembers.groovy | 60 ++++ .../hen/procedures/CreateDatasource.groovy | 78 +++++ .../CreateEndToEndMailProvider.groovy | 203 ++++++++++++ .../CreateFirstClusterMember.groovy | 134 ++++++++ .../hen/procedures/CreateJDBCProvider.groovy | 84 +++++ .../hen/procedures/CreateJMSProvider.groovy | 102 ++++++ .../hen/procedures/CreateMailSession.groovy | 192 ++++++++++++ .../procedures/CreateOrUpdateJMSQueue.groovy | 99 ++++++ .../procedures/CreateOrUpdateJMSTopic.groovy | 93 ++++++ .../CreateOrUpdateSIBJMSActivationSpec.groovy | 78 +++++ ...eateOrUpdateSIBJMSConnectionFactory.groovy | 72 +++++ .../CreateOrUpdateWMQJMSActivationSpec.groovy | 84 +++++ ...eateOrUpdateWMQJMSConnectionFactory.groovy | 78 +++++ .../procedures/DeleteApplicationServer.groovy | 48 +++ .../DeleteApplicationServerTemplate.groovy | 42 +++ .../pdk/hen/procedures/DeleteCluster.groovy | 42 +++ .../hen/procedures/DeleteDatasource.groovy | 42 +++ .../hen/procedures/DeleteJDBCProvider.groovy | 42 +++ .../procedures/DeleteJMSActivationSpec.groovy | 69 +++++ .../DeleteJMSConnectionFactory.groovy | 69 +++++ .../hen/procedures/DeleteJMSProvider.groovy | 42 +++ .../pdk/hen/procedures/DeleteJMSQueue.groovy | 69 +++++ .../pdk/hen/procedures/DeleteJMSTopic.groovy | 69 +++++ .../pdk/hen/procedures/DeployApp.groovy | 72 +++++ .../hen/procedures/DeployEnterpriseApp.groovy | 291 ++++++++++++++++++ .../pdk/hen/procedures/DeployOSGiApp.groovy | 78 +++++ .../pdk/hen/procedures/Discover.groovy | 36 +++ .../hen/procedures/DiscoverResource.groovy | 30 ++ .../hen/procedures/EditConfiguration.groovy | 92 ++++++ .../procedures/ExportApplicationServer.groovy | 48 +++ .../procedures/ImportApplicationServer.groovy | 72 +++++ .../hen/procedures/ListClusterMembers.groovy | 42 +++ .../hen/procedures/MapSharedLibrary.groovy | 48 +++ .../ModifyApplicationClassLoader.groovy | 96 ++++++ .../pdk/hen/procedures/PublishWSDL.groovy | 78 +++++ .../procedures/RemoveClusterMembers.groovy | 48 +++ .../pdk/hen/procedures/RunCustomJob.groovy | 99 ++++++ .../pdk/hen/procedures/StartApp.groovy | 78 +++++ .../procedures/StartApplicationServers.groovy | 42 +++ .../pdk/hen/procedures/StartCluster.groovy | 42 +++ .../procedures/StartDeploymentManager.groovy | 60 ++++ .../pdk/hen/procedures/StartNode.groovy | 72 +++++ .../pdk/hen/procedures/StartServer.groovy | 42 +++ .../pdk/hen/procedures/StopApp.groovy | 78 +++++ .../procedures/StopApplicationServers.groovy | 42 +++ .../pdk/hen/procedures/StopCluster.groovy | 48 +++ .../procedures/StopDeploymentManager.groovy | 60 ++++ .../pdk/hen/procedures/StopNode.groovy | 66 ++++ .../pdk/hen/procedures/StopServer.groovy | 48 +++ .../pdk/hen/procedures/SyncNodes.groovy | 36 +++ .../pdk/hen/procedures/UndeployApp.groovy | 66 ++++ .../pdk/hen/procedures/UpdateApp.groovy | 84 +++++ .../pdk/hen/procedures/WebSphereConfig.groovy | 92 ++++++ 63 files changed, 4927 insertions(+) create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/WebSphere.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckNodeStatus.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckPageStatus.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckServerStatus.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigEJBContainer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigureSession.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServerTemplate.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateCluster.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateClusterMembers.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateDatasource.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateEndToEndMailProvider.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateFirstClusterMember.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJDBCProvider.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJMSProvider.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateMailSession.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSQueue.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSTopic.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSActivationSpec.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSConnectionFactory.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSActivationSpec.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSConnectionFactory.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServerTemplate.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteCluster.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteDatasource.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJDBCProvider.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSActivationSpec.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSConnectionFactory.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSProvider.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSQueue.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSTopic.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployEnterpriseApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployOSGiApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/Discover.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DiscoverResource.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/EditConfiguration.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ExportApplicationServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ImportApplicationServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ListClusterMembers.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/MapSharedLibrary.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ModifyApplicationClassLoader.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/PublishWSDL.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RemoveClusterMembers.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RunCustomJob.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApplicationServers.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartCluster.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartDeploymentManager.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartNode.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApplicationServers.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopCluster.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopDeploymentManager.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopNode.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopServer.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/SyncNodes.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UndeployApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UpdateApp.groovy create mode 100644 specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/WebSphereConfig.groovy diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/WebSphere.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/WebSphere.groovy new file mode 100644 index 00000000..eff199bb --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/WebSphere.groovy @@ -0,0 +1,156 @@ +package com.cloudbees.pdk.hen + +import com.cloudbees.pdk.hen.procedures.* +import com.cloudbees.pdk.hen.Plugin + +import static com.cloudbees.pdk.hen.Utils.env + +class WebSphere extends Plugin { + + String resourceName = System.getenv('WAS_HOST') ?: "wsResource" + + static WebSphere create() { + WebSphere plugin = new WebSphere(name: 'EC-WebSphere') + plugin.configure(plugin.config) + return plugin + } + static WebSphere createWithoutConfig() { + // todo: possible problem is that different procedures contains different field name for configuration value + WebSphere plugin = new WebSphere(name: 'EC-WebSphere', configPath: 'websphere_cfgs', configFieldName: 'configurationName') + return plugin + } + + //user-defined after boilerplate was generated, default parameters setup + WebSphereConfig config = WebSphereConfig + .create(this) + //.parameter(value) add parameters here + + EditConfiguration editConfig(){ + editConfiguration.addParam(this.configFieldNameCreateConfiguration, this.configName) + return editConfiguration + } + + + CheckApp checkApp = CheckApp.create(this) + + CheckNodeStatus checkNodeStatus = CheckNodeStatus.create(this, resourceName) + + CheckPageStatus checkPageStatus = CheckPageStatus.create(this) + + CheckServerStatus checkServerStatus = CheckServerStatus.create(this) + + ConfigEJBContainer configEJBContainer = ConfigEJBContainer.create(this) + + ConfigureSession configureSession = ConfigureSession.create(this) + + CreateApplicationServer createApplicationServer = CreateApplicationServer.create(this) + + CreateApplicationServerTemplate createApplicationServerTemplate = CreateApplicationServerTemplate.create(this) + + CreateCluster createCluster = CreateCluster.create(this) + + CreateClusterMembers createClusterMembers = CreateClusterMembers.create(this) + + CreateDatasource createDatasource = CreateDatasource.create(this) + + CreateEndToEndMailProvider createEndToEndMailProvider = CreateEndToEndMailProvider.create(this) + + CreateFirstClusterMember createFirstClusterMember = CreateFirstClusterMember.create(this) + + CreateJDBCProvider createJDBCProvider = CreateJDBCProvider.create(this) + + CreateJMSProvider createJMSProvider = CreateJMSProvider.create(this) + + CreateMailSession createMailSession = CreateMailSession.create(this) + + CreateOrUpdateJMSQueue createOrUpdateJMSQueue = CreateOrUpdateJMSQueue.create(this) + + CreateOrUpdateJMSTopic createOrUpdateJMSTopic = CreateOrUpdateJMSTopic.create(this) + + CreateOrUpdateSIBJMSActivationSpec createOrUpdateSIBJMSActivationSpec = CreateOrUpdateSIBJMSActivationSpec.create(this) + + CreateOrUpdateSIBJMSConnectionFactory createOrUpdateSIBJMSConnectionFactory = CreateOrUpdateSIBJMSConnectionFactory.create(this) + + CreateOrUpdateWMQJMSActivationSpec createOrUpdateWMQJMSActivationSpec = CreateOrUpdateWMQJMSActivationSpec.create(this) + + CreateOrUpdateWMQJMSConnectionFactory createOrUpdateWMQJMSConnectionFactory = CreateOrUpdateWMQJMSConnectionFactory.create(this) + + DeleteApplicationServer deleteApplicationServer = DeleteApplicationServer.create(this) + + DeleteApplicationServerTemplate deleteApplicationServerTemplate = DeleteApplicationServerTemplate.create(this) + + DeleteCluster deleteCluster = DeleteCluster.create(this) + + DeleteDatasource deleteDatasource = DeleteDatasource.create(this) + + DeleteJDBCProvider deleteJDBCProvider = DeleteJDBCProvider.create(this) + + DeleteJMSActivationSpec deleteJMSActivationSpec = DeleteJMSActivationSpec.create(this) + + DeleteJMSConnectionFactory deleteJMSConnectionFactory = DeleteJMSConnectionFactory.create(this) + + DeleteJMSProvider deleteJMSProvider = DeleteJMSProvider.create(this) + + DeleteJMSQueue deleteJMSQueue = DeleteJMSQueue.create(this) + + DeleteJMSTopic deleteJMSTopic = DeleteJMSTopic.create(this) + + DeployApp deployApp = DeployApp.create(this) + + DeployEnterpriseApp deployEnterpriseApp = DeployEnterpriseApp.create(this) + + DeployOSGiApp deployOSGiApp = DeployOSGiApp.create(this) + + Discover discover = Discover.create(this) + + DiscoverResource discoverResource = DiscoverResource.create(this) + + EditConfiguration editConfiguration = EditConfiguration.create(this) + + ExportApplicationServer exportApplicationServer = ExportApplicationServer.create(this) + + ImportApplicationServer importApplicationServer = ImportApplicationServer.create(this) + + ListClusterMembers listClusterMembers = ListClusterMembers.create(this) + + MapSharedLibrary mapSharedLibrary = MapSharedLibrary.create(this) + + ModifyApplicationClassLoader modifyApplicationClassLoader = ModifyApplicationClassLoader.create(this) + + PublishWSDL publishWSDL = PublishWSDL.create(this) + + RemoveClusterMembers removeClusterMembers = RemoveClusterMembers.create(this) + + RunCustomJob runCustomJob = RunCustomJob.create(this) + + StartApp startApp = StartApp.create(this) + + StartApplicationServers startApplicationServers = StartApplicationServers.create(this) + + StartCluster startCluster = StartCluster.create(this) + + StartDeploymentManager startDeploymentManager = StartDeploymentManager.create(this) + + StartNode startNode = StartNode.create(this) + + StartServer startServer = StartServer.create(this) + + StopApp stopApp = StopApp.create(this) + + StopApplicationServers stopApplicationServers = StopApplicationServers.create(this) + + StopCluster stopCluster = StopCluster.create(this) + + StopDeploymentManager stopDeploymentManager = StopDeploymentManager.create(this) + + StopNode stopNode = StopNode.create(this) + + StopServer stopServer = StopServer.create(this) + + SyncNodes syncNodes = SyncNodes.create(this) + + UndeployApp undeployApp = UndeployApp.create(this) + + UpdateApp updateApp = UpdateApp.create(this) + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckApp.groovy new file mode 100644 index 00000000..2f91bfa4 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckApp.groovy @@ -0,0 +1,83 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CheckApp extends Procedure { + + static CheckApp create(Plugin plugin) { + return new CheckApp(procedureName: 'CheckApp', plugin: plugin, ) + } + + + CheckApp flush() { + this.flushParams() + return this + } + + //Generated + + CheckApp appname(String appname) { + this.addParam('appname', appname) + return this + } + + + CheckApp appStateChecked(String appStateChecked) { + this.addParam('appStateChecked', appStateChecked) + return this + } + + CheckApp appStateChecked(AppStateCheckedOptions appStateChecked) { + this.addParam('appStateChecked', appStateChecked.toString()) + return this + } + + + CheckApp configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CheckApp waitTimeForState(String waitTimeForState) { + this.addParam('waitTimeForState', waitTimeForState) + return this + } + + + CheckApp wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + + enum AppStateCheckedOptions { + + APPLICATION_IS_INSTALLED("EXISTS"), + + APPLICATION_IS_NOT_INSTALLED("NOT_EXISTS"), + + APPLICATION_IS_READY("READY"), + + APPLICATION_IS_NOT_READY("NOT_READY"), + + APPLICATION_IS_RUNNING("RUNNING"), + + APPLICATION_IS_NOT_RUNNING("NOT_RUNNING") + + private String value + AppStateCheckedOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckNodeStatus.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckNodeStatus.groovy new file mode 100644 index 00000000..68113ece --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckNodeStatus.groovy @@ -0,0 +1,74 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CheckNodeStatus extends Procedure { + + static CheckNodeStatus create(Plugin plugin, String resourceName) { + if (resourceName) { + return new CheckNodeStatus(procedureName: 'CheckNodeStatus', plugin: plugin, resourceName: resourceName) + } + return new CheckNodeStatus(procedureName: 'CheckNodeStatus', plugin: plugin, ) + } + + + CheckNodeStatus flush() { + this.flushParams() + return this + } + + //Generated + + CheckNodeStatus configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + CheckNodeStatus nodeName(String nodeName) { + this.addParam('nodeName', nodeName) + return this + } + + + CheckNodeStatus successCriteria(String successCriteria) { + this.addParam('successCriteria', successCriteria) + return this + } + + CheckNodeStatus successCriteria(SuccessCriteriaOptions successCriteria) { + this.addParam('successCriteria', successCriteria.toString()) + return this + } + + + CheckNodeStatus wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + + enum SuccessCriteriaOptions { + + ALL_NODE_SERVERS_ARE_RUNNING_("ALL_RUNNING"), + + ALL_NODE_SERVERS_ARE_NOT_RUNNING_("ALL_STOPPED"), + + NODEAGENT_IS_RUNNING_("NODEAGENT_RUNNING") + + private String value + SuccessCriteriaOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckPageStatus.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckPageStatus.groovy new file mode 100644 index 00000000..4b76c950 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckPageStatus.groovy @@ -0,0 +1,77 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CheckPageStatus extends Procedure { + + static CheckPageStatus create(Plugin plugin) { + return new CheckPageStatus(procedureName: 'CheckPageStatus', plugin: plugin, credentials: [ + + 'credentialName': null, + + ]) + } + + + CheckPageStatus flush() { + this.flushParams() + return this + } + + //Generated + + CheckPageStatus maxelapsedtime(String maxelapsedtime) { + this.addParam('maxelapsedtime', maxelapsedtime) + return this + } + + + CheckPageStatus successcriteria(String successcriteria) { + this.addParam('successcriteria', successcriteria) + return this + } + + CheckPageStatus successcriteria(SuccesscriteriaOptions successcriteria) { + this.addParam('successcriteria', successcriteria.toString()) + return this + } + + + CheckPageStatus targeturl(String targeturl) { + this.addParam('targeturl', targeturl) + return this + } + + + + CheckPageStatus credentialName(String user, String password) { + this.addCredential('credentialName', user, password) + return this + } + + CheckPageStatus credentialNameReference(String path) { + this.addCredentialReference('credentialName', path) + return this + } + + + enum SuccesscriteriaOptions { + + PAGE_FOUND("pagefound"), + + PAGE_NOT_FOUND("pagenotfound") + + private String value + SuccesscriteriaOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckServerStatus.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckServerStatus.groovy new file mode 100644 index 00000000..2b2dce5f --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CheckServerStatus.groovy @@ -0,0 +1,63 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CheckServerStatus extends Procedure { + + static CheckServerStatus create(Plugin plugin) { + return new CheckServerStatus(procedureName: 'CheckServerStatus', plugin: plugin, ) + } + + + CheckServerStatus flush() { + this.flushParams() + return this + } + + //Generated + + CheckServerStatus configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CheckServerStatus maxelapsedtime(String maxelapsedtime) { + this.addParam('maxelapsedtime', maxelapsedtime) + return this + } + + + CheckServerStatus successcriteria(String successcriteria) { + this.addParam('successcriteria', successcriteria) + return this + } + + CheckServerStatus successcriteria(SuccesscriteriaOptions successcriteria) { + this.addParam('successcriteria', successcriteria.toString()) + return this + } + + + + + enum SuccesscriteriaOptions { + + SERVER_RESPONDS("response"), + + SERVER_DOESN_T_RESPOND("noresponse") + + private String value + SuccesscriteriaOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigEJBContainer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigEJBContainer.groovy new file mode 100644 index 00000000..bc2a38f6 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigEJBContainer.groovy @@ -0,0 +1,119 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ConfigEJBContainer extends Procedure { + + static ConfigEJBContainer create(Plugin plugin) { + return new ConfigEJBContainer(procedureName: 'ConfigEJBContainer', plugin: plugin, ) + } + + + ConfigEJBContainer flush() { + this.flushParams() + return this + } + + //Generated + + ConfigEJBContainer cacheSize(String cacheSize) { + this.addParam('cacheSize', cacheSize) + return this + } + + + ConfigEJBContainer cellName(String cellName) { + this.addParam('cellName', cellName) + return this + } + + + ConfigEJBContainer cleanupInterval(String cleanupInterval) { + this.addParam('cleanupInterval', cleanupInterval) + return this + } + + + ConfigEJBContainer configName(String configName) { + this.addParam('configName', configName) + return this + } + + + ConfigEJBContainer dataReplicationMode(String dataReplicationMode) { + this.addParam('dataReplicationMode', dataReplicationMode) + return this + } + + ConfigEJBContainer dataReplicationMode(DataReplicationModeOptions dataReplicationMode) { + this.addParam('dataReplicationMode', dataReplicationMode.toString()) + return this + } + + + ConfigEJBContainer enableSFSBFailover(String enableSFSBFailover) { + this.addParam('enableSFSBFailover', enableSFSBFailover) + return this + } + + + ConfigEJBContainer inactivePoolCleanupInterval(String inactivePoolCleanupInterval) { + this.addParam('inactivePoolCleanupInterval', inactivePoolCleanupInterval) + return this + } + + + ConfigEJBContainer messageBrokerDomainName(String messageBrokerDomainName) { + this.addParam('messageBrokerDomainName', messageBrokerDomainName) + return this + } + + + ConfigEJBContainer nodeName(String nodeName) { + this.addParam('nodeName', nodeName) + return this + } + + + ConfigEJBContainer passivationDirectory(String passivationDirectory) { + this.addParam('passivationDirectory', passivationDirectory) + return this + } + + + ConfigEJBContainer serverName(String serverName) { + this.addParam('serverName', serverName) + return this + } + + + ConfigEJBContainer wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + + enum DataReplicationModeOptions { + + CLIENT_ONLY("client"), + + SERVER_ONLY("server"), + + BOTH_CLIENT_AND_SERVER("both") + + private String value + DataReplicationModeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigureSession.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigureSession.groovy new file mode 100644 index 00000000..60444acc --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ConfigureSession.groovy @@ -0,0 +1,108 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ConfigureSession extends Procedure { + + static ConfigureSession create(Plugin plugin) { + return new ConfigureSession(procedureName: 'ConfigureSession', plugin: plugin, ) + } + + + ConfigureSession flush() { + this.flushParams() + return this + } + + //Generated + + ConfigureSession accessSessionOnTimeout(String accessSessionOnTimeout) { + this.addParam('accessSessionOnTimeout', accessSessionOnTimeout) + return this + } + + + ConfigureSession allowOverflow(String allowOverflow) { + this.addParam('allowOverflow', allowOverflow) + return this + } + + + ConfigureSession appName(String appName) { + this.addParam('appName', appName) + return this + } + + + ConfigureSession configName(String configName) { + this.addParam('configName', configName) + return this + } + + + ConfigureSession enableCookie(String enableCookie) { + this.addParam('enableCookie', enableCookie) + return this + } + + + ConfigureSession enableProtocolSwitching(String enableProtocolSwitching) { + this.addParam('enableProtocolSwitching', enableProtocolSwitching) + return this + } + + + ConfigureSession enableSerializedSession(String enableSerializedSession) { + this.addParam('enableSerializedSession', enableSerializedSession) + return this + } + + + ConfigureSession enableSSLTracking(String enableSSLTracking) { + this.addParam('enableSSLTracking', enableSSLTracking) + return this + } + + + ConfigureSession enableURLRewriting(String enableURLRewriting) { + this.addParam('enableURLRewriting', enableURLRewriting) + return this + } + + + ConfigureSession invalidTimeout(String invalidTimeout) { + this.addParam('invalidTimeout', invalidTimeout) + return this + } + + + ConfigureSession maxInMemorySessionCount(String maxInMemorySessionCount) { + this.addParam('maxInMemorySessionCount', maxInMemorySessionCount) + return this + } + + + ConfigureSession maxWaitTime(String maxWaitTime) { + this.addParam('maxWaitTime', maxWaitTime) + return this + } + + + ConfigureSession sessionPersistMode(String sessionPersistMode) { + this.addParam('sessionPersistMode', sessionPersistMode) + return this + } + + + ConfigureSession wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServer.groovy new file mode 100644 index 00000000..6fd6dd1a --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServer.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateApplicationServer extends Procedure { + + static CreateApplicationServer create(Plugin plugin) { + return new CreateApplicationServer(procedureName: 'CreateApplicationServer', plugin: plugin, ) + } + + + CreateApplicationServer flush() { + this.flushParams() + return this + } + + //Generated + + CreateApplicationServer configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateApplicationServer wasAppServerName(String wasAppServerName) { + this.addParam('wasAppServerName', wasAppServerName) + return this + } + + + CreateApplicationServer wasGenUniquePorts(String wasGenUniquePorts) { + this.addParam('wasGenUniquePorts', wasGenUniquePorts) + return this + } + + + CreateApplicationServer wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + CreateApplicationServer wasSourceServerName(String wasSourceServerName) { + this.addParam('wasSourceServerName', wasSourceServerName) + return this + } + + + CreateApplicationServer wasSourceType(String wasSourceType) { + this.addParam('wasSourceType', wasSourceType) + return this + } + + + CreateApplicationServer wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + CreateApplicationServer wasTemplateLocation(String wasTemplateLocation) { + this.addParam('wasTemplateLocation', wasTemplateLocation) + return this + } + + + CreateApplicationServer wasTemplateName(String wasTemplateName) { + this.addParam('wasTemplateName', wasTemplateName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServerTemplate.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServerTemplate.groovy new file mode 100644 index 00000000..79dcfafb --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateApplicationServerTemplate.groovy @@ -0,0 +1,66 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateApplicationServerTemplate extends Procedure { + + static CreateApplicationServerTemplate create(Plugin plugin) { + return new CreateApplicationServerTemplate(procedureName: 'CreateApplicationServerTemplate', plugin: plugin, ) + } + + + CreateApplicationServerTemplate flush() { + this.flushParams() + return this + } + + //Generated + + CreateApplicationServerTemplate configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateApplicationServerTemplate wasAppServerName(String wasAppServerName) { + this.addParam('wasAppServerName', wasAppServerName) + return this + } + + + CreateApplicationServerTemplate wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + CreateApplicationServerTemplate wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + CreateApplicationServerTemplate wasTemplateDescription(String wasTemplateDescription) { + this.addParam('wasTemplateDescription', wasTemplateDescription) + return this + } + + + CreateApplicationServerTemplate wasTemplateLocation(String wasTemplateLocation) { + this.addParam('wasTemplateLocation', wasTemplateLocation) + return this + } + + + CreateApplicationServerTemplate wasTemplateName(String wasTemplateName) { + this.addParam('wasTemplateName', wasTemplateName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateCluster.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateCluster.groovy new file mode 100644 index 00000000..2b57dee9 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateCluster.groovy @@ -0,0 +1,126 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateCluster extends Procedure { + + static CreateCluster create(Plugin plugin) { + return new CreateCluster(procedureName: 'CreateCluster', plugin: plugin, ) + } + + + CreateCluster flush() { + this.flushParams() + return this + } + + //Generated + + CreateCluster configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateCluster wasAddClusterMembers(String wasAddClusterMembers) { + this.addParam('wasAddClusterMembers', wasAddClusterMembers) + return this + } + + + CreateCluster wasClusterMembersGenUniquePorts(boolean wasClusterMembersGenUniquePorts) { + this.addParam('wasClusterMembersGenUniquePorts', wasClusterMembersGenUniquePorts) + return this + } + + + CreateCluster wasClusterMembersList(String wasClusterMembersList) { + this.addParam('wasClusterMembersList', wasClusterMembersList) + return this + } + + + CreateCluster wasClusterMemberWeight(String wasClusterMemberWeight) { + this.addParam('wasClusterMemberWeight', wasClusterMemberWeight) + return this + } + + + CreateCluster wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + CreateCluster wasCreateFirstClusterMember(String wasCreateFirstClusterMember) { + this.addParam('wasCreateFirstClusterMember', wasCreateFirstClusterMember) + return this + } + + + CreateCluster wasFirstClusterMemberCreationPolicy(String wasFirstClusterMemberCreationPolicy) { + this.addParam('wasFirstClusterMemberCreationPolicy', wasFirstClusterMemberCreationPolicy) + return this + } + + + CreateCluster wasFirstClusterMemberGenUniquePorts(boolean wasFirstClusterMemberGenUniquePorts) { + this.addParam('wasFirstClusterMemberGenUniquePorts', wasFirstClusterMemberGenUniquePorts) + return this + } + + + CreateCluster wasFirstClusterMemberName(String wasFirstClusterMemberName) { + this.addParam('wasFirstClusterMemberName', wasFirstClusterMemberName) + return this + } + + + CreateCluster wasFirstClusterMemberNode(String wasFirstClusterMemberNode) { + this.addParam('wasFirstClusterMemberNode', wasFirstClusterMemberNode) + return this + } + + + CreateCluster wasFirstClusterMemberTemplateName(String wasFirstClusterMemberTemplateName) { + this.addParam('wasFirstClusterMemberTemplateName', wasFirstClusterMemberTemplateName) + return this + } + + + CreateCluster wasFirstClusterMemberWeight(String wasFirstClusterMemberWeight) { + this.addParam('wasFirstClusterMemberWeight', wasFirstClusterMemberWeight) + return this + } + + + CreateCluster wasPreferLocal(boolean wasPreferLocal) { + this.addParam('wasPreferLocal', wasPreferLocal) + return this + } + + + CreateCluster wasServerResourcesPromotionPolicy(String wasServerResourcesPromotionPolicy) { + this.addParam('wasServerResourcesPromotionPolicy', wasServerResourcesPromotionPolicy) + return this + } + + + CreateCluster wasSourceServerName(String wasSourceServerName) { + this.addParam('wasSourceServerName', wasSourceServerName) + return this + } + + + CreateCluster wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateClusterMembers.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateClusterMembers.groovy new file mode 100644 index 00000000..cd85ad62 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateClusterMembers.groovy @@ -0,0 +1,60 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateClusterMembers extends Procedure { + + static CreateClusterMembers create(Plugin plugin) { + return new CreateClusterMembers(procedureName: 'CreateClusterMembers', plugin: plugin, ) + } + + + CreateClusterMembers flush() { + this.flushParams() + return this + } + + //Generated + + CreateClusterMembers configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateClusterMembers wasClusterMembersGenUniquePorts(String wasClusterMembersGenUniquePorts) { + this.addParam('wasClusterMembersGenUniquePorts', wasClusterMembersGenUniquePorts) + return this + } + + + CreateClusterMembers wasClusterMembersList(String wasClusterMembersList) { + this.addParam('wasClusterMembersList', wasClusterMembersList) + return this + } + + + CreateClusterMembers wasClusterMemberWeight(String wasClusterMemberWeight) { + this.addParam('wasClusterMemberWeight', wasClusterMemberWeight) + return this + } + + + CreateClusterMembers wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + CreateClusterMembers wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateDatasource.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateDatasource.groovy new file mode 100644 index 00000000..810437c6 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateDatasource.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateDatasource extends Procedure { + + static CreateDatasource create(Plugin plugin) { + return new CreateDatasource(procedureName: 'CreateDatasource', plugin: plugin, ) + } + + + CreateDatasource flush() { + this.flushParams() + return this + } + + //Generated + + CreateDatasource authAliasName(String authAliasName) { + this.addParam('authAliasName', authAliasName) + return this + } + + + CreateDatasource configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateDatasource datasourceDescription(String datasourceDescription) { + this.addParam('datasourceDescription', datasourceDescription) + return this + } + + + CreateDatasource datasourceHelperClassname(String datasourceHelperClassname) { + this.addParam('datasourceHelperClassname', datasourceHelperClassname) + return this + } + + + CreateDatasource datasourceJNDIName(String datasourceJNDIName) { + this.addParam('datasourceJNDIName', datasourceJNDIName) + return this + } + + + CreateDatasource datasourceName(String datasourceName) { + this.addParam('datasourceName', datasourceName) + return this + } + + + CreateDatasource jdbcProvider(String jdbcProvider) { + this.addParam('jdbcProvider', jdbcProvider) + return this + } + + + CreateDatasource statementCacheSize(String statementCacheSize) { + this.addParam('statementCacheSize', statementCacheSize) + return this + } + + + CreateDatasource wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateEndToEndMailProvider.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateEndToEndMailProvider.groovy new file mode 100644 index 00000000..5b569a3f --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateEndToEndMailProvider.groovy @@ -0,0 +1,203 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateEndToEndMailProvider extends Procedure { + + static CreateEndToEndMailProvider create(Plugin plugin) { + return new CreateEndToEndMailProvider(procedureName: 'CreateEndToEndMailProvider', plugin: plugin, credentials: [ + + 'mailStoreUser': null, + + 'mailTransportUser': null, + + ]) + } + + + CreateEndToEndMailProvider flush() { + this.flushParams() + return this + } + + //Generated + + CreateEndToEndMailProvider category(String category) { + this.addParam('category', category) + return this + } + + + CreateEndToEndMailProvider className(String className) { + this.addParam('className', className) + return this + } + + + CreateEndToEndMailProvider classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + CreateEndToEndMailProvider configName(String configName) { + this.addParam('configName', configName) + return this + } + + + CreateEndToEndMailProvider custPropName(String custPropName) { + this.addParam('custPropName', custPropName) + return this + } + + + CreateEndToEndMailProvider custPropValue(String custPropValue) { + this.addParam('custPropValue', custPropValue) + return this + } + + + CreateEndToEndMailProvider debug(String debug) { + this.addParam('debug', debug) + return this + } + + + CreateEndToEndMailProvider isolatedClassLoader(String isolatedClassLoader) { + this.addParam('isolatedClassLoader', isolatedClassLoader) + return this + } + + + CreateEndToEndMailProvider mailProviderDesc(String mailProviderDesc) { + this.addParam('mailProviderDesc', mailProviderDesc) + return this + } + + + CreateEndToEndMailProvider mailProviderName(String mailProviderName) { + this.addParam('mailProviderName', mailProviderName) + return this + } + + + CreateEndToEndMailProvider mailSessionDesc(String mailSessionDesc) { + this.addParam('mailSessionDesc', mailSessionDesc) + return this + } + + + CreateEndToEndMailProvider mailSessionJNDIName(String mailSessionJNDIName) { + this.addParam('mailSessionJNDIName', mailSessionJNDIName) + return this + } + + + CreateEndToEndMailProvider mailSessionName(String mailSessionName) { + this.addParam('mailSessionName', mailSessionName) + return this + } + + + CreateEndToEndMailProvider mailStoreHost(String mailStoreHost) { + this.addParam('mailStoreHost', mailStoreHost) + return this + } + + + CreateEndToEndMailProvider mailStorePort(String mailStorePort) { + this.addParam('mailStorePort', mailStorePort) + return this + } + + + CreateEndToEndMailProvider mailTransportHost(String mailTransportHost) { + this.addParam('mailTransportHost', mailTransportHost) + return this + } + + + CreateEndToEndMailProvider mailTransportPort(String mailTransportPort) { + this.addParam('mailTransportPort', mailTransportPort) + return this + } + + + CreateEndToEndMailProvider protocolProviderName(String protocolProviderName) { + this.addParam('protocolProviderName', protocolProviderName) + return this + } + + + CreateEndToEndMailProvider protocolProviderType(String protocolProviderType) { + this.addParam('protocolProviderType', protocolProviderType) + return this + } + + CreateEndToEndMailProvider protocolProviderType(ProtocolProviderTypeOptions protocolProviderType) { + this.addParam('protocolProviderType', protocolProviderType.toString()) + return this + } + + + CreateEndToEndMailProvider scope(String scope) { + this.addParam('scope', scope) + return this + } + + + CreateEndToEndMailProvider strict(String strict) { + this.addParam('strict', strict) + return this + } + + + CreateEndToEndMailProvider wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + CreateEndToEndMailProvider mailStoreUser(String user, String password) { + this.addCredential('mailStoreUser', user, password) + return this + } + + CreateEndToEndMailProvider mailStoreUserReference(String path) { + this.addCredentialReference('mailStoreUser', path) + return this + } + + CreateEndToEndMailProvider mailTransportUser(String user, String password) { + this.addCredential('mailTransportUser', user, password) + return this + } + + CreateEndToEndMailProvider mailTransportUserReference(String path) { + this.addCredentialReference('mailTransportUser', path) + return this + } + + + enum ProtocolProviderTypeOptions { + + STORE("STORE"), + + TRANSPORT("TRANSPORT") + + private String value + ProtocolProviderTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateFirstClusterMember.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateFirstClusterMember.groovy new file mode 100644 index 00000000..c96fa475 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateFirstClusterMember.groovy @@ -0,0 +1,134 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateFirstClusterMember extends Procedure { + + static CreateFirstClusterMember create(Plugin plugin) { + return new CreateFirstClusterMember(procedureName: 'CreateFirstClusterMember', plugin: plugin, ) + } + + + CreateFirstClusterMember flush() { + this.flushParams() + return this + } + + //Generated + + CreateFirstClusterMember configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateFirstClusterMember wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberCreationPolicy(String wasFirstClusterMemberCreationPolicy) { + this.addParam('wasFirstClusterMemberCreationPolicy', wasFirstClusterMemberCreationPolicy) + return this + } + + CreateFirstClusterMember wasFirstClusterMemberCreationPolicy(WasFirstClusterMemberCreationPolicyOptions wasFirstClusterMemberCreationPolicy) { + this.addParam('wasFirstClusterMemberCreationPolicy', wasFirstClusterMemberCreationPolicy.toString()) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberGenUniquePorts(String wasFirstClusterMemberGenUniquePorts) { + this.addParam('wasFirstClusterMemberGenUniquePorts', wasFirstClusterMemberGenUniquePorts) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberName(String wasFirstClusterMemberName) { + this.addParam('wasFirstClusterMemberName', wasFirstClusterMemberName) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberNode(String wasFirstClusterMemberNode) { + this.addParam('wasFirstClusterMemberNode', wasFirstClusterMemberNode) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberTemplateName(String wasFirstClusterMemberTemplateName) { + this.addParam('wasFirstClusterMemberTemplateName', wasFirstClusterMemberTemplateName) + return this + } + + + CreateFirstClusterMember wasFirstClusterMemberWeight(String wasFirstClusterMemberWeight) { + this.addParam('wasFirstClusterMemberWeight', wasFirstClusterMemberWeight) + return this + } + + + CreateFirstClusterMember wasServerResourcesPromotionPolicy(String wasServerResourcesPromotionPolicy) { + this.addParam('wasServerResourcesPromotionPolicy', wasServerResourcesPromotionPolicy) + return this + } + + CreateFirstClusterMember wasServerResourcesPromotionPolicy(WasServerResourcesPromotionPolicyOptions wasServerResourcesPromotionPolicy) { + this.addParam('wasServerResourcesPromotionPolicy', wasServerResourcesPromotionPolicy.toString()) + return this + } + + + CreateFirstClusterMember wasSourceServerName(String wasSourceServerName) { + this.addParam('wasSourceServerName', wasSourceServerName) + return this + } + + + CreateFirstClusterMember wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + + enum WasFirstClusterMemberCreationPolicyOptions { + + USE_EXISTING_SERVER_AS_TEMPLATE("existing"), + + USING_PRE_CREATED_APPLICATION_SERVER_TEMPLATE("template") + + private String value + WasFirstClusterMemberCreationPolicyOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + + enum WasServerResourcesPromotionPolicyOptions { + + CLUSTER("cluster"), + + SERVER("server"), + + BOTH("both") + + private String value + WasServerResourcesPromotionPolicyOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJDBCProvider.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJDBCProvider.groovy new file mode 100644 index 00000000..a2902828 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJDBCProvider.groovy @@ -0,0 +1,84 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateJDBCProvider extends Procedure { + + static CreateJDBCProvider create(Plugin plugin) { + return new CreateJDBCProvider(procedureName: 'CreateJDBCProvider', plugin: plugin, ) + } + + + CreateJDBCProvider flush() { + this.flushParams() + return this + } + + //Generated + + CreateJDBCProvider cell(String cell) { + this.addParam('cell', cell) + return this + } + + + CreateJDBCProvider classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + CreateJDBCProvider cluster(String cluster) { + this.addParam('cluster', cluster) + return this + } + + + CreateJDBCProvider configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateJDBCProvider description(String description) { + this.addParam('description', description) + return this + } + + + CreateJDBCProvider implementationClassName(String implementationClassName) { + this.addParam('implementationClassName', implementationClassName) + return this + } + + + CreateJDBCProvider jdbcProvidername(String jdbcProvidername) { + this.addParam('jdbcProvidername', jdbcProvidername) + return this + } + + + CreateJDBCProvider node(String node) { + this.addParam('node', node) + return this + } + + + CreateJDBCProvider server(String server) { + this.addParam('server', server) + return this + } + + + CreateJDBCProvider wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJMSProvider.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJMSProvider.groovy new file mode 100644 index 00000000..34d42ee4 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateJMSProvider.groovy @@ -0,0 +1,102 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateJMSProvider extends Procedure { + + static CreateJMSProvider create(Plugin plugin) { + return new CreateJMSProvider(procedureName: 'CreateJMSProvider', plugin: plugin, ) + } + + + CreateJMSProvider flush() { + this.flushParams() + return this + } + + //Generated + + CreateJMSProvider classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + CreateJMSProvider configName(String configName) { + this.addParam('configName', configName) + return this + } + + + CreateJMSProvider description(String description) { + this.addParam('description', description) + return this + } + + + CreateJMSProvider extContextFactory(String extContextFactory) { + this.addParam('extContextFactory', extContextFactory) + return this + } + + + CreateJMSProvider extProviderURL(String extProviderURL) { + this.addParam('extProviderURL', extProviderURL) + return this + } + + + CreateJMSProvider isolatedClassLoader(String isolatedClassLoader) { + this.addParam('isolatedClassLoader', isolatedClassLoader) + return this + } + + + CreateJMSProvider jmsProvider(String jmsProvider) { + this.addParam('jmsProvider', jmsProvider) + return this + } + + + CreateJMSProvider nativepath(String nativepath) { + this.addParam('nativepath', nativepath) + return this + } + + + CreateJMSProvider propertySet(String propertySet) { + this.addParam('propertySet', propertySet) + return this + } + + + CreateJMSProvider providerType(String providerType) { + this.addParam('providerType', providerType) + return this + } + + + CreateJMSProvider scope(String scope) { + this.addParam('scope', scope) + return this + } + + + CreateJMSProvider supportsASF(String supportsASF) { + this.addParam('supportsASF', supportsASF) + return this + } + + + CreateJMSProvider wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateMailSession.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateMailSession.groovy new file mode 100644 index 00000000..9cd256cc --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateMailSession.groovy @@ -0,0 +1,192 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateMailSession extends Procedure { + + static CreateMailSession create(Plugin plugin) { + return new CreateMailSession(procedureName: 'CreateMailSession', plugin: plugin, credentials: [ + + 'mailStoreUser': null, + + 'mailTransportUser': null, + + ]) + } + + + CreateMailSession flush() { + this.flushParams() + return this + } + + //Generated + + CreateMailSession category(String category) { + this.addParam('category', category) + return this + } + + + CreateMailSession configName(String configName) { + this.addParam('configName', configName) + return this + } + + + CreateMailSession debug(String debug) { + this.addParam('debug', debug) + return this + } + + + CreateMailSession mailFrom(String mailFrom) { + this.addParam('mailFrom', mailFrom) + return this + } + + + CreateMailSession mailSessionDesc(String mailSessionDesc) { + this.addParam('mailSessionDesc', mailSessionDesc) + return this + } + + + CreateMailSession mailSessionJNDIName(String mailSessionJNDIName) { + this.addParam('mailSessionJNDIName', mailSessionJNDIName) + return this + } + + + CreateMailSession mailSessionName(String mailSessionName) { + this.addParam('mailSessionName', mailSessionName) + return this + } + + + CreateMailSession mailStoreHost(String mailStoreHost) { + this.addParam('mailStoreHost', mailStoreHost) + return this + } + + + CreateMailSession mailStorePort(String mailStorePort) { + this.addParam('mailStorePort', mailStorePort) + return this + } + + + CreateMailSession mailStoreProtocol(String mailStoreProtocol) { + this.addParam('mailStoreProtocol', mailStoreProtocol) + return this + } + + CreateMailSession mailStoreProtocol(MailStoreProtocolOptions mailStoreProtocol) { + this.addParam('mailStoreProtocol', mailStoreProtocol.toString()) + return this + } + + + CreateMailSession mailTransportHost(String mailTransportHost) { + this.addParam('mailTransportHost', mailTransportHost) + return this + } + + + CreateMailSession mailTransportPort(String mailTransportPort) { + this.addParam('mailTransportPort', mailTransportPort) + return this + } + + + CreateMailSession mailTransportProtocol(String mailTransportProtocol) { + this.addParam('mailTransportProtocol', mailTransportProtocol) + return this + } + + CreateMailSession mailTransportProtocol(MailTransportProtocolOptions mailTransportProtocol) { + this.addParam('mailTransportProtocol', mailTransportProtocol.toString()) + return this + } + + + CreateMailSession scope(String scope) { + this.addParam('scope', scope) + return this + } + + + CreateMailSession strict(String strict) { + this.addParam('strict', strict) + return this + } + + + CreateMailSession wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + CreateMailSession mailStoreUser(String user, String password) { + this.addCredential('mailStoreUser', user, password) + return this + } + + CreateMailSession mailStoreUserReference(String path) { + this.addCredentialReference('mailStoreUser', path) + return this + } + + CreateMailSession mailTransportUser(String user, String password) { + this.addCredential('mailTransportUser', user, password) + return this + } + + CreateMailSession mailTransportUserReference(String path) { + this.addCredentialReference('mailTransportUser', path) + return this + } + + + enum MailStoreProtocolOptions { + + IMAP("imap(?!s)"), + + IMAP_SSL("imaps"), + + POP3("pop3(?!s)"), + + POP3_SSL("pop3s") + + private String value + MailStoreProtocolOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + + enum MailTransportProtocolOptions { + + SMTP("smtp(?!s)"), + + SMTP_SSL("smtps") + + private String value + MailTransportProtocolOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSQueue.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSQueue.groovy new file mode 100644 index 00000000..567a8740 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSQueue.groovy @@ -0,0 +1,99 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateJMSQueue extends Procedure { + + static CreateOrUpdateJMSQueue create(Plugin plugin) { + return new CreateOrUpdateJMSQueue(procedureName: 'CreateOrUpdateJMSQueue', plugin: plugin, ) + } + + + CreateOrUpdateJMSQueue flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateJMSQueue additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateJMSQueue configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateJMSQueue jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + CreateOrUpdateJMSQueue messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + CreateOrUpdateJMSQueue messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + CreateOrUpdateJMSQueue queueAdministrativeDescription(String queueAdministrativeDescription) { + this.addParam('queueAdministrativeDescription', queueAdministrativeDescription) + return this + } + + + CreateOrUpdateJMSQueue queueAdministrativeName(String queueAdministrativeName) { + this.addParam('queueAdministrativeName', queueAdministrativeName) + return this + } + + + CreateOrUpdateJMSQueue queueManagerName(String queueManagerName) { + this.addParam('queueManagerName', queueManagerName) + return this + } + + + CreateOrUpdateJMSQueue queueName(String queueName) { + this.addParam('queueName', queueName) + return this + } + + + CreateOrUpdateJMSQueue queueScope(String queueScope) { + this.addParam('queueScope', queueScope) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSTopic.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSTopic.groovy new file mode 100644 index 00000000..c6972a6f --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateJMSTopic.groovy @@ -0,0 +1,93 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateJMSTopic extends Procedure { + + static CreateOrUpdateJMSTopic create(Plugin plugin) { + return new CreateOrUpdateJMSTopic(procedureName: 'CreateOrUpdateJMSTopic', plugin: plugin, ) + } + + + CreateOrUpdateJMSTopic flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateJMSTopic additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateJMSTopic configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateJMSTopic jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + CreateOrUpdateJMSTopic messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + CreateOrUpdateJMSTopic messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + CreateOrUpdateJMSTopic topicAdministrativeDescription(String topicAdministrativeDescription) { + this.addParam('topicAdministrativeDescription', topicAdministrativeDescription) + return this + } + + + CreateOrUpdateJMSTopic topicAdministrativeName(String topicAdministrativeName) { + this.addParam('topicAdministrativeName', topicAdministrativeName) + return this + } + + + CreateOrUpdateJMSTopic topicName(String topicName) { + this.addParam('topicName', topicName) + return this + } + + + CreateOrUpdateJMSTopic topicScope(String topicScope) { + this.addParam('topicScope', topicScope) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSActivationSpec.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSActivationSpec.groovy new file mode 100644 index 00000000..5741aef9 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSActivationSpec.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateSIBJMSActivationSpec extends Procedure { + + static CreateOrUpdateSIBJMSActivationSpec create(Plugin plugin) { + return new CreateOrUpdateSIBJMSActivationSpec(procedureName: 'CreateOrUpdateSIBJMSActivationSpec', plugin: plugin, ) + } + + + CreateOrUpdateSIBJMSActivationSpec flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateSIBJMSActivationSpec additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec destinationJndiName(String destinationJndiName) { + this.addParam('destinationJndiName', destinationJndiName) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec destinationType(String destinationType) { + this.addParam('destinationType', destinationType) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec messageSelector(String messageSelector) { + this.addParam('messageSelector', messageSelector) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec specAdministrativeDescription(String specAdministrativeDescription) { + this.addParam('specAdministrativeDescription', specAdministrativeDescription) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec specAdministrativeName(String specAdministrativeName) { + this.addParam('specAdministrativeName', specAdministrativeName) + return this + } + + + CreateOrUpdateSIBJMSActivationSpec specScope(String specScope) { + this.addParam('specScope', specScope) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSConnectionFactory.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSConnectionFactory.groovy new file mode 100644 index 00000000..0080d9ce --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateSIBJMSConnectionFactory.groovy @@ -0,0 +1,72 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateSIBJMSConnectionFactory extends Procedure { + + static CreateOrUpdateSIBJMSConnectionFactory create(Plugin plugin) { + return new CreateOrUpdateSIBJMSConnectionFactory(procedureName: 'CreateOrUpdateSIBJMSConnectionFactory', plugin: plugin, ) + } + + + CreateOrUpdateSIBJMSConnectionFactory flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateSIBJMSConnectionFactory additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory busName(String busName) { + this.addParam('busName', busName) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory factoryAdministrativeDescription(String factoryAdministrativeDescription) { + this.addParam('factoryAdministrativeDescription', factoryAdministrativeDescription) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory factoryAdministrativeName(String factoryAdministrativeName) { + this.addParam('factoryAdministrativeName', factoryAdministrativeName) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory factoryScope(String factoryScope) { + this.addParam('factoryScope', factoryScope) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory factoryType(String factoryType) { + this.addParam('factoryType', factoryType) + return this + } + + + CreateOrUpdateSIBJMSConnectionFactory jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSActivationSpec.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSActivationSpec.groovy new file mode 100644 index 00000000..31885348 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSActivationSpec.groovy @@ -0,0 +1,84 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateWMQJMSActivationSpec extends Procedure { + + static CreateOrUpdateWMQJMSActivationSpec create(Plugin plugin) { + return new CreateOrUpdateWMQJMSActivationSpec(procedureName: 'CreateOrUpdateWMQJMSActivationSpec', plugin: plugin, ) + } + + + CreateOrUpdateWMQJMSActivationSpec flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateWMQJMSActivationSpec additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec clientChannelDefinitionQueueManager(String clientChannelDefinitionQueueManager) { + this.addParam('clientChannelDefinitionQueueManager', clientChannelDefinitionQueueManager) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec clientChannelDefinitionUrl(String clientChannelDefinitionUrl) { + this.addParam('clientChannelDefinitionUrl', clientChannelDefinitionUrl) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec destinationJndiName(String destinationJndiName) { + this.addParam('destinationJndiName', destinationJndiName) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec destinationJndiType(String destinationJndiType) { + this.addParam('destinationJndiType', destinationJndiType) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec specAdministrativeDescription(String specAdministrativeDescription) { + this.addParam('specAdministrativeDescription', specAdministrativeDescription) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec specAdministrativeName(String specAdministrativeName) { + this.addParam('specAdministrativeName', specAdministrativeName) + return this + } + + + CreateOrUpdateWMQJMSActivationSpec specScope(String specScope) { + this.addParam('specScope', specScope) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSConnectionFactory.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSConnectionFactory.groovy new file mode 100644 index 00000000..591425e7 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/CreateOrUpdateWMQJMSConnectionFactory.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class CreateOrUpdateWMQJMSConnectionFactory extends Procedure { + + static CreateOrUpdateWMQJMSConnectionFactory create(Plugin plugin) { + return new CreateOrUpdateWMQJMSConnectionFactory(procedureName: 'CreateOrUpdateWMQJMSConnectionFactory', plugin: plugin, ) + } + + + CreateOrUpdateWMQJMSConnectionFactory flush() { + this.flushParams() + return this + } + + //Generated + + CreateOrUpdateWMQJMSConnectionFactory additionalOptions(String additionalOptions) { + this.addParam('additionalOptions', additionalOptions) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory clientChannelDefinitionQueueManager(String clientChannelDefinitionQueueManager) { + this.addParam('clientChannelDefinitionQueueManager', clientChannelDefinitionQueueManager) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory clientChannelDefinitionUrl(String clientChannelDefinitionUrl) { + this.addParam('clientChannelDefinitionUrl', clientChannelDefinitionUrl) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory configname(String configname) { + this.addParam('configname', configname) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory factoryAdministrativeDescription(String factoryAdministrativeDescription) { + this.addParam('factoryAdministrativeDescription', factoryAdministrativeDescription) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory factoryAdministrativeName(String factoryAdministrativeName) { + this.addParam('factoryAdministrativeName', factoryAdministrativeName) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory factoryScope(String factoryScope) { + this.addParam('factoryScope', factoryScope) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory factoryType(String factoryType) { + this.addParam('factoryType', factoryType) + return this + } + + + CreateOrUpdateWMQJMSConnectionFactory jndiName(String jndiName) { + this.addParam('jndiName', jndiName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServer.groovy new file mode 100644 index 00000000..1f96d126 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServer.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteApplicationServer extends Procedure { + + static DeleteApplicationServer create(Plugin plugin) { + return new DeleteApplicationServer(procedureName: 'DeleteApplicationServer', plugin: plugin, ) + } + + + DeleteApplicationServer flush() { + this.flushParams() + return this + } + + //Generated + + DeleteApplicationServer configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteApplicationServer wasAppServerName(String wasAppServerName) { + this.addParam('wasAppServerName', wasAppServerName) + return this + } + + + DeleteApplicationServer wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + DeleteApplicationServer wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServerTemplate.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServerTemplate.groovy new file mode 100644 index 00000000..123bcc01 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteApplicationServerTemplate.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteApplicationServerTemplate extends Procedure { + + static DeleteApplicationServerTemplate create(Plugin plugin) { + return new DeleteApplicationServerTemplate(procedureName: 'DeleteApplicationServerTemplate', plugin: plugin, ) + } + + + DeleteApplicationServerTemplate flush() { + this.flushParams() + return this + } + + //Generated + + DeleteApplicationServerTemplate configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteApplicationServerTemplate wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + DeleteApplicationServerTemplate wasTemplateName(String wasTemplateName) { + this.addParam('wasTemplateName', wasTemplateName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteCluster.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteCluster.groovy new file mode 100644 index 00000000..5c74cef2 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteCluster.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteCluster extends Procedure { + + static DeleteCluster create(Plugin plugin) { + return new DeleteCluster(procedureName: 'DeleteCluster', plugin: plugin, ) + } + + + DeleteCluster flush() { + this.flushParams() + return this + } + + //Generated + + DeleteCluster configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteCluster wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + DeleteCluster wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteDatasource.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteDatasource.groovy new file mode 100644 index 00000000..d43143ce --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteDatasource.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteDatasource extends Procedure { + + static DeleteDatasource create(Plugin plugin) { + return new DeleteDatasource(procedureName: 'DeleteDatasource', plugin: plugin, ) + } + + + DeleteDatasource flush() { + this.flushParams() + return this + } + + //Generated + + DeleteDatasource configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteDatasource datasourceName(String datasourceName) { + this.addParam('datasourceName', datasourceName) + return this + } + + + DeleteDatasource wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJDBCProvider.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJDBCProvider.groovy new file mode 100644 index 00000000..1eb3dc33 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJDBCProvider.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJDBCProvider extends Procedure { + + static DeleteJDBCProvider create(Plugin plugin) { + return new DeleteJDBCProvider(procedureName: 'DeleteJDBCProvider', plugin: plugin, ) + } + + + DeleteJDBCProvider flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJDBCProvider configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJDBCProvider jdbcProvidername(String jdbcProvidername) { + this.addParam('jdbcProvidername', jdbcProvidername) + return this + } + + + DeleteJDBCProvider wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSActivationSpec.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSActivationSpec.groovy new file mode 100644 index 00000000..756f32e6 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSActivationSpec.groovy @@ -0,0 +1,69 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJMSActivationSpec extends Procedure { + + static DeleteJMSActivationSpec create(Plugin plugin) { + return new DeleteJMSActivationSpec(procedureName: 'DeleteJMSActivationSpec', plugin: plugin, ) + } + + + DeleteJMSActivationSpec flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJMSActivationSpec activationSpecAdministrativeName(String activationSpecAdministrativeName) { + this.addParam('activationSpecAdministrativeName', activationSpecAdministrativeName) + return this + } + + + DeleteJMSActivationSpec activationSpecScope(String activationSpecScope) { + this.addParam('activationSpecScope', activationSpecScope) + return this + } + + + DeleteJMSActivationSpec configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJMSActivationSpec messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + DeleteJMSActivationSpec messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSConnectionFactory.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSConnectionFactory.groovy new file mode 100644 index 00000000..0009c566 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSConnectionFactory.groovy @@ -0,0 +1,69 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJMSConnectionFactory extends Procedure { + + static DeleteJMSConnectionFactory create(Plugin plugin) { + return new DeleteJMSConnectionFactory(procedureName: 'DeleteJMSConnectionFactory', plugin: plugin, ) + } + + + DeleteJMSConnectionFactory flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJMSConnectionFactory configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJMSConnectionFactory factoryAdministrativeName(String factoryAdministrativeName) { + this.addParam('factoryAdministrativeName', factoryAdministrativeName) + return this + } + + + DeleteJMSConnectionFactory factoryScope(String factoryScope) { + this.addParam('factoryScope', factoryScope) + return this + } + + + DeleteJMSConnectionFactory messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + DeleteJMSConnectionFactory messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSProvider.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSProvider.groovy new file mode 100644 index 00000000..f6dc12f2 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSProvider.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJMSProvider extends Procedure { + + static DeleteJMSProvider create(Plugin plugin) { + return new DeleteJMSProvider(procedureName: 'DeleteJMSProvider', plugin: plugin, ) + } + + + DeleteJMSProvider flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJMSProvider configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJMSProvider providerName(String providerName) { + this.addParam('providerName', providerName) + return this + } + + + DeleteJMSProvider providerScope(String providerScope) { + this.addParam('providerScope', providerScope) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSQueue.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSQueue.groovy new file mode 100644 index 00000000..20749604 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSQueue.groovy @@ -0,0 +1,69 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJMSQueue extends Procedure { + + static DeleteJMSQueue create(Plugin plugin) { + return new DeleteJMSQueue(procedureName: 'DeleteJMSQueue', plugin: plugin, ) + } + + + DeleteJMSQueue flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJMSQueue configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJMSQueue messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + DeleteJMSQueue messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + DeleteJMSQueue queueAdministrativeName(String queueAdministrativeName) { + this.addParam('queueAdministrativeName', queueAdministrativeName) + return this + } + + + DeleteJMSQueue queueScope(String queueScope) { + this.addParam('queueScope', queueScope) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSTopic.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSTopic.groovy new file mode 100644 index 00000000..101bd3fd --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeleteJMSTopic.groovy @@ -0,0 +1,69 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeleteJMSTopic extends Procedure { + + static DeleteJMSTopic create(Plugin plugin) { + return new DeleteJMSTopic(procedureName: 'DeleteJMSTopic', plugin: plugin, ) + } + + + DeleteJMSTopic flush() { + this.flushParams() + return this + } + + //Generated + + DeleteJMSTopic configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeleteJMSTopic messagingSystemType(String messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType) + return this + } + + DeleteJMSTopic messagingSystemType(MessagingSystemTypeOptions messagingSystemType) { + this.addParam('messagingSystemType', messagingSystemType.toString()) + return this + } + + + DeleteJMSTopic topicAdministrativeName(String topicAdministrativeName) { + this.addParam('topicAdministrativeName', topicAdministrativeName) + return this + } + + + DeleteJMSTopic topicScope(String topicScope) { + this.addParam('topicScope', topicScope) + return this + } + + + + + enum MessagingSystemTypeOptions { + + WMQ("WMQ"), + + SIB("SIB") + + private String value + MessagingSystemTypeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployApp.groovy new file mode 100644 index 00000000..75dc0aa9 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployApp.groovy @@ -0,0 +1,72 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeployApp extends Procedure { + + static DeployApp create(Plugin plugin) { + return new DeployApp(procedureName: 'DeployApp', plugin: plugin, ) + } + + + DeployApp flush() { + this.flushParams() + return this + } + + //Generated + + DeployApp additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + DeployApp appname(String appname) { + this.addParam('appname', appname) + return this + } + + + DeployApp apppath(String apppath) { + this.addParam('apppath', apppath) + return this + } + + + DeployApp classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + DeployApp commands(String commands) { + this.addParam('commands', commands) + return this + } + + + DeployApp configname(String configname) { + this.addParam('configname', configname) + return this + } + + + DeployApp javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + DeployApp wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployEnterpriseApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployEnterpriseApp.groovy new file mode 100644 index 00000000..aa430a42 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployEnterpriseApp.groovy @@ -0,0 +1,291 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeployEnterpriseApp extends Procedure { + + static DeployEnterpriseApp create(Plugin plugin) { + return new DeployEnterpriseApp(procedureName: 'DeployEnterpriseApp', plugin: plugin, ) + } + + + DeployEnterpriseApp flush() { + this.flushParams() + return this + } + + //Generated + + DeployEnterpriseApp additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + DeployEnterpriseApp additionalDeployParams(String additionalDeployParams) { + this.addParam('additionalDeployParams', additionalDeployParams) + return this + } + + + DeployEnterpriseApp appName(String appName) { + this.addParam('appName', appName) + return this + } + + + DeployEnterpriseApp apppath(String apppath) { + this.addParam('apppath', apppath) + return this + } + + + DeployEnterpriseApp autoResolveEJBRef(boolean autoResolveEJBRef) { + this.addParam('autoResolveEJBRef', autoResolveEJBRef) + return this + } + + + DeployEnterpriseApp binaryConfig(boolean binaryConfig) { + this.addParam('binaryConfig', binaryConfig) + return this + } + + + DeployEnterpriseApp blaName(String blaName) { + this.addParam('blaName', blaName) + return this + } + + + DeployEnterpriseApp classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + DeployEnterpriseApp clientDeployMode(String clientDeployMode) { + this.addParam('clientDeployMode', clientDeployMode) + return this + } + + DeployEnterpriseApp clientDeployMode(ClientDeployModeOptions clientDeployMode) { + this.addParam('clientDeployMode', clientDeployMode.toString()) + return this + } + + + DeployEnterpriseApp cluster(String cluster) { + this.addParam('cluster', cluster) + return this + } + + + DeployEnterpriseApp commands(String commands) { + this.addParam('commands', commands) + return this + } + + + DeployEnterpriseApp configName(String configName) { + this.addParam('configName', configName) + return this + } + + + DeployEnterpriseApp contextRoot(String contextRoot) { + this.addParam('contextRoot', contextRoot) + return this + } + + + DeployEnterpriseApp createMBeans(boolean createMBeans) { + this.addParam('createMBeans', createMBeans) + return this + } + + + DeployEnterpriseApp customFilePermissions(String customFilePermissions) { + this.addParam('customFilePermissions', customFilePermissions) + return this + } + + + DeployEnterpriseApp deployBeans(boolean deployBeans) { + this.addParam('deployBeans', deployBeans) + return this + } + + + DeployEnterpriseApp deployClientMod(boolean deployClientMod) { + this.addParam('deployClientMod', deployClientMod) + return this + } + + + DeployEnterpriseApp deployWS(boolean deployWS) { + this.addParam('deployWS', deployWS) + return this + } + + + DeployEnterpriseApp distributeApp(boolean distributeApp) { + this.addParam('distributeApp', distributeApp) + return this + } + + + DeployEnterpriseApp filePermissions(String filePermissions) { + this.addParam('filePermissions', filePermissions) + return this + } + + DeployEnterpriseApp filePermissions(FilePermissionsOptions filePermissions) { + this.addParam('filePermissions', filePermissions.toString()) + return this + } + + + DeployEnterpriseApp installDir(String installDir) { + this.addParam('installDir', installDir) + return this + } + + + DeployEnterpriseApp javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + DeployEnterpriseApp mapModulesToServers(String mapModulesToServers) { + this.addParam('MapModulesToServers', mapModulesToServers) + return this + } + + + DeployEnterpriseApp overrideClassReloading(boolean overrideClassReloading) { + this.addParam('overrideClassReloading', overrideClassReloading) + return this + } + + + DeployEnterpriseApp precompileJSP(boolean precompileJSP) { + this.addParam('precompileJSP', precompileJSP) + return this + } + + + DeployEnterpriseApp processEmbConfig(boolean processEmbConfig) { + this.addParam('processEmbConfig', processEmbConfig) + return this + } + + + DeployEnterpriseApp reloadInterval(String reloadInterval) { + this.addParam('reloadInterval', reloadInterval) + return this + } + + + DeployEnterpriseApp serverList(String serverList) { + this.addParam('serverList', serverList) + return this + } + + + DeployEnterpriseApp startApp(boolean startApp) { + this.addParam('startApp', startApp) + return this + } + + + DeployEnterpriseApp syncActiveNodes(boolean syncActiveNodes) { + this.addParam('syncActiveNodes', syncActiveNodes) + return this + } + + + DeployEnterpriseApp validateRefs(String validateRefs) { + this.addParam('validateRefs', validateRefs) + return this + } + + DeployEnterpriseApp validateRefs(ValidateRefsOptions validateRefs) { + this.addParam('validateRefs', validateRefs.toString()) + return this + } + + + DeployEnterpriseApp validateSchema(boolean validateSchema) { + this.addParam('validateSchema', validateSchema) + return this + } + + + DeployEnterpriseApp wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + + enum ClientDeployModeOptions { + + ISOLATED("isolated"), + + FEDERATED("federated"), + + SERVER_DEPLOYED("server_deployed") + + private String value + ClientDeployModeOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + + enum FilePermissionsOptions { + + ALLOW_ALL_FILES_TO_BE_READ_BUT_NOT_WRITTEN_TO_755_(".*=755"), + + ALLOW_EXECUTABLES_TO_EXECUTE_DLL_755_SO_755_A_755_SL_755_(".*\\.dll=755#.*\\.so=755#.*\\.a=755#.*\\.sl=755"), + + ALLOW_HTML_AND_IMAGE_FILES_TO_BE_READ_BY_EVERYONE_HTM_755_HTML_755_GIF_755_JPG_755_(".*\\.htm=755#.*\\.html=755#.*\\.gif=755#.*\\.jpg=755") + + private String value + FilePermissionsOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + + enum ValidateRefsOptions { + + OFF("off"), + + WARN("warn"), + + FAIL("fail") + + private String value + ValidateRefsOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployOSGiApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployOSGiApp.groovy new file mode 100644 index 00000000..f4677da4 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DeployOSGiApp.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DeployOSGiApp extends Procedure { + + static DeployOSGiApp create(Plugin plugin) { + return new DeployOSGiApp(procedureName: 'DeployOSGiApp', plugin: plugin, ) + } + + + DeployOSGiApp flush() { + this.flushParams() + return this + } + + //Generated + + DeployOSGiApp addExternalRepo(String addExternalRepo) { + this.addParam('addExternalRepo', addExternalRepo) + return this + } + + + DeployOSGiApp appName(String appName) { + this.addParam('appName', appName) + return this + } + + + DeployOSGiApp configName(String configName) { + this.addParam('configName', configName) + return this + } + + + DeployOSGiApp deployUnit(String deployUnit) { + this.addParam('deployUnit', deployUnit) + return this + } + + + DeployOSGiApp ebaPath(String ebaPath) { + this.addParam('ebaPath', ebaPath) + return this + } + + + DeployOSGiApp externalRepoName(String externalRepoName) { + this.addParam('externalRepoName', externalRepoName) + return this + } + + + DeployOSGiApp externalRepoURL(String externalRepoURL) { + this.addParam('externalRepoURL', externalRepoURL) + return this + } + + + DeployOSGiApp localRepoBundleList(String localRepoBundleList) { + this.addParam('localRepoBundleList', localRepoBundleList) + return this + } + + + DeployOSGiApp wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/Discover.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/Discover.groovy new file mode 100644 index 00000000..e9a8ca96 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/Discover.groovy @@ -0,0 +1,36 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class Discover extends Procedure { + + static Discover create(Plugin plugin) { + return new Discover(procedureName: 'Discover', plugin: plugin, ) + } + + + Discover flush() { + this.flushParams() + return this + } + + //Generated + + Discover configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + Discover resourceNames(String resourceNames) { + this.addParam('resourceNames', resourceNames) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DiscoverResource.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DiscoverResource.groovy new file mode 100644 index 00000000..a38be298 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/DiscoverResource.groovy @@ -0,0 +1,30 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class DiscoverResource extends Procedure { + + static DiscoverResource create(Plugin plugin) { + return new DiscoverResource(procedureName: 'DiscoverResource', plugin: plugin, ) + } + + + DiscoverResource flush() { + this.flushParams() + return this + } + + //Generated + + DiscoverResource configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/EditConfiguration.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/EditConfiguration.groovy new file mode 100644 index 00000000..98bbd56c --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/EditConfiguration.groovy @@ -0,0 +1,92 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class EditConfiguration extends Procedure { + + static EditConfiguration create(Plugin plugin) { + return new EditConfiguration(procedureName: 'EditConfiguration', plugin: plugin, credentials: [ + + 'credential': null, + + ]) + } + + + EditConfiguration flush() { + this.flushParams() + return this + } + + //Generated + + EditConfiguration config(String config) { + this.addParam('config', config) + return this + } + + + EditConfiguration conntype(String conntype) { + this.addParam('conntype', conntype) + return this + } + + + EditConfiguration debug(boolean debug) { + this.addParam('debug', debug) + return this + } + + + EditConfiguration debug(String debug) { + this.addParam('debug', debug) + return this + } + + + EditConfiguration testconnection(boolean testconnection) { + this.addParam('test_connection', testconnection) + return this + } + + + EditConfiguration testconnectionres(String testconnectionres) { + this.addParam('test_connection_res', testconnectionres) + return this + } + + + EditConfiguration websphereport(String websphereport) { + this.addParam('websphere_port', websphereport) + return this + } + + + EditConfiguration websphereurl(String websphereurl) { + this.addParam('websphere_url', websphereurl) + return this + } + + + EditConfiguration wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + EditConfiguration credential(String user, String password) { + this.addCredential('credential', user, password) + return this + } + + EditConfiguration credentialReference(String path) { + this.addCredentialReference('credential', path) + return this + } + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ExportApplicationServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ExportApplicationServer.groovy new file mode 100644 index 00000000..bff609dd --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ExportApplicationServer.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ExportApplicationServer extends Procedure { + + static ExportApplicationServer create(Plugin plugin) { + return new ExportApplicationServer(procedureName: 'ExportApplicationServer', plugin: plugin, ) + } + + + ExportApplicationServer flush() { + this.flushParams() + return this + } + + //Generated + + ExportApplicationServer configname(String configname) { + this.addParam('configname', configname) + return this + } + + + ExportApplicationServer wasAppServerName(String wasAppServerName) { + this.addParam('wasAppServerName', wasAppServerName) + return this + } + + + ExportApplicationServer wasArchivePath(String wasArchivePath) { + this.addParam('wasArchivePath', wasArchivePath) + return this + } + + + ExportApplicationServer wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ImportApplicationServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ImportApplicationServer.groovy new file mode 100644 index 00000000..e27c7a23 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ImportApplicationServer.groovy @@ -0,0 +1,72 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ImportApplicationServer extends Procedure { + + static ImportApplicationServer create(Plugin plugin) { + return new ImportApplicationServer(procedureName: 'ImportApplicationServer', plugin: plugin, ) + } + + + ImportApplicationServer flush() { + this.flushParams() + return this + } + + //Generated + + ImportApplicationServer configname(String configname) { + this.addParam('configname', configname) + return this + } + + + ImportApplicationServer wasAppServerName(String wasAppServerName) { + this.addParam('wasAppServerName', wasAppServerName) + return this + } + + + ImportApplicationServer wasAppServerNameInArchive(String wasAppServerNameInArchive) { + this.addParam('wasAppServerNameInArchive', wasAppServerNameInArchive) + return this + } + + + ImportApplicationServer wasArchivePath(String wasArchivePath) { + this.addParam('wasArchivePath', wasArchivePath) + return this + } + + + ImportApplicationServer wasCoreGroup(String wasCoreGroup) { + this.addParam('wasCoreGroup', wasCoreGroup) + return this + } + + + ImportApplicationServer wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + ImportApplicationServer wasNodeNameInArchive(String wasNodeNameInArchive) { + this.addParam('wasNodeNameInArchive', wasNodeNameInArchive) + return this + } + + + ImportApplicationServer wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ListClusterMembers.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ListClusterMembers.groovy new file mode 100644 index 00000000..debb416a --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ListClusterMembers.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ListClusterMembers extends Procedure { + + static ListClusterMembers create(Plugin plugin) { + return new ListClusterMembers(procedureName: 'ListClusterMembers', plugin: plugin, ) + } + + + ListClusterMembers flush() { + this.flushParams() + return this + } + + //Generated + + ListClusterMembers configName(String configName) { + this.addParam('configName', configName) + return this + } + + + ListClusterMembers wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + ListClusterMembers wasOutputPropertyPath(String wasOutputPropertyPath) { + this.addParam('wasOutputPropertyPath', wasOutputPropertyPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/MapSharedLibrary.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/MapSharedLibrary.groovy new file mode 100644 index 00000000..b944b778 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/MapSharedLibrary.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class MapSharedLibrary extends Procedure { + + static MapSharedLibrary create(Plugin plugin) { + return new MapSharedLibrary(procedureName: 'MapSharedLibrary', plugin: plugin, ) + } + + + MapSharedLibrary flush() { + this.flushParams() + return this + } + + //Generated + + MapSharedLibrary applicationName(String applicationName) { + this.addParam('applicationName', applicationName) + return this + } + + + MapSharedLibrary configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + MapSharedLibrary libraryName(String libraryName) { + this.addParam('libraryName', libraryName) + return this + } + + + MapSharedLibrary wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ModifyApplicationClassLoader.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ModifyApplicationClassLoader.groovy new file mode 100644 index 00000000..aa2417e7 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/ModifyApplicationClassLoader.groovy @@ -0,0 +1,96 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class ModifyApplicationClassLoader extends Procedure { + + static ModifyApplicationClassLoader create(Plugin plugin) { + return new ModifyApplicationClassLoader(procedureName: 'ModifyApplicationClassLoader', plugin: plugin, ) + } + + + ModifyApplicationClassLoader flush() { + this.flushParams() + return this + } + + //Generated + + ModifyApplicationClassLoader applicationName(String applicationName) { + this.addParam('applicationName', applicationName) + return this + } + + + ModifyApplicationClassLoader classLoaderPolicy(String classLoaderPolicy) { + this.addParam('classLoaderPolicy', classLoaderPolicy) + return this + } + + ModifyApplicationClassLoader classLoaderPolicy(ClassLoaderPolicyOptions classLoaderPolicy) { + this.addParam('classLoaderPolicy', classLoaderPolicy.toString()) + return this + } + + + ModifyApplicationClassLoader configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + ModifyApplicationClassLoader loadOrder(String loadOrder) { + this.addParam('loadOrder', loadOrder) + return this + } + + ModifyApplicationClassLoader loadOrder(LoadOrderOptions loadOrder) { + this.addParam('loadOrder', loadOrder.toString()) + return this + } + + + ModifyApplicationClassLoader wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + + enum ClassLoaderPolicyOptions { + + MULTIPLE("MULTIPLE"), + + SINGLE("SINGLE") + + private String value + ClassLoaderPolicyOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + + enum LoadOrderOptions { + + PARENT_FIRST("PARENT_FIRST"), + + PARENT_LAST("PARENT_LAST") + + private String value + LoadOrderOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/PublishWSDL.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/PublishWSDL.groovy new file mode 100644 index 00000000..081b8e53 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/PublishWSDL.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class PublishWSDL extends Procedure { + + static PublishWSDL create(Plugin plugin) { + return new PublishWSDL(procedureName: 'PublishWSDL', plugin: plugin, ) + } + + + PublishWSDL flush() { + this.flushParams() + return this + } + + //Generated + + PublishWSDL additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + PublishWSDL appname(String appname) { + this.addParam('appname', appname) + return this + } + + + PublishWSDL classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + PublishWSDL commands(String commands) { + this.addParam('commands', commands) + return this + } + + + PublishWSDL configname(String configname) { + this.addParam('configname', configname) + return this + } + + + PublishWSDL javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + PublishWSDL publishlocation(String publishlocation) { + this.addParam('publish_location', publishlocation) + return this + } + + + PublishWSDL soapprefix(String soapprefix) { + this.addParam('soap_prefix', soapprefix) + return this + } + + + PublishWSDL wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RemoveClusterMembers.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RemoveClusterMembers.groovy new file mode 100644 index 00000000..00ec9283 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RemoveClusterMembers.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class RemoveClusterMembers extends Procedure { + + static RemoveClusterMembers create(Plugin plugin) { + return new RemoveClusterMembers(procedureName: 'RemoveClusterMembers', plugin: plugin, ) + } + + + RemoveClusterMembers flush() { + this.flushParams() + return this + } + + //Generated + + RemoveClusterMembers configName(String configName) { + this.addParam('configName', configName) + return this + } + + + RemoveClusterMembers wasClusterMembers(String wasClusterMembers) { + this.addParam('wasClusterMembers', wasClusterMembers) + return this + } + + + RemoveClusterMembers wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + RemoveClusterMembers wasSyncNodes(String wasSyncNodes) { + this.addParam('wasSyncNodes', wasSyncNodes) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RunCustomJob.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RunCustomJob.groovy new file mode 100644 index 00000000..7e39955e --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/RunCustomJob.groovy @@ -0,0 +1,99 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class RunCustomJob extends Procedure { + + static RunCustomJob create(Plugin plugin) { + return new RunCustomJob(procedureName: 'RunCustomJob', plugin: plugin, ) + } + + + RunCustomJob flush() { + this.flushParams() + return this + } + + //Generated + + RunCustomJob additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + RunCustomJob classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + RunCustomJob commands(String commands) { + this.addParam('commands', commands) + return this + } + + + RunCustomJob configname(String configname) { + this.addParam('configname', configname) + return this + } + + + RunCustomJob javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + RunCustomJob scriptfile(String scriptfile) { + this.addParam('scriptfile', scriptfile) + return this + } + + + RunCustomJob scriptfileabspath(String scriptfileabspath) { + this.addParam('scriptfileabspath', scriptfileabspath) + return this + } + + + RunCustomJob scriptfilesource(String scriptfilesource) { + this.addParam('scriptfilesource', scriptfilesource) + return this + } + + RunCustomJob scriptfilesource(ScriptfilesourceOptions scriptfilesource) { + this.addParam('scriptfilesource', scriptfilesource.toString()) + return this + } + + + RunCustomJob wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + + enum ScriptfilesourceOptions { + + SUPPLIED_FILE("suppliedfile"), + + NEW_SCRIPT_FILE("newscriptfile") + + private String value + ScriptfilesourceOptions(String value) { + this.value = value + } + + String toString() { + return this.value + } +} + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApp.groovy new file mode 100644 index 00000000..33987907 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApp.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartApp extends Procedure { + + static StartApp create(Plugin plugin) { + return new StartApp(procedureName: 'StartApp', plugin: plugin, ) + } + + + StartApp flush() { + this.flushParams() + return this + } + + //Generated + + StartApp additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + StartApp appname(String appname) { + this.addParam('appname', appname) + return this + } + + + StartApp classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + StartApp clusterName(String clusterName) { + this.addParam('clusterName', clusterName) + return this + } + + + StartApp commands(String commands) { + this.addParam('commands', commands) + return this + } + + + StartApp configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StartApp javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + StartApp serverName(String serverName) { + this.addParam('serverName', serverName) + return this + } + + + StartApp wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApplicationServers.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApplicationServers.groovy new file mode 100644 index 00000000..83f0218a --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartApplicationServers.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartApplicationServers extends Procedure { + + static StartApplicationServers create(Plugin plugin) { + return new StartApplicationServers(procedureName: 'StartApplicationServers', plugin: plugin, ) + } + + + StartApplicationServers flush() { + this.flushParams() + return this + } + + //Generated + + StartApplicationServers configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StartApplicationServers wasServersList(String wasServersList) { + this.addParam('wasServersList', wasServersList) + return this + } + + + StartApplicationServers wasWaitTime(String wasWaitTime) { + this.addParam('wasWaitTime', wasWaitTime) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartCluster.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartCluster.groovy new file mode 100644 index 00000000..26193c08 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartCluster.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartCluster extends Procedure { + + static StartCluster create(Plugin plugin) { + return new StartCluster(procedureName: 'StartCluster', plugin: plugin, ) + } + + + StartCluster flush() { + this.flushParams() + return this + } + + //Generated + + StartCluster configName(String configName) { + this.addParam('configName', configName) + return this + } + + + StartCluster wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + StartCluster wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartDeploymentManager.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartDeploymentManager.groovy new file mode 100644 index 00000000..0a6f5abf --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartDeploymentManager.groovy @@ -0,0 +1,60 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartDeploymentManager extends Procedure { + + static StartDeploymentManager create(Plugin plugin) { + return new StartDeploymentManager(procedureName: 'StartDeploymentManager', plugin: plugin, ) + } + + + StartDeploymentManager flush() { + this.flushParams() + return this + } + + //Generated + + StartDeploymentManager configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StartDeploymentManager wasAdditionalParameters(String wasAdditionalParameters) { + this.addParam('wasAdditionalParameters', wasAdditionalParameters) + return this + } + + + StartDeploymentManager wasDeploymentManagerProfile(String wasDeploymentManagerProfile) { + this.addParam('wasDeploymentManagerProfile', wasDeploymentManagerProfile) + return this + } + + + StartDeploymentManager wasLogFileLocation(String wasLogFileLocation) { + this.addParam('wasLogFileLocation', wasLogFileLocation) + return this + } + + + StartDeploymentManager wasStartManagerLocation(String wasStartManagerLocation) { + this.addParam('wasStartManagerLocation', wasStartManagerLocation) + return this + } + + + StartDeploymentManager wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartNode.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartNode.groovy new file mode 100644 index 00000000..64ab40ce --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartNode.groovy @@ -0,0 +1,72 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartNode extends Procedure { + + static StartNode create(Plugin plugin) { + return new StartNode(procedureName: 'StartNode', plugin: plugin, ) + } + + + StartNode flush() { + this.flushParams() + return this + } + + //Generated + + StartNode configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StartNode wasAdditionalParameters(String wasAdditionalParameters) { + this.addParam('wasAdditionalParameters', wasAdditionalParameters) + return this + } + + + StartNode wasLogFileLocation(String wasLogFileLocation) { + this.addParam('wasLogFileLocation', wasLogFileLocation) + return this + } + + + StartNode wasNodeName(String wasNodeName) { + this.addParam('wasNodeName', wasNodeName) + return this + } + + + StartNode wasNodeProfile(String wasNodeProfile) { + this.addParam('wasNodeProfile', wasNodeProfile) + return this + } + + + StartNode wasStartNodeLocation(String wasStartNodeLocation) { + this.addParam('wasStartNodeLocation', wasStartNodeLocation) + return this + } + + + StartNode wasStartServers(String wasStartServers) { + this.addParam('wasStartServers', wasStartServers) + return this + } + + + StartNode wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartServer.groovy new file mode 100644 index 00000000..87dbcc4a --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StartServer.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StartServer extends Procedure { + + static StartServer create(Plugin plugin) { + return new StartServer(procedureName: 'StartServer', plugin: plugin, ) + } + + + StartServer flush() { + this.flushParams() + return this + } + + //Generated + + StartServer additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + StartServer instancename(String instancename) { + this.addParam('instancename', instancename) + return this + } + + + StartServer scriptlocation(String scriptlocation) { + this.addParam('scriptlocation', scriptlocation) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApp.groovy new file mode 100644 index 00000000..e20ba318 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApp.groovy @@ -0,0 +1,78 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopApp extends Procedure { + + static StopApp create(Plugin plugin) { + return new StopApp(procedureName: 'StopApp', plugin: plugin, ) + } + + + StopApp flush() { + this.flushParams() + return this + } + + //Generated + + StopApp additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + StopApp appname(String appname) { + this.addParam('appname', appname) + return this + } + + + StopApp classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + StopApp clusterName(String clusterName) { + this.addParam('clusterName', clusterName) + return this + } + + + StopApp commands(String commands) { + this.addParam('commands', commands) + return this + } + + + StopApp configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StopApp javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + StopApp serverName(String serverName) { + this.addParam('serverName', serverName) + return this + } + + + StopApp wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApplicationServers.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApplicationServers.groovy new file mode 100644 index 00000000..858a8776 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopApplicationServers.groovy @@ -0,0 +1,42 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopApplicationServers extends Procedure { + + static StopApplicationServers create(Plugin plugin) { + return new StopApplicationServers(procedureName: 'StopApplicationServers', plugin: plugin, ) + } + + + StopApplicationServers flush() { + this.flushParams() + return this + } + + //Generated + + StopApplicationServers configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StopApplicationServers wasServersList(String wasServersList) { + this.addParam('wasServersList', wasServersList) + return this + } + + + StopApplicationServers wasWaitTime(String wasWaitTime) { + this.addParam('wasWaitTime', wasWaitTime) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopCluster.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopCluster.groovy new file mode 100644 index 00000000..554e1c96 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopCluster.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopCluster extends Procedure { + + static StopCluster create(Plugin plugin) { + return new StopCluster(procedureName: 'StopCluster', plugin: plugin, ) + } + + + StopCluster flush() { + this.flushParams() + return this + } + + //Generated + + StopCluster configName(String configName) { + this.addParam('configName', configName) + return this + } + + + StopCluster wasClusterName(String wasClusterName) { + this.addParam('wasClusterName', wasClusterName) + return this + } + + + StopCluster wasRippleStart(String wasRippleStart) { + this.addParam('wasRippleStart', wasRippleStart) + return this + } + + + StopCluster wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopDeploymentManager.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopDeploymentManager.groovy new file mode 100644 index 00000000..1c41922e --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopDeploymentManager.groovy @@ -0,0 +1,60 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopDeploymentManager extends Procedure { + + static StopDeploymentManager create(Plugin plugin) { + return new StopDeploymentManager(procedureName: 'StopDeploymentManager', plugin: plugin, ) + } + + + StopDeploymentManager flush() { + this.flushParams() + return this + } + + //Generated + + StopDeploymentManager configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StopDeploymentManager wasAdditionalParameters(String wasAdditionalParameters) { + this.addParam('wasAdditionalParameters', wasAdditionalParameters) + return this + } + + + StopDeploymentManager wasDeploymentManagerProfile(String wasDeploymentManagerProfile) { + this.addParam('wasDeploymentManagerProfile', wasDeploymentManagerProfile) + return this + } + + + StopDeploymentManager wasLogFileLocation(String wasLogFileLocation) { + this.addParam('wasLogFileLocation', wasLogFileLocation) + return this + } + + + StopDeploymentManager wasStopManagerLocation(String wasStopManagerLocation) { + this.addParam('wasStopManagerLocation', wasStopManagerLocation) + return this + } + + + StopDeploymentManager wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopNode.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopNode.groovy new file mode 100644 index 00000000..55c8d214 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopNode.groovy @@ -0,0 +1,66 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopNode extends Procedure { + + static StopNode create(Plugin plugin) { + return new StopNode(procedureName: 'StopNode', plugin: plugin, ) + } + + + StopNode flush() { + this.flushParams() + return this + } + + //Generated + + StopNode configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StopNode wasAdditionalParameters(String wasAdditionalParameters) { + this.addParam('wasAdditionalParameters', wasAdditionalParameters) + return this + } + + + StopNode wasLogFileLocation(String wasLogFileLocation) { + this.addParam('wasLogFileLocation', wasLogFileLocation) + return this + } + + + StopNode wasNodeProfile(String wasNodeProfile) { + this.addParam('wasNodeProfile', wasNodeProfile) + return this + } + + + StopNode wasStopNodeLocation(String wasStopNodeLocation) { + this.addParam('wasStopNodeLocation', wasStopNodeLocation) + return this + } + + + StopNode wasStopNodePolicy(String wasStopNodePolicy) { + this.addParam('wasStopNodePolicy', wasStopNodePolicy) + return this + } + + + StopNode wasTimeout(String wasTimeout) { + this.addParam('wasTimeout', wasTimeout) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopServer.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopServer.groovy new file mode 100644 index 00000000..af9e3577 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/StopServer.groovy @@ -0,0 +1,48 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class StopServer extends Procedure { + + static StopServer create(Plugin plugin) { + return new StopServer(procedureName: 'StopServer', plugin: plugin, ) + } + + + StopServer flush() { + this.flushParams() + return this + } + + //Generated + + StopServer additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + StopServer configname(String configname) { + this.addParam('configname', configname) + return this + } + + + StopServer instancename(String instancename) { + this.addParam('instancename', instancename) + return this + } + + + StopServer scriptlocation(String scriptlocation) { + this.addParam('scriptlocation', scriptlocation) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/SyncNodes.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/SyncNodes.groovy new file mode 100644 index 00000000..2c50617f --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/SyncNodes.groovy @@ -0,0 +1,36 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class SyncNodes extends Procedure { + + static SyncNodes create(Plugin plugin) { + return new SyncNodes(procedureName: 'SyncNodes', plugin: plugin, ) + } + + + SyncNodes flush() { + this.flushParams() + return this + } + + //Generated + + SyncNodes configurationName(String configurationName) { + this.addParam('configurationName', configurationName) + return this + } + + + SyncNodes wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UndeployApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UndeployApp.groovy new file mode 100644 index 00000000..1d846939 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UndeployApp.groovy @@ -0,0 +1,66 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class UndeployApp extends Procedure { + + static UndeployApp create(Plugin plugin) { + return new UndeployApp(procedureName: 'UndeployApp', plugin: plugin, ) + } + + + UndeployApp flush() { + this.flushParams() + return this + } + + //Generated + + UndeployApp additionalcommands(String additionalcommands) { + this.addParam('additionalcommands', additionalcommands) + return this + } + + + UndeployApp appname(String appname) { + this.addParam('appname', appname) + return this + } + + + UndeployApp classpath(String classpath) { + this.addParam('classpath', classpath) + return this + } + + + UndeployApp commands(String commands) { + this.addParam('commands', commands) + return this + } + + + UndeployApp configname(String configname) { + this.addParam('configname', configname) + return this + } + + + UndeployApp javaparams(String javaparams) { + this.addParam('javaparams', javaparams) + return this + } + + + UndeployApp wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UpdateApp.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UpdateApp.groovy new file mode 100644 index 00000000..772fd401 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/UpdateApp.groovy @@ -0,0 +1,84 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class UpdateApp extends Procedure { + + static UpdateApp create(Plugin plugin) { + return new UpdateApp(procedureName: 'UpdateApp', plugin: plugin, ) + } + + + UpdateApp flush() { + this.flushParams() + return this + } + + //Generated + + UpdateApp additionalParams(String additionalParams) { + this.addParam('additionalParams', additionalParams) + return this + } + + + UpdateApp appName(String appName) { + this.addParam('appName', appName) + return this + } + + + UpdateApp clusterName(String clusterName) { + this.addParam('clusterName', clusterName) + return this + } + + + UpdateApp configName(String configName) { + this.addParam('configName', configName) + return this + } + + + UpdateApp content(String content) { + this.addParam('content', content) + return this + } + + + UpdateApp contentType(String contentType) { + this.addParam('contentType', contentType) + return this + } + + + UpdateApp contentURI(String contentURI) { + this.addParam('contentURI', contentURI) + return this + } + + + UpdateApp operation(String operation) { + this.addParam('operation', operation) + return this + } + + + UpdateApp serverName(String serverName) { + this.addParam('serverName', serverName) + return this + } + + + UpdateApp wsadminAbsPath(String wsadminAbsPath) { + this.addParam('wsadminAbsPath', wsadminAbsPath) + return this + } + + + + +} \ No newline at end of file diff --git a/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/WebSphereConfig.groovy b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/WebSphereConfig.groovy new file mode 100644 index 00000000..b430cfde --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/pdk/hen/procedures/WebSphereConfig.groovy @@ -0,0 +1,92 @@ +package com.cloudbees.pdk.hen.procedures + +import groovy.transform.AutoClone +import com.cloudbees.pdk.hen.* + +@AutoClone +//generated +class WebSphereConfig extends Procedure { + + static WebSphereConfig create(Plugin plugin) { + return new WebSphereConfig(procedureName: 'CreateConfiguration', plugin: plugin, credentials: [ + + 'credential': null, + + ]) + } + + + WebSphereConfig flush() { + this.flushParams() + return this + } + + //Generated + + WebSphereConfig config(String config) { + this.addParam('config', config) + return this + } + + + WebSphereConfig conntype(String conntype) { + this.addParam('conntype', conntype) + return this + } + + + WebSphereConfig debug(boolean debug) { + this.addParam('debug', debug) + return this + } + + + WebSphereConfig debug(String debug) { + this.addParam('debug', debug) + return this + } + + + WebSphereConfig testconnection(boolean testconnection) { + this.addParam('test_connection', testconnection) + return this + } + + + WebSphereConfig testconnectionres(String testconnectionres) { + this.addParam('test_connection_res', testconnectionres) + return this + } + + + WebSphereConfig websphereport(String websphereport) { + this.addParam('websphere_port', websphereport) + return this + } + + + WebSphereConfig websphereurl(String websphereurl) { + this.addParam('websphere_url', websphereurl) + return this + } + + + WebSphereConfig wsadminabspath(String wsadminabspath) { + this.addParam('wsadminabspath', wsadminabspath) + return this + } + + + + WebSphereConfig credential(String user, String password) { + this.addCredential('credential', user, password) + return this + } + + WebSphereConfig credentialReference(String path) { + this.addCredentialReference('credential', path) + return this + } + + +} \ No newline at end of file From a481436f7d388ec92ec18a9651b7d96614311bc4 Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 12:50:02 +0200 Subject: [PATCH 31/47] added tests for testing external credentials in Create/Edit Configuration --- ...reateConfigurationWithExtCredsSuite.groovy | 346 ++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy diff --git a/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy b/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy new file mode 100644 index 00000000..5f1c3732 --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy @@ -0,0 +1,346 @@ +package com.cloudbees.plugin.spec + +import com.cloudbees.pdk.hen.Credential +import com.cloudbees.pdk.hen.ServerHandler +import com.cloudbees.pdk.hen.Utils +import com.cloudbees.pdk.hen.WebSphere +import com.cloudbees.pdk.hen.JobOutcome +import com.cloudbees.pdk.hen.procedures.WebSphereConfig +import com.electriccloud.plugins.annotations.NewFeature +import com.electriccloud.plugins.annotations.Sanity +import spock.lang.Ignore +import spock.lang.Requires +import spock.lang.Specification +import spock.lang.Unroll +import org.junit.Assume + +import static com.cloudbees.pdk.hen.Utils.setConfigurationValues +import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials + +class CreateConfigurationWithExtCredsSuite extends Specification { + + static ServerHandler serverHandler = ServerHandler.getInstance() + + static final String wsUsername = System.getenv("WAS_USERNAME") ?: "" + static final String wsPassword = System.getenv("WAS_PASSWORD") ?: "" + + static final String wsHost = System.getenv('WAS_HOST') ?: "" + static final String wsAgentPort = System.getenv('WEBSPHERE_RESOURCE_PORT') ?: '7808' + static final String wsAdminPath = System.getenv('WSADMIN_PATH') + static final String wasPort = System.getenv('WAS_PORT') + +// TODO: Proxy is not implemented in EC-WebSphere and all lines codes related to proxy are commented +// TODO: they can be deleted or be left for better times +// static final String proxyUrl = System.getenv("EF_PROXY_URL") ?: "" +// static final String proxyUsername = System.getenv("EF_PROXY_USERNAME") ?: "" +// static final String proxyPassword = System.getenv("EF_PROXY_PASSWORD") ?: "" + + static String cdFlowProject = "WebSphereCredsProject" + static String cdFlowProjectCredsName = "WebSphereCreds" + static String cdFlowProjectNegativeCredsName = "negativeWebSphereCreds" + +// static String cdFlowProjectNegativeProxyCredsName = "negativeProxyCreds" +// static String cdFlowProjectProxyCredsName = "proxyCreds" + + static String wrongUsername = "wrongUser" + static String wrongPassword = "wrongPassword" + + static String credsFieldName = "credential" + static String credsProxyFieldName = "proxy_credential" + + static String deleteCredentialDsl = """ + def credProject = args.project + def credName = args.credName + + + deleteCredential([ + projectName: credProject, + credentialName: credName, + ]) + """ + + static Credential creds = new Credential(userName: wsUsername, password: wsPassword) + static Credential wrongCreds = new Credential(userName: wrongUsername, password: wrongPassword) + static Map credsByState = [:] + +// static Credential proxyCreds = new Credential(userName: proxyUsername, password: proxyPassword) +// static Credential wrongProxyCreds = new Credential(userName: wrongUsername, password: wrongPassword) +// static Map proxyCredsByState = [:] + + + def setupSpec() { + // Create credential in the project + serverHandler.dsl("createProject([projectName: '${cdFlowProject}', ])") + serverHandler.setupResource(wsHost, wsHost, wsAgentPort.toInteger()) + + Map referenceCreds = serverHandler.createCredentials( + cdFlowProject, [ + (cdFlowProjectCredsName): new Credential(userName: wsUsername, password: wsPassword), + (cdFlowProjectNegativeCredsName): new Credential(userName: wrongUsername, password: wrongPassword), + ]) + + credsByState[Utils.CredsStates.RUNTIME] = creds + credsByState[Utils.CredsStates.REFERENCE] = referenceCreds[cdFlowProjectCredsName] + credsByState[Utils.CredsStates.WRONG_RUNTIME] = wrongCreds + credsByState[Utils.CredsStates.WRONG_REFERENCE] = referenceCreds[cdFlowProjectNegativeCredsName] + } + + def cleanupSpec() { +// <--deletion of creds, they will be deleted anyway if project is deleted--> + serverHandler.dsl(deleteCredentialDsl, [project: cdFlowProject, credName: cdFlowProjectCredsName,]) + serverHandler.dsl(deleteCredentialDsl, [project: cdFlowProject, credName: cdFlowProjectNegativeCredsName,]) + + serverHandler.dsl("deleteProject([projectName: '${cdFlowProject}', ])") + } + + @Sanity + @Requires({!System.getenv("EF_PROXY_URL")}) + @Unroll + def "Sanity without proxy. Create Config with credential reference/runtime credentials"() { + when: "Create plugin config" + WebSphere webSpherePlugin = WebSphere.createWithoutConfig() + WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) + + webSphereConfig.wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(initTestConn) + .testconnectionres(wsHost) + .debug("1") + + + setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSphereConfig) +// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) + webSpherePlugin.configure(webSphereConfig) + + and: "Run Plugin Procedure - CheckNodeStatus" + +// I assume that checkServerStatus check rest api without using creds +// def result = webSpherePlugin.checkServerStatus +// .maxelapsedtime("30") +// .successcriteria("response") +// .run() + + def result = webSpherePlugin.checkNodeStatus + .wsadminAbsPath(wsAdminPath) + // TODO: currently we don't have license for the default environment (v90nd) + // TODO: and I wrote tests for v90s, pattern of node name can be different from {wshost + "Node1"} + .nodeName(wsHost + "Node01") + .successCriteria("ALL_RUNNING") + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert result.isSuccessful() + verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(initProxyCredential, webSpherePlugin.configName + "_" + credsProxyFieldName, webSpherePlugin) +// --------------------------------------------------------------- + + when: "Edit Configuration to second state" + setConfigurationValues(toCredential, credsFieldName, credsByState[toCredential], webSpherePlugin.editConfiguration) +// setConfigurationValues(toProxyCredential, credsProxyFieldName, proxyCredsByState[toProxyCredential], gitPlugin.editConfiguration) + def resultOfEditConfig = webSpherePlugin.editConfig() + .wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(toTestConn) + .testconnectionres(wsHost) + .debug("1") +// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) + .runNaked() + + and: "run plugin procedure again with edited configuration" + def secondResult = webSpherePlugin.checkNodeStatus + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert resultOfEditConfig.isSuccessful() + assert secondResult.isSuccessful() + verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName+ "_" + credsProxyFieldName, gitPlugin) + // --------------------------------------------------------------- + + when: "Edit Configuration - back to initial state" + setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSpherePlugin.editConfiguration) +// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitPlugin.editConfiguration) + def resultOfEditConfigToInitState = webSpherePlugin.editConfig() + .wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(initTestConn) + .testconnectionres(wsHost) + .debug("1") +// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) + .runNaked() + + and: "run plugin procedure again with edited configuration" + def thirdResult = webSpherePlugin.checkNodeStatus + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert resultOfEditConfigToInitState.isSuccessful() + assert thirdResult.isSuccessful() + verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + // --------------------------------------------------------------- + + when: "Delete plugin configuration" + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + then: "Verify that there are no credential and configuration after configuration deleting" + verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + '_' + credsProxyFieldName, gitPlugin) + + cleanup: +// if test failed for some reason and configuration wasn't delete in the last step of test, +// the configuration anyway will be deleted to not break next tests + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + where: + initCredential | initProxyCredential | toCredential | toProxyCredential | initTestConn | toTestConn + Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | false | false + Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | false | true + Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | false + Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | true + } + + // TODO: remove ignore after bug https://cloudbees.atlassian.net/browse/FLOWPLUGIN-9056 will be fixed + @Ignore + @NewFeature(pluginVersion = "2.9.0") + @Requires({!System.getenv("EF_PROXY_URL")}) + @Unroll + def "Negative without proxy. Create Config with credential reference/runtime credentials"() { + // TODO uncomment lines with proxyCreds, when proxy creds will be added to Plugin + when: "Create plugin config" + WebSphere webSpherePlugin = WebSphere.createWithoutConfig() + WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) + + webSphereConfig.wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(initTestConn) + .testconnectionres(wsHost) + .debug(true) + + setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSphereConfig) +// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) + + def configCreationResult = webSpherePlugin.configure(webSphereConfig, expResultOfCreatingConfig) + + and: "Run Plugin Procedure - GetProjectVersions" + def result = webSpherePlugin.checkNodeStatus + .wsadminAbsPath(wsAdminPath) + .nodeName(wsHost + "Node01") + .successCriteria("ALL_RUNNING") + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + + assert result.outcome == initExpectedJobResult + assert configCreationResult.outcome == expResultOfCreatingConfig + if (expResultOfCreatingConfig == JobOutcome.SUCCESS) { + verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + } + if (expResultOfCreatingConfig == JobOutcome.ERROR) { + verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + // no sense to continue test scenario, because configuration wasn't created + // so test will be skipped + Assume.assumeFalse(true) + } + + // --------------------------------------------------------------- + + when: "Edit Configuration to second state" + setConfigurationValues(toCredential, credsFieldName, credsByState[toCredential], webSpherePlugin.editConfiguration) +// setConfigurationValues(toProxyCredential, credsProxyFieldName, proxyCredsByState[toProxyCredential], gitPlugin.editConfiguration) + def resultOfEditConfig = webSpherePlugin.editConfig() + .wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(toTestConn) + .testconnectionres(wsHost) + .debug(true) +// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) + .runNaked() + + and: "run plugin procedure again with edited configuration" + def secondResult = webSpherePlugin.checkNodeStatus + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert resultOfEditConfig.outcome == expResultOfEditingConfig + assert secondResult.outcome == afterEditingJobResult + + if (expResultOfEditingConfig == JobOutcome.SUCCESS) { + verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + } + if (expResultOfEditingConfig == JobOutcome.ERROR) { + verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + } + + // --------------------------------------------------------------- + + when: "Edit Configuration - back to initial state" + setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSpherePlugin.editConfiguration) +// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitPlugin.editConfiguration) + def resultOfEditConfigToInitState = webSpherePlugin.editConfig() + .wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(initTestConn) + .testconnectionres(wsHost) + .debug(true) +// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) + .runNaked() + + and: "run plugin procedure again with edited configuration" + def thirdResult = webSpherePlugin.checkNodeStatus + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert resultOfEditConfigToInitState.outcome == expResultOfCreatingConfig + assert thirdResult.outcome == initExpectedJobResult + + if (expResultOfCreatingConfig == JobOutcome.SUCCESS) { + verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + } + if (expResultOfCreatingConfig == JobOutcome.ERROR) { + verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) + } + + // --------------------------------------------------------------- + + when: "Delete plugin configuration" + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + then: "Verify that there are no credential and configuration after configuration deleting" + verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) +// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + '_' + credsProxyFieldName, gitPlugin) + + cleanup: +// if test failed for some reason and configuration wasn't delete in the last step of test, +// the configuration anyway will be deleted to not break next tests + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + where: + initCredential | initProxyCredential | toCredential | toProxyCredential | initTestConn | toTestConn | expResultOfCreatingConfig | expResultOfEditingConfig | initExpectedJobResult | afterEditingJobResult + Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR + Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | false | true | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.SUCCESS + Utils.CredsStates.EMPTY | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | false | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | false | true | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + } + + +} From 86da699c86f767c02c7b15eef3f2dadbf0a007f2 Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 18:03:58 +0200 Subject: [PATCH 32/47] removed extra semicolons and quotes --- specs/environments/default/systemtest.env | 22 +++++++++++----------- specs/environments/v90s/systemtest.env | 16 ++++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/specs/environments/default/systemtest.env b/specs/environments/default/systemtest.env index ecdaf5dc..e32435f2 100644 --- a/specs/environments/default/systemtest.env +++ b/specs/environments/default/systemtest.env @@ -1,11 +1,11 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ +WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +IS_WAS_ND=1 diff --git a/specs/environments/v90s/systemtest.env b/specs/environments/v90s/systemtest.env index 8723ce88..e730ea96 100644 --- a/specs/environments/v90s/systemtest.env +++ b/specs/environments/v90s/systemtest.env @@ -1,8 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ \ No newline at end of file From bbbab3cdb014449bd3629cfa27b7edd2ced916e1 Mon Sep 17 00:00:00 2001 From: Eduard Serbin Date: Fri, 5 Mar 2021 18:04:34 +0200 Subject: [PATCH 33/47] added tests for DeleteConfiguration --- .../spec/DeleteConfigurationSuite.groovy | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy diff --git a/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy b/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy new file mode 100644 index 00000000..2c1db35e --- /dev/null +++ b/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy @@ -0,0 +1,103 @@ +package com.cloudbees.plugin.spec + +import com.cloudbees.pdk.hen.Credential +import com.cloudbees.pdk.hen.JobOutcome +import com.cloudbees.pdk.hen.ServerHandler +import com.cloudbees.pdk.hen.Utils +import com.cloudbees.pdk.hen.WebSphere +import com.cloudbees.pdk.hen.procedures.WebSphereConfig +import com.electriccloud.plugins.annotations.Sanity +import spock.lang.Requires +import spock.lang.Specification +import spock.lang.Unroll + +import static com.cloudbees.pdk.hen.Utils.setConfigurationValues +import static com.cloudbees.pdk.hen.Utils.setConfigurationValues +import static com.cloudbees.pdk.hen.Utils.setConfigurationValues +import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials +import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials +import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials +import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials + +class DeleteConfigurationSuite extends Specification{ + + static ServerHandler serverHandler = ServerHandler.getInstance() + + static final String wsUsername = System.getenv("WAS_USERNAME") ?: "" + static final String wsPassword = System.getenv("WAS_PASSWORD") ?: "" + + static final String wsHost = System.getenv('WAS_HOST') ?: "" + static final String wsAgentPort = System.getenv('WEBSPHERE_RESOURCE_PORT') ?: '7808' + static final String wsAdminPath = System.getenv('WSADMIN_PATH') + static final String wasPort = System.getenv('WAS_PORT') + + static String cdFlowProject = "WebSphereDeleteConfigurationProject" + + + def setupSpec() { + // Create credential in the project + serverHandler.dsl("createProject([projectName: '${cdFlowProject}', ])") + serverHandler.setupResource(wsHost, wsHost, wsAgentPort.toInteger()) + + } + + def cleanupSpec() { + serverHandler.dsl("deleteProject([projectName: '${cdFlowProject}', ])") + } + + @Sanity + @Requires({!System.getenv("EF_PROXY_URL")}) + @Unroll + def "Sanity without proxy. Delete Configuration"() { + when: "Create plugin config" + WebSphere webSpherePlugin = WebSphere.createWithoutConfig() + WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) + + webSphereConfig.wsadminabspath(wsAdminPath) + .conntype("SOAP") + .websphereurl(wsHost) + .websphereport(System.getenv('WAS_PORT')) + .testconnection(true) + .testconnectionres(wsHost) + .debug("1") + + + setConfigurationValues(Utils.CredsStates.RUNTIME, "credential", new Credential(userName: wsUsername, password: wsPassword), webSphereConfig) +// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) + webSpherePlugin.configure(webSphereConfig) + + and: "Run Plugin Procedure - checkNodeStatus" + + def result = webSpherePlugin.checkNodeStatus + .wsadminAbsPath(wsAdminPath) + // TODO: currently we don't have license for the default environment (v90nd) + // TODO: and I wrote tests for v90s, pattern of node name can be different from {wshost + "Node1"} + .nodeName(wsHost + "Node01") + .successCriteria("ALL_RUNNING") + .run() + + then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" + assert result.isSuccessful() + + when: "Delete Configuration " + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + and: "run plugin procedure again without configuration" + def secondResult = webSpherePlugin.checkNodeStatus + .run() + + then: "Verify that procedure fails" + assert secondResult.outcome == JobOutcome.ERROR + assert secondResult.jobLog =~ "Configuration '${webSpherePlugin.configName}' doesn't exist" + + cleanup: +// if test failed for some reason and configuration wasn't delete in the last step of test, +// the configuration anyway will be deleted to not break next tests + webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) + + where: + TC | description + "1"| "DeleteConfiguration" + } + +} From 5f426c4cafd6625f7fb2fd8d99a05aad3db33abb Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Tue, 6 Apr 2021 16:29:08 +0300 Subject: [PATCH 34/47] Copied repositories from EC-ALM --- build.gradle | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 093e8a9e..a6281c1b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { repositories { maven { url 'http://dl.bintray.com/ecpluginsdev/maven' } - jcenter() + maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } } dependencies { classpath group: 'com.electriccloud.plugins', name: 'flow-gradle-plugin', version: '2.+' @@ -21,34 +21,44 @@ repositories { // maven { // url "http://artifactory.electric-cloud.com/artifactory/repo" // } + maven { + url 'https://nexus-internal.cloudbees.com/content/groups/mirror/' + credentials { + username = System.getenv('NEXUS_USERNAME') ?: nexusUsername + password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword + } + } maven { url 'https://nexus-internal.cloudbees.com/content/repositories/snapshots' credentials { - username = nexusUsername - password = nexusPassword + username = System.getenv('NEXUS_USERNAME') ?: nexusUsername + password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword } } maven { url 'https://nexus-internal.cloudbees.com/service/local/staging/deploy/maven2' credentials { - username = nexusUsername - password = nexusPassword + username = System.getenv('NEXUS_USERNAME') ?: nexusUsername + password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword } } maven { url 'http://35.234.102.60/artifactory/ec' credentials { - username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' - password = System.getenv('ARTIFACTORY_PASSWORD') + username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' + password = System.getenv('ARTIFACTORY_PASSWORD') } } maven { url "http://35.234.102.60/artifactory/thirdparty" credentials { - username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' - password = System.getenv('ARTIFACTORY_PASSWORD') + username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' + password = System.getenv('ARTIFACTORY_PASSWORD') } } + maven { + url "https://oss.sonatype.org/content/repositories/snapshots" + } } configurations.all { From c99593952a028a7a945ec1358c7ce5ccb352b44c Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Tue, 6 Apr 2021 20:44:57 +0300 Subject: [PATCH 35/47] Switching default environment to 'v90s' --- specs/environments/default/docker-compose.yml | 16 ++++++++-------- specs/environments/default/setEnv.sh | 11 ++++------- specs/environments/default/setEnv_Win.bat | 12 +++++------- specs/environments/default/systemtest.env | 11 ++++------- .../{v90s => v90nd}/docker-compose.yml | 16 ++++++++-------- specs/environments/v90nd/setEnv.sh | 11 +++++++++++ specs/environments/v90nd/setEnv_Win.bat | 10 ++++++++++ specs/environments/v90nd/systemtest.env | 11 +++++++++++ specs/environments/{v90s => v90nd}/waitForEnv.pl | 0 specs/environments/v90s/setEnv.sh | 8 -------- specs/environments/v90s/setEnv_Win.bat | 8 -------- specs/environments/v90s/systemtest.env | 8 -------- 12 files changed, 61 insertions(+), 61 deletions(-) rename specs/environments/{v90s => v90nd}/docker-compose.yml (70%) create mode 100755 specs/environments/v90nd/setEnv.sh create mode 100644 specs/environments/v90nd/setEnv_Win.bat create mode 100644 specs/environments/v90nd/systemtest.env rename specs/environments/{v90s => v90nd}/waitForEnv.pl (100%) delete mode 100755 specs/environments/v90s/setEnv.sh delete mode 100644 specs/environments/v90s/setEnv_Win.bat delete mode 100644 specs/environments/v90s/systemtest.env diff --git a/specs/environments/default/docker-compose.yml b/specs/environments/default/docker-compose.yml index 9e579918..98b67b8e 100644 --- a/specs/environments/default/docker-compose.yml +++ b/specs/environments/default/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90nd" + image: "electricflow/websphere90s" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8879:8879" - container_name: websphere90nd - hostname: "websphere90nd" + - "8880:8880" + container_name: websphere90s + hostname: "websphere90s" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90nd - - RESOURCE_NAME=websphere90nd + - EF_RESOURCE_NAME=websphere90s + - RESOURCE_NAME=websphere90s - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90ndCell01 - - WAS_NODE_NAME=websphere90ndNode01 + - WAS_CELL_NAME=websphere90sCell01 + - WAS_NODE_NAME=websphere90sNode01 restart: always networks: internal: diff --git a/specs/environments/default/setEnv.sh b/specs/environments/default/setEnv.sh index 25983373..56710d4e 100755 --- a/specs/environments/default/setEnv.sh +++ b/specs/environments/default/setEnv.sh @@ -1,11 +1,8 @@ export WAS_USERNAME="wsadmin" export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90nd"; -export WAS_PORT="8879"; +export WAS_HOST="websphere90s"; +export WAS_PORT="8880"; export WAS_CONNTYPE="SOAP"; export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; -export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -export IS_WAS_ND="1"; +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/default/setEnv_Win.bat b/specs/environments/default/setEnv_Win.bat index 6738773a..25c560e6 100644 --- a/specs/environments/default/setEnv_Win.bat +++ b/specs/environments/default/setEnv_Win.bat @@ -1,10 +1,8 @@ set WAS_USERNAME=wsadmin set WAS_PASSWORD=changeme -set WAS_HOST=websphere90nd -set WAS_PORT=8879 +set WAS_HOST=websphere90s +set WAS_PORT=8880 +set WAS_CONNTYPE=SOAP set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -set WAS_APPPATH=/var/tmp/ -set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh -set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh -set IS_WAS_ND=1 +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +set WAS_APPPATH=C:\ diff --git a/specs/environments/default/systemtest.env b/specs/environments/default/systemtest.env index ecdaf5dc..8723ce88 100644 --- a/specs/environments/default/systemtest.env +++ b/specs/environments/default/systemtest.env @@ -1,11 +1,8 @@ WAS_USERNAME="wsadmin" WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; +WAS_HOST="websphere90s"; +WAS_PORT="8880"; WAS_CONNTYPE="SOAP"; WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" +WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; +WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90s/docker-compose.yml b/specs/environments/v90nd/docker-compose.yml similarity index 70% rename from specs/environments/v90s/docker-compose.yml rename to specs/environments/v90nd/docker-compose.yml index 98b67b8e..9e579918 100644 --- a/specs/environments/v90s/docker-compose.yml +++ b/specs/environments/v90nd/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90s" + image: "electricflow/websphere90nd" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8880:8880" - container_name: websphere90s - hostname: "websphere90s" + - "8879:8879" + container_name: websphere90nd + hostname: "websphere90nd" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90s - - RESOURCE_NAME=websphere90s + - EF_RESOURCE_NAME=websphere90nd + - RESOURCE_NAME=websphere90nd - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90sCell01 - - WAS_NODE_NAME=websphere90sNode01 + - WAS_CELL_NAME=websphere90ndCell01 + - WAS_NODE_NAME=websphere90ndNode01 restart: always networks: internal: diff --git a/specs/environments/v90nd/setEnv.sh b/specs/environments/v90nd/setEnv.sh new file mode 100755 index 00000000..25983373 --- /dev/null +++ b/specs/environments/v90nd/setEnv.sh @@ -0,0 +1,11 @@ +export WAS_USERNAME="wsadmin" +export WAS_PASSWORD="changeme"; +export WAS_HOST="websphere90nd"; +export WAS_PORT="8879"; +export WAS_CONNTYPE="SOAP"; +export WAS_DEBUG="1"; +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; +export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; +export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; +export IS_WAS_ND="1"; diff --git a/specs/environments/v90nd/setEnv_Win.bat b/specs/environments/v90nd/setEnv_Win.bat new file mode 100644 index 00000000..6738773a --- /dev/null +++ b/specs/environments/v90nd/setEnv_Win.bat @@ -0,0 +1,10 @@ +set WAS_USERNAME=wsadmin +set WAS_PASSWORD=changeme +set WAS_HOST=websphere90nd +set WAS_PORT=8879 +set WAS_DEBUG=1 +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +set WAS_APPPATH=/var/tmp/ +set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +set IS_WAS_ND=1 diff --git a/specs/environments/v90nd/systemtest.env b/specs/environments/v90nd/systemtest.env new file mode 100644 index 00000000..ecdaf5dc --- /dev/null +++ b/specs/environments/v90nd/systemtest.env @@ -0,0 +1,11 @@ +WAS_USERNAME="wsadmin" +WAS_PASSWORD="changeme"; +WAS_HOST="websphere90nd"; +WAS_PORT="8879"; +WAS_CONNTYPE="SOAP"; +WAS_DEBUG="1"; +WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; +WAS_APPPATH="/var/tmp/"; +WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; +WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; +IS_WAS_ND="1" diff --git a/specs/environments/v90s/waitForEnv.pl b/specs/environments/v90nd/waitForEnv.pl similarity index 100% rename from specs/environments/v90s/waitForEnv.pl rename to specs/environments/v90nd/waitForEnv.pl diff --git a/specs/environments/v90s/setEnv.sh b/specs/environments/v90s/setEnv.sh deleted file mode 100755 index 56710d4e..00000000 --- a/specs/environments/v90s/setEnv.sh +++ /dev/null @@ -1,8 +0,0 @@ -export WAS_USERNAME="wsadmin" -export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90s"; -export WAS_PORT="8880"; -export WAS_CONNTYPE="SOAP"; -export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90s/setEnv_Win.bat b/specs/environments/v90s/setEnv_Win.bat deleted file mode 100644 index 25c560e6..00000000 --- a/specs/environments/v90s/setEnv_Win.bat +++ /dev/null @@ -1,8 +0,0 @@ -set WAS_USERNAME=wsadmin -set WAS_PASSWORD=changeme -set WAS_HOST=websphere90s -set WAS_PORT=8880 -set WAS_CONNTYPE=SOAP -set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh -set WAS_APPPATH=C:\ diff --git a/specs/environments/v90s/systemtest.env b/specs/environments/v90s/systemtest.env deleted file mode 100644 index 8723ce88..00000000 --- a/specs/environments/v90s/systemtest.env +++ /dev/null @@ -1,8 +0,0 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file From 58060a490bfa8766d807fa6487e6433d12a14a13 Mon Sep 17 00:00:00 2001 From: Alexey Sinyuk Date: Wed, 7 Apr 2021 16:04:27 +0300 Subject: [PATCH 36/47] Removed traced of using proxy with EC-WebSphere Create/Edit Configuration procedures. --- ...reateConfigurationWithExtCredsSuite.groovy | 64 ++++--------------- 1 file changed, 13 insertions(+), 51 deletions(-) diff --git a/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy b/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy index 5f1c3732..81fc9aa5 100644 --- a/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy +++ b/specs/src/test/groovy/com/cloudbees/plugin/spec/CreateConfigurationWithExtCredsSuite.groovy @@ -29,24 +29,14 @@ class CreateConfigurationWithExtCredsSuite extends Specification { static final String wsAdminPath = System.getenv('WSADMIN_PATH') static final String wasPort = System.getenv('WAS_PORT') -// TODO: Proxy is not implemented in EC-WebSphere and all lines codes related to proxy are commented -// TODO: they can be deleted or be left for better times -// static final String proxyUrl = System.getenv("EF_PROXY_URL") ?: "" -// static final String proxyUsername = System.getenv("EF_PROXY_USERNAME") ?: "" -// static final String proxyPassword = System.getenv("EF_PROXY_PASSWORD") ?: "" - static String cdFlowProject = "WebSphereCredsProject" static String cdFlowProjectCredsName = "WebSphereCreds" static String cdFlowProjectNegativeCredsName = "negativeWebSphereCreds" -// static String cdFlowProjectNegativeProxyCredsName = "negativeProxyCreds" -// static String cdFlowProjectProxyCredsName = "proxyCreds" - static String wrongUsername = "wrongUser" static String wrongPassword = "wrongPassword" static String credsFieldName = "credential" - static String credsProxyFieldName = "proxy_credential" static String deleteCredentialDsl = """ def credProject = args.project @@ -63,10 +53,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { static Credential wrongCreds = new Credential(userName: wrongUsername, password: wrongPassword) static Map credsByState = [:] -// static Credential proxyCreds = new Credential(userName: proxyUsername, password: proxyPassword) -// static Credential wrongProxyCreds = new Credential(userName: wrongUsername, password: wrongPassword) -// static Map proxyCredsByState = [:] - def setupSpec() { // Create credential in the project @@ -94,9 +80,8 @@ class CreateConfigurationWithExtCredsSuite extends Specification { } @Sanity - @Requires({!System.getenv("EF_PROXY_URL")}) @Unroll - def "Sanity without proxy. Create Config with credential reference/runtime credentials"() { + def "Sanity. Create Config with credential reference/runtime credentials"() { when: "Create plugin config" WebSphere webSpherePlugin = WebSphere.createWithoutConfig() WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) @@ -111,7 +96,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSphereConfig) -// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) webSpherePlugin.configure(webSphereConfig) and: "Run Plugin Procedure - CheckNodeStatus" @@ -133,12 +117,10 @@ class CreateConfigurationWithExtCredsSuite extends Specification { then: "Verify that procedure completed as expected and credentials in plugin exist or not exist" assert result.isSuccessful() verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(initProxyCredential, webSpherePlugin.configName + "_" + credsProxyFieldName, webSpherePlugin) // --------------------------------------------------------------- when: "Edit Configuration to second state" setConfigurationValues(toCredential, credsFieldName, credsByState[toCredential], webSpherePlugin.editConfiguration) -// setConfigurationValues(toProxyCredential, credsProxyFieldName, proxyCredsByState[toProxyCredential], gitPlugin.editConfiguration) def resultOfEditConfig = webSpherePlugin.editConfig() .wsadminabspath(wsAdminPath) .conntype("SOAP") @@ -147,7 +129,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { .testconnection(toTestConn) .testconnectionres(wsHost) .debug("1") -// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) .runNaked() and: "run plugin procedure again with edited configuration" @@ -158,12 +139,10 @@ class CreateConfigurationWithExtCredsSuite extends Specification { assert resultOfEditConfig.isSuccessful() assert secondResult.isSuccessful() verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName+ "_" + credsProxyFieldName, gitPlugin) // --------------------------------------------------------------- when: "Edit Configuration - back to initial state" setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSpherePlugin.editConfiguration) -// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitPlugin.editConfiguration) def resultOfEditConfigToInitState = webSpherePlugin.editConfig() .wsadminabspath(wsAdminPath) .conntype("SOAP") @@ -172,7 +151,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { .testconnection(initTestConn) .testconnectionres(wsHost) .debug("1") -// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) .runNaked() and: "run plugin procedure again with edited configuration" @@ -183,7 +161,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { assert resultOfEditConfigToInitState.isSuccessful() assert thirdResult.isSuccessful() verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) // --------------------------------------------------------------- when: "Delete plugin configuration" @@ -191,7 +168,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { then: "Verify that there are no credential and configuration after configuration deleting" verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + '_' + credsProxyFieldName, gitPlugin) cleanup: // if test failed for some reason and configuration wasn't delete in the last step of test, @@ -199,20 +175,18 @@ class CreateConfigurationWithExtCredsSuite extends Specification { webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) where: - initCredential | initProxyCredential | toCredential | toProxyCredential | initTestConn | toTestConn - Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | false | false - Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | false | true - Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | false - Utils.CredsStates.REFERENCE | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | true + initCredential | toCredential | initTestConn | toTestConn + Utils.CredsStates.RUNTIME | Utils.CredsStates.REFERENCE | false | false + Utils.CredsStates.RUNTIME | Utils.CredsStates.REFERENCE | false | true + Utils.CredsStates.REFERENCE | Utils.CredsStates.RUNTIME | true | false + Utils.CredsStates.REFERENCE | Utils.CredsStates.RUNTIME | true | true } // TODO: remove ignore after bug https://cloudbees.atlassian.net/browse/FLOWPLUGIN-9056 will be fixed @Ignore @NewFeature(pluginVersion = "2.9.0") - @Requires({!System.getenv("EF_PROXY_URL")}) @Unroll - def "Negative without proxy. Create Config with credential reference/runtime credentials"() { - // TODO uncomment lines with proxyCreds, when proxy creds will be added to Plugin + def "Negative. Create Config with credential reference/runtime credentials"() { when: "Create plugin config" WebSphere webSpherePlugin = WebSphere.createWithoutConfig() WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) @@ -226,7 +200,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { .debug(true) setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSphereConfig) -// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) def configCreationResult = webSpherePlugin.configure(webSphereConfig, expResultOfCreatingConfig) @@ -243,11 +216,9 @@ class CreateConfigurationWithExtCredsSuite extends Specification { assert configCreationResult.outcome == expResultOfCreatingConfig if (expResultOfCreatingConfig == JobOutcome.SUCCESS) { verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) } if (expResultOfCreatingConfig == JobOutcome.ERROR) { verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) // no sense to continue test scenario, because configuration wasn't created // so test will be skipped Assume.assumeFalse(true) @@ -257,7 +228,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { when: "Edit Configuration to second state" setConfigurationValues(toCredential, credsFieldName, credsByState[toCredential], webSpherePlugin.editConfiguration) -// setConfigurationValues(toProxyCredential, credsProxyFieldName, proxyCredsByState[toProxyCredential], gitPlugin.editConfiguration) def resultOfEditConfig = webSpherePlugin.editConfig() .wsadminabspath(wsAdminPath) .conntype("SOAP") @@ -266,7 +236,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { .testconnection(toTestConn) .testconnectionres(wsHost) .debug(true) -// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) .runNaked() and: "run plugin procedure again with edited configuration" @@ -279,18 +248,15 @@ class CreateConfigurationWithExtCredsSuite extends Specification { if (expResultOfEditingConfig == JobOutcome.SUCCESS) { verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) } if (expResultOfEditingConfig == JobOutcome.ERROR) { verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) } // --------------------------------------------------------------- when: "Edit Configuration - back to initial state" setConfigurationValues(initCredential, credsFieldName, credsByState[initCredential], webSpherePlugin.editConfiguration) -// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitPlugin.editConfiguration) def resultOfEditConfigToInitState = webSpherePlugin.editConfig() .wsadminabspath(wsAdminPath) .conntype("SOAP") @@ -299,7 +265,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { .testconnection(initTestConn) .testconnectionres(wsHost) .debug(true) -// .httpproxy(toProxyCredential == Utils.CredsStates.EMPTY ? "" : proxyUrl) .runNaked() and: "run plugin procedure again with edited configuration" @@ -312,11 +277,9 @@ class CreateConfigurationWithExtCredsSuite extends Specification { if (expResultOfCreatingConfig == JobOutcome.SUCCESS) { verifyExistenceOfPluginsCredentials(initCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(initProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) } if (expResultOfCreatingConfig == JobOutcome.ERROR) { verifyExistenceOfPluginsCredentials(toCredential, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(toProxyCredential, gitPlugin.configName + "_" + credsProxyFieldName, gitPlugin) } // --------------------------------------------------------------- @@ -326,7 +289,6 @@ class CreateConfigurationWithExtCredsSuite extends Specification { then: "Verify that there are no credential and configuration after configuration deleting" verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, webSpherePlugin.configName, webSpherePlugin) -// verifyExistenceOfPluginsCredentials(Utils.CredsStates.DELETED, gitPlugin.configName + '_' + credsProxyFieldName, gitPlugin) cleanup: // if test failed for some reason and configuration wasn't delete in the last step of test, @@ -334,12 +296,12 @@ class CreateConfigurationWithExtCredsSuite extends Specification { webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) where: - initCredential | initProxyCredential | toCredential | toProxyCredential | initTestConn | toTestConn | expResultOfCreatingConfig | expResultOfEditingConfig | initExpectedJobResult | afterEditingJobResult - Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR - Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | false | true | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.SUCCESS - Utils.CredsStates.EMPTY | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS - Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | true | false | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS - Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | Utils.CredsStates.EMPTY | false | true | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + initCredential | toCredential | initTestConn | toTestConn | expResultOfCreatingConfig | expResultOfEditingConfig | initExpectedJobResult | afterEditingJobResult + Utils.CredsStates.RUNTIME | Utils.CredsStates.WRONG_RUNTIME | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR + Utils.CredsStates.RUNTIME | Utils.CredsStates.WRONG_RUNTIME | false | true | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.SUCCESS + Utils.CredsStates.EMPTY | Utils.CredsStates.RUNTIME | false | false | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.RUNTIME | true | false | JobOutcome.ERROR | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS + Utils.CredsStates.WRONG_RUNTIME | Utils.CredsStates.RUNTIME | false | true | JobOutcome.SUCCESS | JobOutcome.SUCCESS | JobOutcome.ERROR | JobOutcome.SUCCESS } From 4d2a85adaf86e0ef557fa6710d824f802ca08fb6 Mon Sep 17 00:00:00 2001 From: Alexey Sinyuk Date: Thu, 8 Apr 2021 09:46:22 +0300 Subject: [PATCH 37/47] Fixed formatting of systemtest.env for v90s environment. --- specs/environments/v90s/systemtest.env | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/specs/environments/v90s/systemtest.env b/specs/environments/v90s/systemtest.env index 8723ce88..e730ea96 100644 --- a/specs/environments/v90s/systemtest.env +++ b/specs/environments/v90s/systemtest.env @@ -1,8 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ \ No newline at end of file From 42a92923b47c1afefc7dba95f13ba0bdd78fd599 Mon Sep 17 00:00:00 2001 From: Alexey Sinyuk Date: Thu, 8 Apr 2021 11:42:54 +0300 Subject: [PATCH 38/47] Removed traced of using proxy with EC-WebSphere DeleteConfiguration procedure. Removed duplicate imports. --- .../plugin/spec/DeleteConfigurationSuite.groovy | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy b/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy index 2c1db35e..98f5825e 100644 --- a/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy +++ b/specs/src/test/groovy/com/cloudbees/plugin/spec/DeleteConfigurationSuite.groovy @@ -7,17 +7,10 @@ import com.cloudbees.pdk.hen.Utils import com.cloudbees.pdk.hen.WebSphere import com.cloudbees.pdk.hen.procedures.WebSphereConfig import com.electriccloud.plugins.annotations.Sanity -import spock.lang.Requires import spock.lang.Specification import spock.lang.Unroll import static com.cloudbees.pdk.hen.Utils.setConfigurationValues -import static com.cloudbees.pdk.hen.Utils.setConfigurationValues -import static com.cloudbees.pdk.hen.Utils.setConfigurationValues -import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials -import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials -import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials -import static com.cloudbees.pdk.hen.Utils.verifyExistenceOfPluginsCredentials class DeleteConfigurationSuite extends Specification{ @@ -46,9 +39,8 @@ class DeleteConfigurationSuite extends Specification{ } @Sanity - @Requires({!System.getenv("EF_PROXY_URL")}) @Unroll - def "Sanity without proxy. Delete Configuration"() { + def "Sanity. Delete Configuration"() { when: "Create plugin config" WebSphere webSpherePlugin = WebSphere.createWithoutConfig() WebSphereConfig webSphereConfig = WebSphereConfig.create(webSpherePlugin) @@ -63,7 +55,6 @@ class DeleteConfigurationSuite extends Specification{ setConfigurationValues(Utils.CredsStates.RUNTIME, "credential", new Credential(userName: wsUsername, password: wsPassword), webSphereConfig) -// setConfigurationValues(initProxyCredential, credsProxyFieldName, proxyCredsByState[initProxyCredential], gitConfig) webSpherePlugin.configure(webSphereConfig) and: "Run Plugin Procedure - checkNodeStatus" @@ -82,7 +73,7 @@ class DeleteConfigurationSuite extends Specification{ when: "Delete Configuration " webSpherePlugin.deleteConfiguration(webSpherePlugin.configName) - and: "run plugin procedure again without configuration" + and: "Run plugin procedure again without configuration" def secondResult = webSpherePlugin.checkNodeStatus .run() From 9cb2f79c3ae8abf1ec0227b4f0189bc10e85ba1d Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Thu, 8 Apr 2021 15:03:01 +0300 Subject: [PATCH 39/47] [WIP] Checking GWT artifacts repositories --- build.gradle | 39 +++++++++++++-------------------------- specs/build.gradle | 9 ++++----- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index a6281c1b..d9e41a23 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,6 @@ buildscript { repositories { maven { url 'http://dl.bintray.com/ecpluginsdev/maven' } - maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } } dependencies { @@ -18,9 +17,9 @@ buildscript { } repositories { - // maven { - // url "http://artifactory.electric-cloud.com/artifactory/repo" - // } + maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } + + // commander-client:10.2.0-SNAPSHOT maven { url 'https://nexus-internal.cloudbees.com/content/groups/mirror/' credentials { @@ -28,44 +27,32 @@ repositories { password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword } } + + // gwt-user:2.5.0-ec3, gwt-dev:2.5.0-ec1 maven { - url 'https://nexus-internal.cloudbees.com/content/repositories/snapshots' + url 'https://nexus-internal.cloudbees.com/content/repositories/releases/' credentials { username = System.getenv('NEXUS_USERNAME') ?: nexusUsername password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword } } + + //commander-sdk:6.1.2 + //ec_internal:6.1.2 maven { - url 'https://nexus-internal.cloudbees.com/service/local/staging/deploy/maven2' + url 'https://nexus-internal.cloudbees.com/content/repositories/hosted-releases/' credentials { username = System.getenv('NEXUS_USERNAME') ?: nexusUsername password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword } } - maven { - url 'http://35.234.102.60/artifactory/ec' - credentials { - username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' - password = System.getenv('ARTIFACTORY_PASSWORD') - } - } - maven { - url "http://35.234.102.60/artifactory/thirdparty" - credentials { - username = System.getenv('ARTIFACTORY_USERNAME') ?: 'build' - password = System.getenv('ARTIFACTORY_PASSWORD') - } - } - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - } } configurations.all { resolutionStrategy { - force group: 'com.electriccloud', name: 'commander-client', version: '2020.10.0-SNAPSHOT' - force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.0-SNAPSHOT' - force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.0-SNAPSHOT' + force group: 'com.electriccloud', name: 'commander-client', version: '10.2.0-SNAPSHOT' + force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.2' + force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.2' force group: 'com.google.gwt', name: 'gwt-user', version: '2.5.0-ec3' force group: 'com.google.gwt', name: 'gwt-dev', version: '2.5.0-ec1' diff --git a/specs/build.gradle b/specs/build.gradle index bd615a9d..2a815fe7 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -10,14 +10,14 @@ sourceCompatibility = 1.8 defaultTasks 'test' repositories { - jcenter() mavenCentral() maven { - url 'https://oss.sonatype.org/content/repositories/snapshots' + url "http://art.nimbus.beescloud.com/artifactory/jcenter" } maven { - url "https://dl.bintray.com/ecpluginsdev/maven" + url 'https://oss.sonatype.org/content/repositories/snapshots' } + // maven { // // Local snapshots // url "http://10.200.1.182:8081/artifactory/libs-snapshot-local" @@ -28,8 +28,7 @@ dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.5:indy' compile 'org.spockframework:spock-core:1.1-groovy-2.4' compile 'com.electriccloud:ec-specs-plugins-core:1.9.2' - // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' - // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0-SNAPSHOT' + compile 'com.jayway.restassured:rest-assured:2.4.0' testCompile( 'com.athaydes:spock-reports:1.6.0' ) { transitive = false // this avoids affecting your version of Groovy/Spock From 427436fabf3e22a4841dc1adffbaafee04114f69 Mon Sep 17 00:00:00 2001 From: Alexey Sinyuk Date: Thu, 8 Apr 2021 16:28:20 +0300 Subject: [PATCH 40/47] Fixed formatting of systemtest.env. Changed v90s to be default testing environment. Renamed old default to v90nd. --- specs/environments/default-x64/systemtest.env | 16 +++++++------- specs/environments/default/docker-compose.yml | 16 +++++++------- specs/environments/default/setEnv.sh | 11 ++++------ specs/environments/default/setEnv_Win.bat | 12 +++++----- specs/environments/default/systemtest.env | 19 +++++++--------- specs/environments/v70s/systemtest.env | 16 +++++++------- specs/environments/v80nd/systemtest.env | 22 +++++++++---------- specs/environments/v80nd_win/systemtest.env | 2 +- specs/environments/v80s/systemtest.env | 16 +++++++------- specs/environments/v80s_win/systemtest.env | 2 +- specs/environments/v85nd/systemtest.env | 22 +++++++++---------- specs/environments/v85nd_win/systemtest.env | 2 +- specs/environments/v85s/systemtest.env | 16 +++++++------- specs/environments/v85s_win/systemtest.env | 2 +- .../{v90s => v90nd}/docker-compose.yml | 16 +++++++------- specs/environments/v90nd/setEnv.sh | 11 ++++++++++ specs/environments/v90nd/setEnv_Win.bat | 10 +++++++++ specs/environments/v90nd/systemtest.env | 11 ++++++++++ .../{v90s => v90nd}/waitForEnv.pl | 0 specs/environments/v90nd_mq/systemtest.env | 16 +++++++------- specs/environments/v90nd_win/systemtest.env | 2 +- specs/environments/v90s/setEnv.sh | 8 ------- specs/environments/v90s/setEnv_Win.bat | 8 ------- specs/environments/v90s/systemtest.env | 8 ------- specs/environments/v90s_win/systemtest.env | 2 +- 25 files changed, 133 insertions(+), 133 deletions(-) mode change 100755 => 100644 specs/environments/default/setEnv.sh rename specs/environments/{v90s => v90nd}/docker-compose.yml (70%) create mode 100644 specs/environments/v90nd/setEnv.sh create mode 100644 specs/environments/v90nd/setEnv_Win.bat create mode 100644 specs/environments/v90nd/systemtest.env rename specs/environments/{v90s => v90nd}/waitForEnv.pl (100%) delete mode 100755 specs/environments/v90s/setEnv.sh delete mode 100644 specs/environments/v90s/setEnv_Win.bat delete mode 100644 specs/environments/v90s/systemtest.env diff --git a/specs/environments/default-x64/systemtest.env b/specs/environments/default-x64/systemtest.env index 26b8bb66..be034617 100644 --- a/specs/environments/default-x64/systemtest.env +++ b/specs/environments/default-x64/systemtest.env @@ -1,9 +1,9 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ diff --git a/specs/environments/default/docker-compose.yml b/specs/environments/default/docker-compose.yml index 9e579918..98b67b8e 100644 --- a/specs/environments/default/docker-compose.yml +++ b/specs/environments/default/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90nd" + image: "electricflow/websphere90s" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8879:8879" - container_name: websphere90nd - hostname: "websphere90nd" + - "8880:8880" + container_name: websphere90s + hostname: "websphere90s" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90nd - - RESOURCE_NAME=websphere90nd + - EF_RESOURCE_NAME=websphere90s + - RESOURCE_NAME=websphere90s - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90ndCell01 - - WAS_NODE_NAME=websphere90ndNode01 + - WAS_CELL_NAME=websphere90sCell01 + - WAS_NODE_NAME=websphere90sNode01 restart: always networks: internal: diff --git a/specs/environments/default/setEnv.sh b/specs/environments/default/setEnv.sh old mode 100755 new mode 100644 index 25983373..56710d4e --- a/specs/environments/default/setEnv.sh +++ b/specs/environments/default/setEnv.sh @@ -1,11 +1,8 @@ export WAS_USERNAME="wsadmin" export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90nd"; -export WAS_PORT="8879"; +export WAS_HOST="websphere90s"; +export WAS_PORT="8880"; export WAS_CONNTYPE="SOAP"; export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; -export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -export IS_WAS_ND="1"; +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/default/setEnv_Win.bat b/specs/environments/default/setEnv_Win.bat index 6738773a..25c560e6 100644 --- a/specs/environments/default/setEnv_Win.bat +++ b/specs/environments/default/setEnv_Win.bat @@ -1,10 +1,8 @@ set WAS_USERNAME=wsadmin set WAS_PASSWORD=changeme -set WAS_HOST=websphere90nd -set WAS_PORT=8879 +set WAS_HOST=websphere90s +set WAS_PORT=8880 +set WAS_CONNTYPE=SOAP set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -set WAS_APPPATH=/var/tmp/ -set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh -set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh -set IS_WAS_ND=1 +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +set WAS_APPPATH=C:\ diff --git a/specs/environments/default/systemtest.env b/specs/environments/default/systemtest.env index ecdaf5dc..e730ea96 100644 --- a/specs/environments/default/systemtest.env +++ b/specs/environments/default/systemtest.env @@ -1,11 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ \ No newline at end of file diff --git a/specs/environments/v70s/systemtest.env b/specs/environments/v70s/systemtest.env index ae39c830..8b6baeea 100644 --- a/specs/environments/v70s/systemtest.env +++ b/specs/environments/v70s/systemtest.env @@ -1,8 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere70s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere70s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ \ No newline at end of file diff --git a/specs/environments/v80nd/systemtest.env b/specs/environments/v80nd/systemtest.env index 3f3986fd..6007d578 100644 --- a/specs/environments/v80nd/systemtest.env +++ b/specs/environments/v80nd/systemtest.env @@ -1,11 +1,11 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere80nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere80nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ +WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +IS_WAS_ND=1 diff --git a/specs/environments/v80nd_win/systemtest.env b/specs/environments/v80nd_win/systemtest.env index b41f34a8..e942882b 100644 --- a/specs/environments/v80nd_win/systemtest.env +++ b/specs/environments/v80nd_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=websphere80nd WAS_PORT=8879 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/Dmgr01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 diff --git a/specs/environments/v80s/systemtest.env b/specs/environments/v80s/systemtest.env index 119b0af5..ed6ae6fd 100644 --- a/specs/environments/v80s/systemtest.env +++ b/specs/environments/v80s/systemtest.env @@ -1,8 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere80s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere80s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ \ No newline at end of file diff --git a/specs/environments/v80s_win/systemtest.env b/specs/environments/v80s_win/systemtest.env index 8b491651..4c49d392 100644 --- a/specs/environments/v80s_win/systemtest.env +++ b/specs/environments/v80s_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=WEBSPHERE80S WAS_PORT=8880 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/AppSrv01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 diff --git a/specs/environments/v85nd/systemtest.env b/specs/environments/v85nd/systemtest.env index ea115513..5fcce0d8 100644 --- a/specs/environments/v85nd/systemtest.env +++ b/specs/environments/v85nd/systemtest.env @@ -1,11 +1,11 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere85nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" \ No newline at end of file +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere85nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ +WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +IS_WAS_ND=1 \ No newline at end of file diff --git a/specs/environments/v85nd_win/systemtest.env b/specs/environments/v85nd_win/systemtest.env index 5ce4bc3a..124d7473 100644 --- a/specs/environments/v85nd_win/systemtest.env +++ b/specs/environments/v85nd_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=websphere85nd WAS_PORT=8879 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/Dmgr01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 diff --git a/specs/environments/v85s/systemtest.env b/specs/environments/v85s/systemtest.env index 4f08bfc6..5a75ce00 100644 --- a/specs/environments/v85s/systemtest.env +++ b/specs/environments/v85s/systemtest.env @@ -1,8 +1,8 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere85s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere85s +WAS_PORT=8880 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ diff --git a/specs/environments/v85s_win/systemtest.env b/specs/environments/v85s_win/systemtest.env index 99f14a47..26ea5428 100644 --- a/specs/environments/v85s_win/systemtest.env +++ b/specs/environments/v85s_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=websphere85s WAS_PORT=8880 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/Dmgr01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 diff --git a/specs/environments/v90s/docker-compose.yml b/specs/environments/v90nd/docker-compose.yml similarity index 70% rename from specs/environments/v90s/docker-compose.yml rename to specs/environments/v90nd/docker-compose.yml index 98b67b8e..9e579918 100644 --- a/specs/environments/v90s/docker-compose.yml +++ b/specs/environments/v90nd/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90s" + image: "electricflow/websphere90nd" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8880:8880" - container_name: websphere90s - hostname: "websphere90s" + - "8879:8879" + container_name: websphere90nd + hostname: "websphere90nd" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90s - - RESOURCE_NAME=websphere90s + - EF_RESOURCE_NAME=websphere90nd + - RESOURCE_NAME=websphere90nd - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90sCell01 - - WAS_NODE_NAME=websphere90sNode01 + - WAS_CELL_NAME=websphere90ndCell01 + - WAS_NODE_NAME=websphere90ndNode01 restart: always networks: internal: diff --git a/specs/environments/v90nd/setEnv.sh b/specs/environments/v90nd/setEnv.sh new file mode 100644 index 00000000..25983373 --- /dev/null +++ b/specs/environments/v90nd/setEnv.sh @@ -0,0 +1,11 @@ +export WAS_USERNAME="wsadmin" +export WAS_PASSWORD="changeme"; +export WAS_HOST="websphere90nd"; +export WAS_PORT="8879"; +export WAS_CONNTYPE="SOAP"; +export WAS_DEBUG="1"; +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; +export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; +export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; +export IS_WAS_ND="1"; diff --git a/specs/environments/v90nd/setEnv_Win.bat b/specs/environments/v90nd/setEnv_Win.bat new file mode 100644 index 00000000..6738773a --- /dev/null +++ b/specs/environments/v90nd/setEnv_Win.bat @@ -0,0 +1,10 @@ +set WAS_USERNAME=wsadmin +set WAS_PASSWORD=changeme +set WAS_HOST=websphere90nd +set WAS_PORT=8879 +set WAS_DEBUG=1 +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +set WAS_APPPATH=/var/tmp/ +set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +set IS_WAS_ND=1 diff --git a/specs/environments/v90nd/systemtest.env b/specs/environments/v90nd/systemtest.env new file mode 100644 index 00000000..e32435f2 --- /dev/null +++ b/specs/environments/v90nd/systemtest.env @@ -0,0 +1,11 @@ +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ +WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +IS_WAS_ND=1 diff --git a/specs/environments/v90s/waitForEnv.pl b/specs/environments/v90nd/waitForEnv.pl similarity index 100% rename from specs/environments/v90s/waitForEnv.pl rename to specs/environments/v90nd/waitForEnv.pl diff --git a/specs/environments/v90nd_mq/systemtest.env b/specs/environments/v90nd_mq/systemtest.env index 26b8bb66..be034617 100644 --- a/specs/environments/v90nd_mq/systemtest.env +++ b/specs/environments/v90nd_mq/systemtest.env @@ -1,9 +1,9 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; +WAS_USERNAME=wsadmin +WAS_PASSWORD=changeme +WAS_HOST=websphere90nd +WAS_PORT=8879 +WAS_CONNTYPE=SOAP +WAS_DEBUG=1 +WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +WAS_APPPATH=/var/tmp/ diff --git a/specs/environments/v90nd_win/systemtest.env b/specs/environments/v90nd_win/systemtest.env index 97f4b5f3..987fadef 100644 --- a/specs/environments/v90nd_win/systemtest.env +++ b/specs/environments/v90nd_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=websphere90nd WAS_PORT=8879 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/Dmgr01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 diff --git a/specs/environments/v90s/setEnv.sh b/specs/environments/v90s/setEnv.sh deleted file mode 100755 index 56710d4e..00000000 --- a/specs/environments/v90s/setEnv.sh +++ /dev/null @@ -1,8 +0,0 @@ -export WAS_USERNAME="wsadmin" -export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90s"; -export WAS_PORT="8880"; -export WAS_CONNTYPE="SOAP"; -export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90s/setEnv_Win.bat b/specs/environments/v90s/setEnv_Win.bat deleted file mode 100644 index 25c560e6..00000000 --- a/specs/environments/v90s/setEnv_Win.bat +++ /dev/null @@ -1,8 +0,0 @@ -set WAS_USERNAME=wsadmin -set WAS_PASSWORD=changeme -set WAS_HOST=websphere90s -set WAS_PORT=8880 -set WAS_CONNTYPE=SOAP -set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh -set WAS_APPPATH=C:\ diff --git a/specs/environments/v90s/systemtest.env b/specs/environments/v90s/systemtest.env deleted file mode 100644 index 8723ce88..00000000 --- a/specs/environments/v90s/systemtest.env +++ /dev/null @@ -1,8 +0,0 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90s"; -WAS_PORT="8880"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90s_win/systemtest.env b/specs/environments/v90s_win/systemtest.env index 0520b582..bc02db4e 100644 --- a/specs/environments/v90s_win/systemtest.env +++ b/specs/environments/v90s_win/systemtest.env @@ -3,7 +3,7 @@ WAS_PASSWORD=changeme WAS_HOST=websphere90s WAS_PORT=8880 WAS_CONNTYPE=SOAP -WAS_DEBUG=1; +WAS_DEBUG=1 WSADMIN_PATH=C:/IBM/WebSphere/profiles/Dmgr01/bin/wsadmin.bat WAS_APPPATH=C:/IBM/ IS_WINDOWS=1 From 4e57554267aa0ff78756e1ab0837f7a7bbaf3a57 Mon Sep 17 00:00:00 2001 From: Alexey Sinyuk Date: Thu, 8 Apr 2021 16:59:25 +0300 Subject: [PATCH 41/47] Updated hen version in dependencies --- specs/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/build.gradle b/specs/build.gradle index d199f2e4..ae69d421 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -7,7 +7,7 @@ buildscript { } } dependencies { - classpath "com.cloudbees:hen:1.2.1" + classpath "com.cloudbees:hen:1.3.1" } } @@ -58,7 +58,7 @@ dependencies { testCompile( 'com.athaydes:spock-reports:1.6.0' ) { transitive = false // this avoids affecting your version of Groovy/Spock } - compile("com.cloudbees:hen:1.2.1") { + compile("com.cloudbees:hen:1.3.1") { exclude(group: "org.codehaus.groovy", module: "groovy-all") } From eccc350b99d9c98bd409bc7afadf7b398e673df5 Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Thu, 8 Apr 2021 17:00:36 +0300 Subject: [PATCH 42/47] Revert "Switching default environment to 'v90s'" --- specs/environments/default/docker-compose.yml | 16 ++++++++-------- specs/environments/default/setEnv.sh | 11 +++++++---- specs/environments/default/setEnv_Win.bat | 12 +++++++----- specs/environments/default/systemtest.env | 11 +++++++---- specs/environments/v90nd/setEnv.sh | 11 ----------- specs/environments/v90nd/setEnv_Win.bat | 10 ---------- specs/environments/v90nd/systemtest.env | 11 ----------- .../{v90nd => v90s}/docker-compose.yml | 16 ++++++++-------- specs/environments/v90s/setEnv.sh | 8 ++++++++ specs/environments/v90s/setEnv_Win.bat | 8 ++++++++ specs/environments/v90s/systemtest.env | 8 ++++++++ specs/environments/{v90nd => v90s}/waitForEnv.pl | 0 12 files changed, 61 insertions(+), 61 deletions(-) delete mode 100755 specs/environments/v90nd/setEnv.sh delete mode 100644 specs/environments/v90nd/setEnv_Win.bat delete mode 100644 specs/environments/v90nd/systemtest.env rename specs/environments/{v90nd => v90s}/docker-compose.yml (70%) create mode 100755 specs/environments/v90s/setEnv.sh create mode 100644 specs/environments/v90s/setEnv_Win.bat create mode 100644 specs/environments/v90s/systemtest.env rename specs/environments/{v90nd => v90s}/waitForEnv.pl (100%) diff --git a/specs/environments/default/docker-compose.yml b/specs/environments/default/docker-compose.yml index 98b67b8e..9e579918 100644 --- a/specs/environments/default/docker-compose.yml +++ b/specs/environments/default/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90s" + image: "electricflow/websphere90nd" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8880:8880" - container_name: websphere90s - hostname: "websphere90s" + - "8879:8879" + container_name: websphere90nd + hostname: "websphere90nd" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90s - - RESOURCE_NAME=websphere90s + - EF_RESOURCE_NAME=websphere90nd + - RESOURCE_NAME=websphere90nd - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90sCell01 - - WAS_NODE_NAME=websphere90sNode01 + - WAS_CELL_NAME=websphere90ndCell01 + - WAS_NODE_NAME=websphere90ndNode01 restart: always networks: internal: diff --git a/specs/environments/default/setEnv.sh b/specs/environments/default/setEnv.sh index 56710d4e..25983373 100755 --- a/specs/environments/default/setEnv.sh +++ b/specs/environments/default/setEnv.sh @@ -1,8 +1,11 @@ export WAS_USERNAME="wsadmin" export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90s"; -export WAS_PORT="8880"; +export WAS_HOST="websphere90nd"; +export WAS_PORT="8879"; export WAS_CONNTYPE="SOAP"; export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; \ No newline at end of file +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; +export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; +export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; +export IS_WAS_ND="1"; diff --git a/specs/environments/default/setEnv_Win.bat b/specs/environments/default/setEnv_Win.bat index 25c560e6..6738773a 100644 --- a/specs/environments/default/setEnv_Win.bat +++ b/specs/environments/default/setEnv_Win.bat @@ -1,8 +1,10 @@ set WAS_USERNAME=wsadmin set WAS_PASSWORD=changeme -set WAS_HOST=websphere90s -set WAS_PORT=8880 -set WAS_CONNTYPE=SOAP +set WAS_HOST=websphere90nd +set WAS_PORT=8879 set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh -set WAS_APPPATH=C:\ +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh +set WAS_APPPATH=/var/tmp/ +set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh +set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh +set IS_WAS_ND=1 diff --git a/specs/environments/default/systemtest.env b/specs/environments/default/systemtest.env index 8723ce88..ecdaf5dc 100644 --- a/specs/environments/default/systemtest.env +++ b/specs/environments/default/systemtest.env @@ -1,8 +1,11 @@ WAS_USERNAME="wsadmin" WAS_PASSWORD="changeme"; -WAS_HOST="websphere90s"; -WAS_PORT="8880"; +WAS_HOST="websphere90nd"; +WAS_PORT="8879"; WAS_CONNTYPE="SOAP"; WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; \ No newline at end of file +WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; +WAS_APPPATH="/var/tmp/"; +WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; +WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; +IS_WAS_ND="1" diff --git a/specs/environments/v90nd/setEnv.sh b/specs/environments/v90nd/setEnv.sh deleted file mode 100755 index 25983373..00000000 --- a/specs/environments/v90nd/setEnv.sh +++ /dev/null @@ -1,11 +0,0 @@ -export WAS_USERNAME="wsadmin" -export WAS_PASSWORD="changeme"; -export WAS_HOST="websphere90nd"; -export WAS_PORT="8879"; -export WAS_CONNTYPE="SOAP"; -export WAS_DEBUG="1"; -export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -export WAS_APPPATH="/var/tmp/"; -export WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -export WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -export IS_WAS_ND="1"; diff --git a/specs/environments/v90nd/setEnv_Win.bat b/specs/environments/v90nd/setEnv_Win.bat deleted file mode 100644 index 6738773a..00000000 --- a/specs/environments/v90nd/setEnv_Win.bat +++ /dev/null @@ -1,10 +0,0 @@ -set WAS_USERNAME=wsadmin -set WAS_PASSWORD=changeme -set WAS_HOST=websphere90nd -set WAS_PORT=8879 -set WAS_DEBUG=1 -set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -set WAS_APPPATH=/var/tmp/ -set WAS_START_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh -set WAS_STOP_DM_SCRIPT=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh -set IS_WAS_ND=1 diff --git a/specs/environments/v90nd/systemtest.env b/specs/environments/v90nd/systemtest.env deleted file mode 100644 index ecdaf5dc..00000000 --- a/specs/environments/v90nd/systemtest.env +++ /dev/null @@ -1,11 +0,0 @@ -WAS_USERNAME="wsadmin" -WAS_PASSWORD="changeme"; -WAS_HOST="websphere90nd"; -WAS_PORT="8879"; -WAS_CONNTYPE="SOAP"; -WAS_DEBUG="1"; -WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh"; -WAS_APPPATH="/var/tmp/"; -WAS_START_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/startManager.sh"; -WAS_STOP_DM_SCRIPT="/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/stopManager.sh"; -IS_WAS_ND="1" diff --git a/specs/environments/v90nd/docker-compose.yml b/specs/environments/v90s/docker-compose.yml similarity index 70% rename from specs/environments/v90nd/docker-compose.yml rename to specs/environments/v90s/docker-compose.yml index 9e579918..98b67b8e 100644 --- a/specs/environments/v90nd/docker-compose.yml +++ b/specs/environments/v90s/docker-compose.yml @@ -11,27 +11,27 @@ services: hostname: "efserver" tty: true websphere: - image: "electricflow/websphere90nd" + image: "electricflow/websphere90s" ports: - "7808:7808" - "9060:9060" - "9443:9443" - "9043:9043" - - "8879:8879" - container_name: websphere90nd - hostname: "websphere90nd" + - "8880:8880" + container_name: websphere90s + hostname: "websphere90s" tty: true environment: - EF_SERVER_HOST=efserver - EF_SERVER_ADMIN_USER=admin - EF_SERVER_ADMIN_PASS=changeme - - EF_RESOURCE_NAME=websphere90nd - - RESOURCE_NAME=websphere90nd + - EF_RESOURCE_NAME=websphere90s + - RESOURCE_NAME=websphere90s - ELECTRICFLOW_IP_ADDRESS=efserver - ELECTRICFLOW_USERNAME=admin - ELECTRICFLOW_PASSWORD=changeme - - WAS_CELL_NAME=websphere90ndCell01 - - WAS_NODE_NAME=websphere90ndNode01 + - WAS_CELL_NAME=websphere90sCell01 + - WAS_NODE_NAME=websphere90sNode01 restart: always networks: internal: diff --git a/specs/environments/v90s/setEnv.sh b/specs/environments/v90s/setEnv.sh new file mode 100755 index 00000000..56710d4e --- /dev/null +++ b/specs/environments/v90s/setEnv.sh @@ -0,0 +1,8 @@ +export WAS_USERNAME="wsadmin" +export WAS_PASSWORD="changeme"; +export WAS_HOST="websphere90s"; +export WAS_PORT="8880"; +export WAS_CONNTYPE="SOAP"; +export WAS_DEBUG="1"; +export WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; +export WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90s/setEnv_Win.bat b/specs/environments/v90s/setEnv_Win.bat new file mode 100644 index 00000000..25c560e6 --- /dev/null +++ b/specs/environments/v90s/setEnv_Win.bat @@ -0,0 +1,8 @@ +set WAS_USERNAME=wsadmin +set WAS_PASSWORD=changeme +set WAS_HOST=websphere90s +set WAS_PORT=8880 +set WAS_CONNTYPE=SOAP +set WAS_DEBUG=1 +set WSADMIN_PATH=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh +set WAS_APPPATH=C:\ diff --git a/specs/environments/v90s/systemtest.env b/specs/environments/v90s/systemtest.env new file mode 100644 index 00000000..8723ce88 --- /dev/null +++ b/specs/environments/v90s/systemtest.env @@ -0,0 +1,8 @@ +WAS_USERNAME="wsadmin" +WAS_PASSWORD="changeme"; +WAS_HOST="websphere90s"; +WAS_PORT="8880"; +WAS_CONNTYPE="SOAP"; +WAS_DEBUG="1"; +WSADMIN_PATH="/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh"; +WAS_APPPATH="/var/tmp/"; \ No newline at end of file diff --git a/specs/environments/v90nd/waitForEnv.pl b/specs/environments/v90s/waitForEnv.pl similarity index 100% rename from specs/environments/v90nd/waitForEnv.pl rename to specs/environments/v90s/waitForEnv.pl From 2a82a146b7d8f25318b4f69036d05e87ed13329a Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Thu, 8 Apr 2021 17:01:03 +0300 Subject: [PATCH 43/47] Using all artifacts from single nexus repository --- build.gradle | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index d9e41a23..7310ee9e 100644 --- a/build.gradle +++ b/build.gradle @@ -17,28 +17,8 @@ buildscript { } repositories { + mavenCentral() maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } - - // commander-client:10.2.0-SNAPSHOT - maven { - url 'https://nexus-internal.cloudbees.com/content/groups/mirror/' - credentials { - username = System.getenv('NEXUS_USERNAME') ?: nexusUsername - password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword - } - } - - // gwt-user:2.5.0-ec3, gwt-dev:2.5.0-ec1 - maven { - url 'https://nexus-internal.cloudbees.com/content/repositories/releases/' - credentials { - username = System.getenv('NEXUS_USERNAME') ?: nexusUsername - password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword - } - } - - //commander-sdk:6.1.2 - //ec_internal:6.1.2 maven { url 'https://nexus-internal.cloudbees.com/content/repositories/hosted-releases/' credentials { @@ -50,9 +30,9 @@ repositories { configurations.all { resolutionStrategy { - force group: 'com.electriccloud', name: 'commander-client', version: '10.2.0-SNAPSHOT' - force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.2' - force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.2' + force group: 'com.electriccloud', name: 'commander-client', version: '10.1.0' + force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.2.1' + force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.2.1' force group: 'com.google.gwt', name: 'gwt-user', version: '2.5.0-ec3' force group: 'com.google.gwt', name: 'gwt-dev', version: '2.5.0-ec1' From a31fab47bd4aa0b48e08428e2bd92ad79484e007 Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Thu, 8 Apr 2021 17:07:03 +0300 Subject: [PATCH 44/47] Removing art.nimbus from repositories --- build.gradle | 2 -- specs/build.gradle | 3 --- 2 files changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index 7310ee9e..86152192 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,6 @@ buildscript { repositories { maven { url 'http://dl.bintray.com/ecpluginsdev/maven' } - maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } } dependencies { classpath group: 'com.electriccloud.plugins', name: 'flow-gradle-plugin', version: '2.+' @@ -18,7 +17,6 @@ buildscript { repositories { mavenCentral() - maven { url "http://art.nimbus.beescloud.com/artifactory/jcenter" } maven { url 'https://nexus-internal.cloudbees.com/content/repositories/hosted-releases/' credentials { diff --git a/specs/build.gradle b/specs/build.gradle index 2a815fe7..a6c3a5e3 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -11,9 +11,6 @@ defaultTasks 'test' repositories { mavenCentral() - maven { - url "http://art.nimbus.beescloud.com/artifactory/jcenter" - } maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } From 99aefcde87b01af6cd2fd7825b0f27fb4de8333d Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Thu, 8 Apr 2021 17:11:14 +0300 Subject: [PATCH 45/47] Replacing bintray repo with new nexus mirror --- specs/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/specs/build.gradle b/specs/build.gradle index a6c3a5e3..735fd091 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -14,7 +14,9 @@ repositories { maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } - + maven { + url "https://repo.cloudbees.com/content/repositories/dev-connect" + } // maven { // // Local snapshots // url "http://10.200.1.182:8081/artifactory/libs-snapshot-local" From ceaa885984befc0f7bd5436462814a404c42457b Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Fri, 9 Apr 2021 12:27:34 +0300 Subject: [PATCH 46/47] Replacing bintray repo with new nexus mirror Disabling licenseMain and test tasks --- build.gradle | 34 ++++++++-------------------------- settings.gradle | 3 +++ 2 files changed, 11 insertions(+), 26 deletions(-) create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle index 86152192..a3ed6d97 100644 --- a/build.gradle +++ b/build.gradle @@ -8,26 +8,29 @@ buildscript { repositories { - maven { url 'http://dl.bintray.com/ecpluginsdev/maven' } + mavenCentral() + maven { url 'https://repo.cloudbees.com/content/repositories/dev-connect' } } dependencies { - classpath group: 'com.electriccloud.plugins', name: 'flow-gradle-plugin', version: '2.+' + classpath group: 'com.electriccloud.plugins', name: 'flow-gradle-plugin', version: '2.4' } } repositories { mavenCentral() + maven { url 'https://repo.cloudbees.com/content/repositories/dev-connect' } maven { - url 'https://nexus-internal.cloudbees.com/content/repositories/hosted-releases/' + url 'https://nexus-internal.cloudbees.com/content/groups/mirror' credentials { - username = System.getenv('NEXUS_USERNAME') ?: nexusUsername - password = System.getenv('NEXUS_PASSWORD') ?: nexusPassword + username = nexusUsername + password = nexusPassword } } } configurations.all { resolutionStrategy { + force group: 'com.electriccloud', name: 'ec-test', version: '10.1.0' force group: 'com.electriccloud', name: 'commander-client', version: '10.1.0' force group: 'com.electriccloud', name: 'commander-sdk', version: '6.1.2.1' force group: 'com.electriccloud', name: 'ec_internal', version: '6.1.2.1' @@ -43,31 +46,10 @@ description = 'Plugins : EC-WebSphere' version = '2.9.0' apply plugin: 'flow-gradle-plugin' -apply plugin: 'license' - -license { - header = file ('shortHeader.txt') - exclude "**/project.xml" -} dependencies { testCompile 'junit:junit:[4,)' testCompile 'org.mockito:mockito-core:1.9.5' } -test { - Properties props = new Properties() - - systemProperties['COMMANDER_SERVER'] = "$commanderServer" - systemProperties['PLUGIN_VERSION'] = version - //TODO: load properties for WebSphere - - - testLogging { - // Show that tests are run in the command-line output - events 'started', 'passed' - exceptionFormat = 'full' - } -} - task wrapper(type: Wrapper) { gradleVersion = '2.14' } diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..08cc682c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,3 @@ +// licenseMain - maintenance requires lot of work that will be later just wiped +// test - tests fail with a lot of "Not Implemented" exceptions +startParameter.excludedTaskNames = ['licenseMain', 'test'] \ No newline at end of file From 346d4b96dbb78e08c385b0556d1cdd27fe5bcc79 Mon Sep 17 00:00:00 2001 From: Anton Horodchuk Date: Fri, 9 Apr 2021 12:38:57 +0300 Subject: [PATCH 47/47] Replacing bintray repo with new nexus mirror Updated hen artifact name and version Cleaned build script --- specs/build.gradle | 54 ++++++++----------------------------------- specs/settings.gradle | 1 + 2 files changed, 10 insertions(+), 45 deletions(-) create mode 100644 specs/settings.gradle diff --git a/specs/build.gradle b/specs/build.gradle index ccd45696..bca69e0d 100644 --- a/specs/build.gradle +++ b/specs/build.gradle @@ -1,13 +1,12 @@ buildscript { repositories { mavenCentral() - jcenter() maven { - url "https://dl.bintray.com/ecpluginsdev/maven" + url "https://repo.cloudbees.com/content/repositories/dev-connect" } } dependencies { - classpath "com.cloudbees:hen:1.2.1" + classpath "com.cloudbees.cd.plugins:hen:1.3.1" } } @@ -28,65 +27,30 @@ defaultTasks 'test' repositories { mavenCentral() - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots' - } maven { url "https://repo.cloudbees.com/content/repositories/dev-connect" } -// maven { -// // Local snapshots -// url "http://10.200.1.182:8081/artifactory/libs-snapshot-local" -// } } generateHenClasses { - println System.getenv() pluginName = 'EC-WebSphere' } dependencies { - compile 'org.codehaus.groovy:groovy-all:2.5.5' - compile 'org.spockframework:spock-core:1.1-groovy-2.4' - compile ('com.electriccloud:ec-specs-plugins-core:1.9.2' ) { + implementation 'org.codehaus.groovy:groovy-all:2.5.5' + implementation 'org.spockframework:spock-core:1.1-groovy-2.4' + implementation ('com.electriccloud:ec-specs-plugins-core:1.9.2' ) { exclude(group: "org.codehaus.groovy", module: "groovy-all") } - // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0' - // compile 'com.electriccloud:ec-specs-plugins-core:1.5.0-SNAPSHOT' - compile 'com.jayway.restassured:rest-assured:2.4.0' - testCompile( 'com.athaydes:spock-reports:1.6.0' ) { + implementation 'com.jayway.restassured:rest-assured:2.4.0' + testImplementation( 'com.athaydes:spock-reports:1.6.0' ) { transitive = false // this avoids affecting your version of Groovy/Spock } - compile("com.cloudbees:hen:1.2.1") { + implementation("com.cloudbees.cd.plugins:hen:1.3.1") { exclude(group: "org.codehaus.groovy", module: "groovy-all") } - } - sendAllureReports { projectName = 'ec-websphere' -} - -test { - systemProperty 'com.athaydes.spockframework.report.showCodeBlocks', true - - def server = findProperty('server') ?: findProperty('COMMANDER_SERVER') ?: findProperty('commanderServer') ?: 'localhost' - systemProperties['COMMANDER_SERVER'] = server - def secure = findProperty('secure') ?: findProperty('COMMANDER_SECURE') ?: findProperty('commanderSecure') ?: 1 - systemProperties["COMMANDER_SECURE"] = secure - - testLogging { - showStandardStreams = true - } - outputs.upToDateWhen { false } - systemProperties['EC_SPECS_CLI'] = true - - def destination = findProperty('reportDestination') ?: "spec-report" - // html.destination = destination - - if (destination) { - systemProperty 'com.athaydes.spockframework.report.outputDir', destination - } -} - +} \ No newline at end of file diff --git a/specs/settings.gradle b/specs/settings.gradle new file mode 100644 index 00000000..14f93026 --- /dev/null +++ b/specs/settings.gradle @@ -0,0 +1 @@ +rootProject.name='specs' \ No newline at end of file