<?xml version="1.0" encoding="UTF-8"?><!--
- Licensed Materials - Property of IBM* and/or HCL**
- IBM UrbanCode Deploy
- (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved.
- (c) Copyright HCL Technologies Ltd. 2018. All Rights Reserved.
-
- U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by
- GSA ADP Schedule Contract with IBM Corp.
-
- * Trademark of International Business Machines
- ** Trademark of HCL Technologies Limited
-->
<plugin xmlns="http://www.urbancode.com/PluginXMLSchema_v1" xmlns:server="http://www.urbancode.com/PluginServerXMLSchema_v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <header>
    <identifier id="com.ibm.ucd.plugin.zosmf" name="zOSMF" version="10"/>
    <description> The zOSMF plug-in includes deployment activities using IBM® zOS® Management Facility
    </description>
    <tag>Utilities/zOS Utility/zOSMF</tag>
  </header>
  <step-type name="Create Workflow">
    <description>Use this step to create a workflow.</description>
    <properties>
      <property name="workflowName" required="true">
        <property-ui description="A unique name for the workflow up to 100 characters. The name cannot contain the following symbols: less-than (&lt;), greater-than (&gt;), or ampersand (&amp;). Each workflow name must be unique." label="Workflow Name" type="textBox"/>
      </property>
      <property name="generateUniqueName">
        <property-ui default-value="true" description="Indicates whether to append a timestamp to the workflow name. Adding a timestamp ensures the workflow name is unique name. The default is true." label="Generate Unique Name" type="checkBox"/>
      </property>

      <property name="workflowDefinitionFile" required="true">
        <property-ui description="Location of the workflow definition file, which is the primary XML file for the workflow definition. If the workflow definition file resides in a data set member, specify the fully qualified data set name including the member name. Ensure that the data set is cataloged.  If the workflow definition file resides in a z/OS UNIX file, specify the fully qualified path name of the file beginning with the forward slash (/) and including the file name. For example: /usr/lpp/zosmf/V2R1/samples/workflow_sample_automation.xml." label="Workflow Definition File" type="textBox"/>
      </property>
      <property name="system" required="true">
        <property-ui default-value="${p:zosmf.system}" description="The nickname of the system on which the workflow is to be performed. The nickname is a unique name for the system to differentiate it from existing systems that have the same system and sysplex name. The nickname is 1-40 characters long. Valid characters are alphanumeric characters (A-Z, a-z, and 0-9), hyphens (-), and special characters ($ _ # @). Nicknames are case sensitive, for example SYSTEM1 and System1 are unique values." label="System" type="textBox"/>
      </property>
      <property name="owner" required="true">
        <property-ui default-value="${p:zosmf.user}" description="The user ID of the workflow owner. This user can perform the workflow steps or delegate the steps to other users. Specify a valid user ID that is defined to your z/OS security management product installation, such as RACF. A valid user ID consists of one to eight alphanumeric characters (A-Z, a-z, 0-9, #, $, and @)." label="Owner" type="textBox"/>
      </property>
      <property name="assignToOwner">
        <property-ui default-value="true" description="Indicates whether the workflow steps are assigned to the workflow owner when the workflow is created. If this property is set to true steps are assigned to the user ID that is specified on the property owner. If this property is set to false, the workflow steps are left unassigned when the workflow is created. The default is true." label="Assign To Owner" type="checkBox"/>
      </property>
	  <property name="jobStatement">
        <property-ui default-value="${p:zosmf.jobStatement}" description="JOBSTATEMENT" label="Job Statement" type="textAreaBox"/>
      </property>
      <!--
      <property name="startAfterCreate">
        <property-ui label="Start Workflow After Creating" type="checkBox"
          description = "Indicates whether the workflow is started after creating."
          default-value="true"/>
      </property>     -->
      <property name="comments">
        <property-ui default-value="This workflow was created by an UrbanCode Deploy process." description="Specifies any information that you want to associate with the creation of this workflow. The comment can contain up to 500 characters. This information is recorded in the workflow history." label="Comments" type="textAreaBox"/>
      </property>
      <property name="variableInputFile">
        <property-ui description="The name of an optional properties file that contains values for one or more of the variables that are defined in the workflow definition file. If the workflow variable input file resides in a data set member, specify the fully qualified data set name including the member name. Ensure that the specified data set is cataloged. If the workflow variable input file resides in a z/OS UNIX file, specify the fully qualified path name of the file beginning with the forward slash (/) and including the file name. See the zOSMF documetation, for the format of the variable input file." label="Variable Input File" type="textBox"/>
      </property>
      <property name="variables">
        <property-ui default-value="[{&quot;name&quot;:&quot;user_name&quot;,&quot;value&quot;:&quot;IBMUSER&quot;} {&quot;name&quot;:&quot;file_name&quot;,&quot;value&quot;:&quot;textfile.txt&quot;}]" description="A list of one or more variables for this workflow. The variables specified on this property has precedence over the variables that are specified in the workflow variable input file. Specify this property as an array of name-value objects." label="Variables" type="textAreaBox"/>
      </property>
      <property name="resolveGlobalConflictByUsing">
        <property-ui description="On creation of the workflow, z/OSMF determines whether any of the variables that are supplied in this request (through the variable input file or variables array) would conflict with existing global variables in the Workflows task. In such cases, this property specifies which version of the variable is used, as follows: When set to input, the global variable conflicts are overridden by the variables in specified input file. The global variable value is updated with the input variable value. Use caution with this setting; your selection will affect any other workflows that refer to the same global variable. When set to global, or omitted, the variable value supplied with the request (through the variable input file or variables array) is ignored and the current global value is used. The default is global." label="Resolve Global Conflict By Using" type="textBox"/>
      </property>
      <property name="printRESTLOG">
            <property-ui default-value="false" description="Indicates if REST call requests and responses are printed to the log file. The default is REST calls are not put into the log file." label="Print REST call in log" type="checkBox"/>
          </property>

      <!-- hidden properties -->
      <property name="baseurl" required="true">
        <property-ui default-value="${p:zosmf.url}" description="The URL to access the zOSMF REST API. For example: https://myhost:443/." hidden="true" label="zOSMF URL" type="textBox"/>
      </property>
      <property name="untrustedSSL">
            <property-ui default-value="true" description="Indicates whether HTTPS calls to sites with untrusted certifications will not fail or fail. The default value is will not fail." hidden="true" label="Allow Untrusted SSL Certs" type="checkBox"/>
          </property>
      <property name="userid" required="true">
        <property-ui default-value="${p:zosmf.user}" hidden="true" label="User Name" type="textBox"/>
      </property>
      <property name="password" required="true">
        <property-ui default-value="${p:zosmf.password}" hidden="true" label="Password" type="secureBox"/>
      </property>
  </properties>
    <!-- This is the standard post processing script. It sets the step to Success if the exit code
    of the process was 0. Otherwise, the step fails. In order for a step to run correctly, it must
    have a post processing script and that post processing script must set the status property
    based off of the exit code. -->
    <post-processing><![CDATA[
        if (properties.get("exitCode") != 0) {
            properties.put(new java.lang.String("Status"), new java.lang.String("Failure"));
        }
        else {
            properties.put("Status", "Success");
        }
     ]]></post-processing>
    <!--The syntax of the command element is such that each argument goes on its own line.
    The arg attribute can be "value", "path", or "file".  -->
   <command program="${GROOVY_HOME}/bin/groovy">
      <arg value="-cp"/>
      <arg path="classes:${PLUGIN_HOME}/lib/*"/>
      <arg file="create_workflow.groovy"/>
      <arg file="${PLUGIN_INPUT_PROPS}"/>
      <arg file="${PLUGIN_OUTPUT_PROPS}"/>
    </command>
  </step-type>

  <step-type name="Start Workflow">
    <description>Use this step to start a workflow.</description>
  <properties>
      <property name="workflowKey" required="true">
        <property-ui default-value="${p:zosmf.workflowKey}" description="The workflow key of the workflow to be started." label="Workflow Key" type="textBox"/>
      </property>
      <property name="stepName">
        <property-ui description="The name of the step at which automation is to begin. If this property is omitted, automation processing begins with the first step in the workflow." label="Step Name" type="textBox"/>
      </property>
      <property name="performSubsequent">
        <property-ui default-value="true" description="If the workflow contains any subsequent automated steps, this property indicates whether z/OSMF is to perform the steps. If you set this property to true z/OSMF attempts to perform the automated steps. If you set this property to false, z/OSMF attempts to perform the specified step only. The default is true." label="Perform Subsequent" type="checkBox"/>
      </property>
      <property name="resolveConflictByUsing">
        <property-ui description="Indicates how variable conflicts are to be handled when the Workflows task reads in the output file from a step that runs a REXX exec or UNIX shell script. The following values are valid for this parameter: outputFileValue, existingValue, and leaveConflict. Specify the outputFileValue value to allow the output file values to override the existing values. This setting applies to instance variables only. Global variables are not overridden by variables in the output file. The existingValue value indicate that existing variables values instead of the output file values. The leaveConflict value indicates that the automation is stopped and the user must resolve the conflict manually. The default value is outputFileValue." label="Resolve Conflict By Using" type="textBox"/>
      </property>
      <property name="notificationUrl">
        <property-ui description="A notification URL (up to 2000 characters). Depending on the requirements of your application, you might want to receive a notification when the automated step or steps reach an end state (either completion or failure). Suppose, for example, that your application includes a servlet that is to be given control on completion of the automated steps. If so, you can optionally specify a notification URL to be posted when automation ends. See the zOSMF online document for more details. " label="Notification URL" type="textAreaBox"/>
      </property>
      <property name="waitForWorkflow">
        <property-ui default-value="true" description="Indicates whether to wait for the workflow to complete. The amount of time to wait is specifiedin the Timeout property. If not on, the value on the Timeout property is ignored." label="Wait For Workflow" type="checkBox"/>
      </property>
      <property name="timeout">
        <property-ui default-value="120" description="The timeout value in seconds for a wait. The default is 120 seconds.." label="Timeout" type="textBox"/>
      </property>

      <property name="printRESTLOG">
            <property-ui default-value="false" description="Indicates to send REST call requests and responses to the log. The default is no." label="Print REST log" type="checkBox"/>
      </property>
      <property name="printJOBLOG">
            <property-ui default-value="true" description="Indicates to print the Job log file. All jobs submitted during the workflow execution time are fetched including jobs which are not submitted by the workflow. To avoid showing jobs not submitted by the workflow, you may configure z/OSMF workflow to use a unique job name and then use the Job Filter to exclude other jobs." label="Print Job Log" type="checkBox"/>
      </property>
      <property name="outputJOBLOG">
            <property-ui default-value="false" description="Indicates if the job log file is stored based on the zosmf.workflowJoblog step output property. The default is no." label="Write Job Log to Output" type="checkBox"/>
      </property>
      <property name="jobPrefix">
           <property-ui default-value="IZU*" description="The value to add as a prefix to the job name. The defaults is and askrick(*). Folded to uppercase. The value cannot exceed eight characters." label="Job Prefix" type="textBox"/>
      </property>
      <property name="jobOwner">
           <property-ui default-value="" description="The user ID of the job owner whose jobs are being queried. The default is the z/OS user ID. Folded to uppercase. The value cannot exceed eight characters." label="Job Owner" type="textBox"/>
      </property>
      <!--property name="jobID">
           <property-ui default-value="" description="Job ID. Folded to uppercase; cannot exceed eight characters." label="Job ID" type="textBox"/>
      </property-->
      <property name="ddnameFilter">
           <property-ui default-value="*" description="One or more output ddname filters. Separate multiple filters with new lines. Wildcard * and ? are supported." label="Output DDName Filter" type="textAreaBox"/>
      </property>
      <property name="cutOff">
           <property-ui default-value="1000" description="The maximum number of records to be displayed for each output data set. Specify 0 to display the full content. The default is 1000." label="Max Lines" type="textBox"/>
      </property>

      <!-- hidden properties -->
      <property name="baseurl" required="true">
        <property-ui default-value="${p:zosmf.url}" description="The URL to access the zOSMF REST API. For example: https://myhost:443/." hidden="true" label="zOSMF URL" type="textBox"/>
      </property>
      <property name="untrustedSSL">
            <property-ui default-value="true" description="If checked, HTTPS calls to sites with untrusted certifications will not fail." hidden="true" label="Allow Untrusted SSL Certs" type="checkBox"/>
          </property>
      <property name="userid" required="true">
        <property-ui default-value="${p:zosmf.user}" hidden="true" label="User Name" type="textBox"/>
      </property>
      <property name="password" required="true">
        <property-ui default-value="${p:zosmf.password}" hidden="true" label="Password" type="secureBox"/>
      </property>
  </properties>
    <!-- This is the standard post processing script. It sets the step to Success if the exit code
    of the process was 0. Otherwise, the step fails. In order for a step to run correctly, it must
    have a post processing script and that post processing script must set the status property
    based off of the exit code. -->
    <post-processing><![CDATA[
        if (properties.get("exitCode") != 0) {
            properties.put(new java.lang.String("Status"), new java.lang.String("Failure"));
        }
        else {
            properties.put("Status", "Success");
        }
     ]]></post-processing>
    <!--The syntax of the command element is such that each argument goes on its own line.
    The arg attribute can be "value", "path", or "file".  -->
   <command program="${GROOVY_HOME}/bin/groovy">
      <arg value="-cp"/>
      <arg path="classes:${PLUGIN_HOME}/lib/*:."/>
      <arg file="start_workflow.groovy"/>
      <arg file="${PLUGIN_INPUT_PROPS}"/>
      <arg file="${PLUGIN_OUTPUT_PROPS}"/>
    </command>
  </step-type>
  
  <step-type name="Run Published Software Service Template">
    <description>Use this step to define the input properties for the Run Published Software Service template.</description>
    <properties>
      <property name="templateName" required="true">
        <property-ui description="The name of the software services template to run." label="Template Name" type="textBox"/>
      </property>

      <property name="domainName" required="false">
        <property-ui default-value="" description="The domain name for the specified template. This property is required if the user has consumer authorization to more than one domain with the template name." label="Domain Name " type="textBox"/>
      </property>
      <property name="tenantName" required="false">
        <property-ui default-value="" description="The name of the tenant for the specified template. This property is required if the user has consumer authorization to more than one tenant in the same domain that contains the template name." label="Tenant Name" type="textBox"/>
      </property>
      <property name="userDataId" required="false">
        <property-ui default-value="" description="The ID for the user data specified with user-data. Passed into the software services registry." label="User Data ID" type="textBox"/>
      </property>
      <property name="userData" required="false">
        <property-ui default-value="" description="User data that is passed into the software services registry. Can be specified only if user-data-id is provided." label="User Data" type="textBox"/>
      </property>
      <property name="accountInfo" required="false">
        <property-ui default-value="" description="The account information to use in the JCL JOB statement. The default is the account information that is associated with the resource pool for the tenant." label="Account Info" type="textBox"/>
      </property>
      <property name="systemsNicknames" required="false">
        <property-ui default-value="" description="Each string is the nickname of the system upon which to provision the software service defined by the template. The field is required if the resource pool associated with the tenant used for this operation is not set up to automatically select a system. Only one nickname is allowed. If the field is provided it is validated." label="Systems Nicknames" type="textBox"/>
      </property>
      <property name="inputProperties" required="false">
        <property-ui default-value="" description="A list of variable each separated by a new line. Specify each variable in the following format: name=value." label="Input Variables" type="textAreaBox"/>
      </property>
      
      <!-- execution -->
      <property name="waitForWorkflow">
        <property-ui default-value="true" description="Indicates to wait for the provision to complete. The default is to wait for the provision to complete. If this property is not enabled, the value on the Timeout property is ignored." label="Wait For Provision" type="checkBox"/>
      </property>
      <property name="timeout">
        <property-ui default-value="120" description="The number of seconds to wait. The default value is 120." label="Timeout" type="textBox"/>
      </property>

      <property name="printRESTLOG">
            <property-ui default-value="false" description="Indicates if REST call requests and responses are printed to the log file. The default is no." label="Print REST log" type="checkBox"/>
      </property>
      <property name="printJOBLOG">
            <property-ui default-value="true" description="Indicates if the job log file is printed. All jobs submitted during the workflow execution time are fetched including jobs which are not submitted by the workflow. To avoid showing jobs not submitted by the workflow, you may configure z/OSMF workflow to use a unique job name and then use the Job Filter to exclude other jobs." label="Print Job Log" type="checkBox"/>
      </property>
      <property name="outputJOBLOG">
            <property-ui default-value="false" description="If checked, Job log is stored to step output property zosmf.workflowJoblog" label="Write Job Log to Output" type="checkBox"/>
      </property>
      <property name="jobPrefix">
           <property-ui default-value="IZU*" description="The prefix to add to the job name prefix. The default value is an askrick(*). Folded to uppercase; cannot exceed eight characters." label="Job Prefix" type="textBox"/>
      </property>
      <property name="jobOwner">
           <property-ui default-value="" description="The job owner user ID whose jobs are being queried; the default is the z/OS user ID. Folded to uppercase. The value cannot exceed eight characters." label="Job Owner" type="textBox"/>
      </property>
      <property name="ddnameFilter">
           <property-ui default-value="*" description="A list of one or more output ddname filters. Separate multiple filters with new lines. Wildcard * and ? are supported." label="Output DDName Filter" type="textAreaBox"/>
      </property>
      <property name="cutOff">
           <property-ui default-value="1000" description="The maximum number of records to display for each output data set. Specify 0 to display the full content. The default value is 1000." label="Max Lines" type="textBox"/>
      </property>      

      <!-- hidden properties -->
      <property name="baseurl" required="true">
        <property-ui default-value="${p:zosmf.url}" description="The URL to access zOSMF REST API. e.g. https://myhost:443/" hidden="true" label="zOSMF URL" type="textBox"/>
      </property>
      <property name="untrustedSSL">
            <property-ui default-value="true" description="If checked, HTTPS calls to sites with untrusted certifications will not fail." hidden="true" label="Allow Untrusted SSL Certs" type="checkBox"/>
          </property>
      <property name="userid" required="true">
        <property-ui default-value="${p:zosmf.user}" hidden="true" label="User Name" type="textBox"/>
      </property>
      <property name="password" required="true">
        <property-ui default-value="${p:zosmf.password}" hidden="true" label="Password" type="secureBox"/>
      </property>
  </properties>
    <!-- This is the standard post processing script. It sets the step to Success if the exit code
    of the process was 0. Otherwise, the step fails. In order for a step to run correctly, it must
    have a post processing script and that post processing script must set the status property
    based off of the exit code. -->
    <post-processing><![CDATA[
        if (properties.get("exitCode") != 0) {
            properties.put(new java.lang.String("Status"), new java.lang.String("Failure"));
        }
        else {
            properties.put("Status", "Success");
        }
     ]]></post-processing>
    <!--The syntax of the command element is such that each argument goes on its own line.
    The arg attribute can be "value", "path", or "file".  -->
   <command program="${GROOVY_HOME}/bin/groovy">
      <arg value="-cp"/>
      <arg path="classes:${PLUGIN_HOME}/lib/*:."/>
      <arg file="run_published_software_service_template.groovy"/>
      <arg file="${PLUGIN_INPUT_PROPS}"/>
      <arg file="${PLUGIN_OUTPUT_PROPS}"/>
    </command>
  </step-type>  


  <!-- ============================================= -->
  <!-- z/OSMF Software Services Instance Discovery   -->
  <!-- ============================================= -->
  <step-type name="Software Services Instance Discovery">
    <description>Use this step to discover all the software instances. Also use to create resources for each software instance under a root resource, apply the correct role, and set the properties.</description>
    <properties>
      <property name="query">
        <server:property-ui default-value="${p?:zosmf.query}" description="A list of one or more query variables. Check the z/OSMF List the software services instances REST API for a list of valid query parameters" hidden="false" label="Query Parameters" type="textAreaBox"/>
      </property>
      <property name="zOSMFURL">
        <server:property-ui default-value="${p?:resource/zosmf.url}" description="The URL to access the zOSMF REST API." hidden="true" label="zOSMF URL" type="textBox"/>
      </property>
      <property name="user">
        <server:property-ui default-value="${p?:resource/zosmf.user}" description="The zOSMF user to use." hidden="true" label="zOSMF User" type="textBox"/>
      </property>
      <property name="password">
        <server:property-ui default-value="${p?:resource/zosmf.password}" description="The zOSMF password to use." hidden="true" label="zOSMF Password" type="secureBox"/>
      </property>
      <property name="resourcePath">
        <server:property-ui default-value="${p?:resource.path}" description="The Resource to configure." hidden="true" label="Resource" type="textBox"/>
      </property>
    </properties>
    <post-processing><![CDATA[
        if (properties.get("exitCode") != 0) {
            properties.put(new java.lang.String("Status"), new java.lang.String("Failure"));
        }
        else {
            properties.put("Status", "Success");
        }
     ]]></post-processing>
    <command program="${GROOVY_HOME}/bin/groovy">
      <arg value="-cp"/>
      <arg path="classes:${PLUGIN_HOME}/lib/*:."/>
      <arg file="zosmfSoftwareServicesInstanceDiscovery.groovy"/>
      <arg file="${PLUGIN_INPUT_PROPS}"/>
      <arg file="${PLUGIN_OUTPUT_PROPS}"/>
    </command>

    <server:role>zOSMFService</server:role>
    <server:type>AUTO_CONFIGURE</server:type>
  </step-type>

  <!-- ============================================= -->
  <!-- z/OSMF Discovery                            -->
  <!-- ============================================= -->

  <step-type name="zOSMF Cloud Provisioning Discovery">
    <description>Use this step to discover if the zOSMF service is available by checking the URL specified in zosmf.url agent property. If it is available, the zOSMFService role is assigned to the resource and the properties are set.</description>
    <properties>
      <property name="resourcePath">
        <server:property-ui default-value="${p:resource.path}" description="The Resource to configure." hidden="true" label="Resource" type="textBox"/>
      </property>
      <property name="zOSMFURL">
        <server:property-ui default-value="${p?:agent/zosmf.url}" type="textBox"/>
      </property>
      <property name="sysUser">
        <server:property-ui default-value="${p?:agent/sys.user.name}" type="textBox"/>
      </property>
    </properties>
    <post-processing><![CDATA[
        if (properties.get("exitCode") != 0) {
            properties.put(new java.lang.String("Status"), new java.lang.String("Failure"));
        }
        else {
            properties.put("Status", "Success");
        }
     ]]></post-processing>
    <command program="${GROOVY_HOME}/bin/groovy">
      <arg value="-cp"/>
      <arg path="classes:${PLUGIN_HOME}/lib/*:."/>
      <arg file="zosmfDiscovery.groovy"/>
      <arg file="${PLUGIN_INPUT_PROPS}"/>
      <arg file="${PLUGIN_OUTPUT_PROPS}"/>
    </command>

    <server:type>AUTO_DISCOVERY</server:type>
  </step-type>
  
  <!-- ============================================= -->
  <!-- zOSMF Service Role                            -->
  <!-- ============================================= -->
  <server:property-group default-name-property="zosmf.service" name="zOSMFService" type="ResourceRole">
    <server:description>
       Role for resources that represent zOSMF Service.
    </server:description>
    <server:property name="zosmf.url">
        <server:property-ui default-value="https://localhost/"  description="The URL to access the zOSMF REST API. zosmf.url" label="zOSMF URL" type="textBox"/>
    </server:property>
    <server:property name="zosmf.user">
       <server:property-ui default-value="" description="The zOSMF user to use. zosmf.user" label="zOSMF User" type="textBox"/>
    </server:property>
    <server:property name="zosmf.password">
       <server:property-ui default-value="" description="The zOSMF password associate with the specified user." label="zOSMF Password" type="secureBox"/>
    </server:property>
    <server:property name="zosmf.query">
       <server:property-ui default-value="" description="A list of one or more query variables. Check the z/OSMF List the software services instances REST API for a list of valid query parameters. zosmf.query" label="zOSMF Query" type="textAreaBox"/>
    </server:property>      
    <server:property name="zosmf.zosmf_hostname">
       <server:property-ui default-value="" description="The hostname or the IP address of the z/OS system on which z/OSMF is installed. zosmf.zosmf_hostname" label="zOSMF Hostname " type="textBox"/>
    </server:property>
    <server:property name="zosmf.zosmf_port">
       <server:property-ui default-value="" description="The port number for SSL encrypted traffic for the active instance of z/OSMF on the z/OS system. zosmf.zosmf_port" label="zOSMF Port" type="textBox"/>
    </server:property>    
    <server:property name="zosmf.zosmf_version">
       <server:property-ui default-value="" description="The z/OSMF level. zosmf.zosmf_version" label="zOSMF Version" type="textBox"/>
    </server:property>    
    <server:property name="zosmf.zos_version">
       <server:property-ui default-value="" description="The z/OS operating system level. zosmf.zos_version" label="zOS Version " type="textBox"/>
    </server:property>    
    <server:property name="zosmf.api_version">
       <server:property-ui default-value="" description="The version of the z/OSMF information retrieval service and the JSON object structure used for this request. The version sequence starts at 1, and is incremented if the service or the JSON structure changes. zosmf.api_version" label="zOSMF API Version" type="textBox"/>
    </server:property>    
    <server:property name="zosmf.zosmf_saf_realm">
       <server:property-ui default-value="" description="The realm associated with the system on which z/OSMF is installed. Usually, this is the sysplex name. zosmf.zosmf_saf_realm" label="zOSMF SAF Realm" type="textBox"/>
    </server:property>    
    <server:property name="zosmf.zosmf_full_version">
       <server:property-ui default-value="" description="The z/OSMF version qualified by a service level. zosmf.zosmf_full_version" label="zOSMF Full Version" type="textBox"/>
    </server:property>    
  </server:property-group>

  <!-- ============================================= -->
  <!-- zOSMF Software Instance Role                  -->
  <!-- ============================================= -->
  <server:property-group  default-name-property="instance.external-name" name="zOSMFSoftwareInstance" type="ResourceRole">
    <server:description>
       Role for resources that represent a software instance.
    </server:description>
    <server:property name="instance.external-name">
       <server:property-ui description="The external name of the software services instance. instance.external-name" label="External Name" type="textBox"/>
    </server:property>
    <server:property name="instance.object-name">
       <server:property-ui description="The object name for the software services instance. instance.object-name" label="Object Name" type="textBox"/>
    </server:property>
    <server:property name="instance.object-id">
       <server:property-ui description="The object ID for the software services instance. instance.object-id" label="Object ID" type="textBox"/>
    </server:property>
    <server:property name="instance.type">
       <server:property-ui description="The type of software instance." label="Type" type="textBox"/>
    </server:property>
    <server:property name="instance.state">
       <server:property-ui description="The current state of the software. instance.state" label="State" type="textBox"/>
    </server:property>
    <server:property name="instance.last-action-name">
       <server:property-ui description="The name of the last action that was performed. instance.last-action-name" label="Last Action Name" type="textBox"/>
    </server:property>
    <server:property name="instance.last-action-state">
       <server:property-ui description="The state of the last action that was performed. instance.last-action-state" label="Last Action State" type="textBox"/>
    </server:property>
    <server:property name="instance.domain-name">
       <server:property-ui description="The name of the domain. instance.domain-name" label="Domain Name" type="textBox"/>
    </server:property>
    <server:property name="instance.tenant-name">
       <server:property-ui description="The name of the tenant. instance.tenant-name" label="Tenant Name" type="textBox"/>
    </server:property>
    <server:property name="instance.created-time">
       <server:property-ui description="The time the object was created. The time is in the ISO8601 format. instance.created-time" label="Created On" type="textBox"/>
    </server:property>
    <server:property name="instance.created-by-user">
       <server:property-ui description="The user ID that created the object. instance.created-by-user" label="Created By" type="textBox"/>
    </server:property>
  </server:property-group>
</plugin>