diff --git a/README.md b/README.md index 62167d8..6b975f9 100644 --- a/README.md +++ b/README.md @@ -296,6 +296,79 @@ By default, `azpbs` will use `/opt/cycle/pbspro/logging.conf`, as defined in `/o Every `autoscale` iteration, `azpbs` prints out a table of all of the nodes, their resources, their assigned jobs and more. This log contains these values and nothing else. +## Using Altair PBS Professional in CycleCloud + +CycleCloud project for OpenPBS uses opensource version of OpenPBS. You may use your own +[Altair PBS Professional](https://www.altair.com/pbs-professional/) licenses and installers according to your Altair PBS Professional license agreement. +This section documents how to use Altair PBS Professional with the CycleCloud OpenPBS project. + +### Prerequisites + +This example will use the 2022.1.1 version, which has been tested with the template. + +1. Users must provide Altair PBS Professional binaries (the same works with RHEL 8.x with _.el8.x86_64.rpm_) + + * pbspro-client-2022.1.1.el7.x86_64.rpm + * pbspro-execution-2022.1.1.el7.x86_64.rpm + * pbspro-server-2022.1.1.el7.x86_64.rpm + +2. A license server reachable from Azure CycleCloud Altair PBS Professional head node and execution nodes + +3. (Optional to tune avilable versions) The cyclecloud cli must be configured. Documentation is available [here](https://docs.microsoft.com/en-us/azure/cyclecloud/install-cyclecloud-cli) + + +### Copy the binaries into the cloud locker + +To copy the installer with _azcopy_ to the Azure CycleCloud storage account, use the following commands (the same works with RHEL 8.x with _.el8.x86_64.rpm_): + +```bash + +$ azcopy cp pbspro-client-2022.1.1.el7.x86_64.rpm https://.blob.core.windows.net/cyclecloud/blobs/pbspro +$ azcopy cp pbspro-execution-2022.1.1.el7.x86_64.rpm https://.blob.core.windows.net/cyclecloud/blobs/pbspro +$ azcopy cp pbspro-server-2022.1.1.el7.x86_64.rpm https://.blob.core.windows.net/cyclecloud/blobs/pbspro +``` + +### Define license server + +In Altair PBS Professional cluster template, a specific parameter in Advanced Settings allows the definition of license server IP and port. + +### Adding other versions to the cluster template + +Make a local copy of the Altair PBS Professional template and modify it to use other versions of the installers +instead of the default 2022.1.1. + +```bash +wget https://raw.githubusercontent.com/Azure/cyclecloud-pbspro/master/templates/pbspro.txt +``` + +In the _pbspro.txt_ file, locate the `PBSVersion` definition and +insert the desired version in the options. For example for version + +> NOTE: +> The version should match the one in installer file name. + +```ini + [[[parameter PBSVersion]]] + Label = Altair PBS Version + Config.Plugin = pico.form.Dropdown + Config.Entries := {[Label="Altair PBS Pro 2021.1"; Value="2021.1.4"]} + DefaultValue = 2021.1.4 + +``` + +These configs will make the additional versions available in the UI + +### Import the cluster template file + +Using the cyclecloud cli, import a cluster template from the new cluster template file. + +```bash +cyclecloud import_template -f pbspro.txt --force +``` + +Similar to this [tutorial](https://docs.microsoft.com/en-us/azure/cyclecloud/tutorials/modify-cluster-template) in the documentation, new Altair PBS Professional cluster is now available in the *Create Cluster* menu in the UI. + +Configure and create the cluster in the UI, save it, and start it. # Contributing diff --git a/specs/default/chef/site-cookbooks/pbspro/attributes/default.rb b/specs/default/chef/site-cookbooks/pbspro/attributes/default.rb index 040354d..dae2426 100644 --- a/specs/default/chef/site-cookbooks/pbspro/attributes/default.rb +++ b/specs/default/chef/site-cookbooks/pbspro/attributes/default.rb @@ -7,6 +7,10 @@ default[:pbspro][:autoscale_installer] = "cyclecloud-pbspro-pkg-#{node[:pbspro][:autoscale_version]}.tar.gz" default[:pbspro][:cron_method] = "pbs_cron" default[:pbspro][:version] = "20.0.1-0" +default[:pbspro][:license] = "" +default[:pbspro][:professional] = false +default[:pbspro][:pbsdata_uid] = 11100 +default[:pbspro][:pbsdata_gid] = 11100 default[:pbspro][:slots] = nil default[:pbspro][:idle_timeout] = 300 default[:pbspro][:boot_timeout] = 3600 diff --git a/specs/default/chef/site-cookbooks/pbspro/recipes/default.rb b/specs/default/chef/site-cookbooks/pbspro/recipes/default.rb index 89020fd..bebd26e 100644 --- a/specs/default/chef/site-cookbooks/pbspro/recipes/default.rb +++ b/specs/default/chef/site-cookbooks/pbspro/recipes/default.rb @@ -14,4 +14,4 @@ source "#{node['jetpack']['downloads']}/#{hwlocs_lib_el8}" action :install end -end \ No newline at end of file +end diff --git a/specs/default/chef/site-cookbooks/pbspro/recipes/execute.rb b/specs/default/chef/site-cookbooks/pbspro/recipes/execute.rb index 8d79dc5..0c13b77 100644 --- a/specs/default/chef/site-cookbooks/pbspro/recipes/execute.rb +++ b/specs/default/chef/site-cookbooks/pbspro/recipes/execute.rb @@ -10,12 +10,18 @@ platform = node['platform_family'] pbsdist = "el#{plat_ver}" package_name = node[:pbspro][:package] - -if package_name == nil - if pbsprover.to_i < 20 - package_name = "pbspro-execution-#{pbsprover}.x86_64.rpm" - else - package_name = "openpbs-execution-#{pbsprover}.x86_64.rpm" +pbs_professional = node[:pbspro][:professional] + + +if pbs_professional + package_name = "pbspro-execution-#{pbsprover}.#{pbsdist}.x86_64.rpm" +else + if package_name == nil + if pbsprover.to_i < 20 + package_name = "pbspro-execution-#{pbsprover}.x86_64.rpm" + else + package_name = "openpbs-execution-#{pbsprover}.x86_64.rpm" + end end end diff --git a/specs/default/chef/site-cookbooks/pbspro/recipes/login.rb b/specs/default/chef/site-cookbooks/pbspro/recipes/login.rb index 55ccbd5..9a2a9d3 100644 --- a/specs/default/chef/site-cookbooks/pbspro/recipes/login.rb +++ b/specs/default/chef/site-cookbooks/pbspro/recipes/login.rb @@ -7,13 +7,19 @@ pbsprover = node[:pbspro][:version] plat_ver = node['platform_version'].to_i pbsdist = "el#{plat_ver}" +pbs_professional = node[:pbspro][:professional] package_name = node[:pbspro][:package] + if package_name.nil? - if pbsprover.to_i < 20 - package_name = "pbspro-client-#{pbsprover}.x86_64.rpm" + if pbs_professional + package_name = "pbspro-client-#{pbsprover}.#{pbsdist}.x86_64.rpm" else - package_name = "openpbs-client-#{pbsprover}.x86_64.rpm" + if pbsprover.to_i < 20 + package_name = "pbspro-client-#{pbsprover}.x86_64.rpm" + else + package_name = "openpbs-client-#{pbsprover}.x86_64.rpm" + end end end diff --git a/specs/default/chef/site-cookbooks/pbspro/recipes/server.rb b/specs/default/chef/site-cookbooks/pbspro/recipes/server.rb index a3d9d4f..65d3e1d 100644 --- a/specs/default/chef/site-cookbooks/pbspro/recipes/server.rb +++ b/specs/default/chef/site-cookbooks/pbspro/recipes/server.rb @@ -7,6 +7,10 @@ pbsprover = node[:pbspro][:version] plat_ver = node['platform_version'].to_i pbsdist = "el#{plat_ver}" +pbs_professional = node[:pbspro][:professional] +pbsdata_uid = node[:pbspro][:pbsdata_uid] +pbsdata_gid = node[:pbspro][:pbsdata_gid] + cron_method = node[:pbspro][:cron_method] || "pbs_cron" package_name = node[:pbspro][:package] @@ -29,10 +33,14 @@ end if package_name.nil? - if pbsprover.to_i < 20 - package_name = "pbspro-server-#{pbsprover}.x86_64.rpm" + if pbs_professional + package_name = "pbspro-server-#{pbsprover}.#{pbsdist}.x86_64.rpm" else - package_name = "openpbs-server-#{pbsprover}.x86_64.rpm" + if pbsprover.to_i < 20 + package_name = "pbspro-server-#{pbsprover}.x86_64.rpm" + else + package_name = "openpbs-server-#{pbsprover}.x86_64.rpm" + end end end @@ -40,6 +48,22 @@ project 'pbspro' end +if pbs_professional + group 'pbsdata' do + gid pbsdata_gid + system true + end + + user 'pbsdata' do + system true + uid pbsdata_uid + gid 'pbsdata' + manage_home true + home '/home/pbsdata' + shell '/bin/bash' + end +end + if plat_ver < 8 yum_package package_name do source "#{node['jetpack']['downloads']}/#{package_name}" @@ -80,6 +104,17 @@ action [:enable, :start] end +if pbs_professional +pbspro_license = node[:pbspro][:license] + bash 'setup license cyclecloud-pbspro' do + code <<-EOH + /opt/pbs/bin/qmgr -c 'set server pbs_license_info=#{pbspro_license}' + EOH + + action :run + end +end + file "/etc/profile.d/azpbs_autocomplete.sh" do content 'eval "$(/opt/cycle/pbspro/venv/bin/register-python-argcomplete azpbs)" || echo "Warning: Autocomplete is disabled" 1>&2' mode '0755' diff --git a/templates/openpbs.txt b/templates/openpbs.txt index e1b30e0..ee357f7 100644 --- a/templates/openpbs.txt +++ b/templates/openpbs.txt @@ -20,6 +20,7 @@ Autoscale = $Autoscale [[[configuration]]] pbspro.version = $PBSVersion + pbspro.professional = false # For fast spin-up after Deallocate, force an immediate re-converge on boot cyclecloud.converge_on_boot = true diff --git a/templates/pbspro.txt b/templates/pbspro.txt new file mode 100644 index 0000000..2f20077 --- /dev/null +++ b/templates/pbspro.txt @@ -0,0 +1,469 @@ + +################################ +## Cluster Configuration File ## +################################ + +[cluster Altair PBS Professional] +FormLayout = selectionpanel +Category = Schedulers +IconURL="static/cloud/cluster/ui/ClusterIcon/altair-icon.png" + +Autoscale = $Autoscale + + [[node defaults]] + UsePublicNetwork = $UsePublicNetwork + Credentials = $Credentials + ImageName = $ImageName + SubnetId = $SubnetId + Region = $Region + KeyPairLocation = ~/.ssh/cyclecloud.pem + Azure.Identities = $ManagedIdentity + + [[[configuration]]] + pbspro.version = $PBSVersion + pbspro.professional = true + pbspro.pbsdata_uid = 11100 + pbspro.pbsdata_gid = 11100 + pbspro.license = $PBSLicenseServer + # For fast spin-up after Deallocate, force an immediate re-converge on boot + cyclecloud.converge_on_boot = true + + # Disable normal NFS exports and mounts + cyclecloud.mounts.sched.disabled = true + cyclecloud.mounts.shared.disabled = true + cyclecloud.exports.sched.disabled = true + cyclecloud.exports.shared.disabled = true + cyclecloud.exports.sched.samba.enabled = false + cyclecloud.exports.shared.samba.enabled = false + cyclecloud.exports.defaults.samba.enabled = false + cshared.server.legacy_links_disabled = true + + # May be used to identify the ID in cluster-init scripts + cluster.identities.default = $ManagedIdentity + + [[[cluster-init cyclecloud/pbspro:default]]] + Optional = false + + + [[[volume boot]]] + Size = ${ifThenElse(BootDiskSize > 0, BootDiskSize, undefined)} + SSD = True + + [[[configuration cyclecloud.mounts.nfs_shared]]] + type = nfs + mountpoint = /shared + export_path = $NFSSharedExportPath + address = $NFSAddress + options = $NFSSharedMountOptions + + [[[configuration cyclecloud.mounts.nfs_sched]]] + type = nfs + mountpoint = /sched + disabled = $NFSSchedDisable + + [[[configuration cyclecloud.mounts.additional_nfs]]] + disabled = ${AdditionalNAS isnt true} + type = nfs + address = $AdditonalNFSAddress + mountpoint = $AdditionalNFSMountPoint + export_path = $AdditionalNFSExportPath + options = $AdditionalNFSMountOptions + + + [[node server]] + ImageName = $SchedulerImageName + MachineType = $serverMachineType + IsReturnProxy = $ReturnProxy + AdditionalClusterInitSpecs = $serverClusterInitSpecs + + [[[configuration]]] + cyclecloud.mounts.nfs_sched.disabled = true + cyclecloud.mounts.nfs_shared.disabled = ${NFSType != "External"} + pbspro.cron_method = $AzpbsCronMethod + pbspro.queues.workq.ignore = ${Autoscale != true} + pbspro.queues.htcq.ignore = ${Autoscale != true} + + [[[cluster-init cyclecloud/pbspro:server]]] + + [[[network-interface eth0]]] + AssociatePublicIpAddress = $UsePublicNetwork + + [[[input-endpoint ganglia]]] + PrivatePort = 8652 + PublicPort = 8652 + + [[[volume sched]]] + Size = 1024 + SSD = True + Mount = builtinsched + Persistent = False + + [[[volume shared]]] + Size = ${ifThenElse(NFSType == "Builtin", FilesystemSize, 2)} + SSD = True + Mount = builtinshared + Persistent = ${NFSType == "Builtin"} + + [[[configuration cyclecloud.mounts.builtinsched]]] + mountpoint = /sched + fs_type = xfs + + [[[configuration cyclecloud.mounts.builtinshared]]] + disabled = ${NFSType != "Builtin"} + mountpoint = /shared + fs_type = xfs + + [[[configuration cyclecloud.exports.builtinsched]]] + export_path = /sched + options = no_root_squash + samba.enabled = false + type = nfs + + [[[configuration cyclecloud.exports.builtinshared]]] + disabled = ${NFSType != "Builtin"} + export_path = /shared + samba.enabled = false + type = nfs + + + + [[nodearray login]] + InitialCount = $NumberLoginNodes + MachineType = $serverMachineType + + [[[cluster-init cyclecloud/pbspro:login]]] + + [[[configuration]]] + autoscale.enabled = false + + [[nodearray execute]] + MachineType = $ExecuteMachineType + MaxCoreCount = $MaxExecuteCoreCount + + Interruptible = $UseLowPrio + AdditionalClusterInitSpecs = $ExecuteClusterInitSpecs + EnableNodeHealthChecks = $EnableNodeHealthChecks + + + [[[configuration]]] + # setting this completely disables the autoscaler from adding nodes to the cluster + # even manually created nodes. Instead, you can add this to your autoscale.json + # {"pbspro": {"ignore_queues": ["workq", "htcq"]}} + # which is what pbspro.queues.workq.ignore does as well. + # autoscale.enabled = $Autoscale + + [[[cluster-init cyclecloud/pbspro:execute]]] + + [[[network-interface eth0]]] + AssociatePublicIpAddress = $ExecuteNodesPublic + + +[parameters About] +Order = 1 + + [[parameters About Altair PBS Professional]] + + [[[parameter pbspro]]] + HideLabel = true + Config.Plugin = pico.widget.HtmlTemplateWidget + Config.Template = ''' + + + + + +
Altair logo

 

Thank you for trying Altair® PBS Professional®!

Altair® PBS Professional® is a fast, powerful workload manager designed to improve productivity and optimize utilization + and efficiency on-premises or in the cloud. PBS Professional automates job scheduling, management, monitoring, and reporting for an optimized HPC environment + anywhere. Unlock the power of PBS Professional in the cloud for breakthrough results.

+

 

Additional Altair® PBS Professional® Resources:

''' + + +[parameters Required Settings] +Order = 10 + + [[parameters Virtual Machines ]] + Description = "The cluster, in this case, has two roles: the scheduler server-node with shared filer and the execute hosts. Configure which VM types to use based on the requirements of your application." + Order = 20 + + [[[parameter Region]]] + Label = Region + Description = Deployment Location + ParameterType = Cloud.Region + + [[[parameter serverMachineType]]] + Label = Server VM Type + Description = The VM type for scheduler server and shared filer. + ParameterType = Cloud.MachineType + DefaultValue = Standard_D8as_v4 + + [[[parameter ExecuteMachineType]]] + Label = Execute VM Type + Description = The VM type for execute nodes + ParameterType = Cloud.MachineType + DefaultValue = Standard_F2s_v2 + Config.Multiselect = true + + + [[parameters Auto-Scaling]] + Description = "The cluster can autoscale to the workload, adding execute hosts as jobs are queued. To enable this, check the box below and choose the initial and maximum core counts for the cluster." + Order = 30 + + [[[parameter Autoscale]]] + Label = Autoscale + DefaultValue = true + Widget.Plugin = pico.form.BooleanCheckBox + Widget.Label = Start instances automatically. Shutdown is determined by Keep Alive. + + [[[parameter AzpbsCronMethod]]] + Label = Cron Method + DefaultValue = cron + Config.Plugin = pico.form.Dropdown + Config.Entries := {[Label="Cron"; Value="cron"], [Label="PBS Timer Hook"; Value="pbs_hook"]} + Config.Options = cron,pbs_hook + Description = "The method used to run the azpbs cron job. Cron is the default and will run the azpbs cron job 15 seconds. The pbs_hook method will do the same but use PBS built-in timer." + + [[[parameter MaxExecuteCoreCount]]] + Label = Max Cores + Description = The total number of execute cores to start + DefaultValue = 100 + Config.Plugin = pico.form.NumberTextBox + Config.MinValue = 1 + Config.IntegerOnly = true + + [[[parameter UseLowPrio]]] + Label = Low Priority + DefaultValue = false + Widget.Plugin = pico.form.BooleanCheckBox + Widget.Label = Use low priority instances for execute hosts + + [[parameters Networking]] + Order = 40 + + [[[parameter SubnetId]]] + Label = Subnet ID + Description = Subnet Resource Path (ResourceGroup/VirtualNetwork/Subnet) + ParameterType = Azure.Subnet + Required = True + +[parameters Network Attached Storage] +Order = 15 + + + [[parameters Scheduler Mount]] + Order = 5 + [[[parameter About sched]]] + HideLabel = true + Config.Plugin = pico.widget.HtmlTemplateWidget + Config.Template = '''

The directory /sched is a network attached mount and exists in all nodes of the cluster. + It's managed by the scheduler node. + To disable the mount of the /sched directory, and to supply your own for a hybrid scenario, select the checkbox below.''' + Order = 6 + + [[[parameter NFSSchedDisable]]] + HideLabel = true + DefaultValue = false + Widget.Plugin = pico.form.BooleanCheckBox + Widget.Label = External Scheduler + + [[parameters Default NFS Share]] + Order = 10 + [[[parameter About shared]]] + HideLabel = true + Config.Plugin = pico.widget.HtmlTemplateWidget + Config.Template := "

The directory /shared is a network attached mount and exists in all nodes of the cluster. Users' home directories reside within this mountpoint with the base homedir /shared/home.

There are two options for providing this mount:
[Builtin]: The scheduler node is an NFS server that provides the mountpoint to the other nodes of the cluster.
[External NFS]: A network attached storage such as Azure Netapp Files, HPC Cache, or another VM running an NFS server, provides the mountpoint.

Note: the cluster must be terminated for this to take effect.

" + Order = 20 + + [[[parameter NFSType]]] + Label = NFS Type + ParameterType = StringList + Config.Label = Type of NFS to use for this cluster + Config.Plugin = pico.form.Dropdown + Config.Entries := {[Label="External NFS"; Value="External"], [Label="Builtin"; Value="Builtin"]} + DefaultValue = Builtin + + [[[parameter NFSDiskWarning]]] + HideLabel = true + Config.Plugin = pico.widget.HtmlTemplateWidget + Config.Template := "

Warning: switching an active cluster over to NFS will delete the shared disk.

" + Conditions.Hidden := NFSType != "External" + + [[[parameter NFSAddress]]] + Label = NFS IP Address + Description = The IP address or hostname of the NFS server. Also accepts a list comma-separated addresses, for example, to mount a frontend load-balanced Azure HPC Cache. + Config.ParameterType = String + Conditions.Hidden := NFSType != "External" + + [[[parameter NFSSharedExportPath]]] + Label = Shared Export Path + Description = The path exported by the file system + DefaultValue = /shared + Conditions.Hidden := NFSType != "External" + + [[[parameter NFSSharedMountOptions]]] + Label = NFS Mount Options + Description = NFS Client Mount Options + Conditions.Hidden := NFSType != "External" + + [[[parameter FilesystemSize]]] + Label = Size (GB) + Description = The filesystem size (cannot be changed after initial start) + DefaultValue = 100 + + Config.Plugin = pico.form.NumberTextBox + Config.MinValue = 10 + Config.MaxValue = 10240 + Config.IntegerOnly = true + Conditions.Excluded := NFSType != "Builtin" + + [[parameters Additional NFS Mount]] + Order = 20 + [[[parameter Additional NFS Mount Readme]]] + HideLabel = true + Config.Plugin = pico.widget.HtmlTemplateWidget + Config.Template := "

Mount another NFS endpoint on the cluster nodes.

" + Order = 20 + + [[[parameter AdditionalNAS]]] + HideLabel = true + DefaultValue = false + Widget.Plugin = pico.form.BooleanCheckBox + Widget.Label = Add NFS mount + + [[[parameter AdditonalNFSAddress]]] + Label = NFS IP Address + Description = The IP address or hostname of the NFS server. Also accepts a list comma-separated addresses, for example, to mount a frontend load-balanced Azure HPC Cache. + Config.ParameterType = String + Conditions.Excluded := AdditionalNAS isnt true + + [[[parameter AdditionalNFSMountPoint]]] + Label = NFS Mount Point + Description = The path at which to mount the Filesystem + DefaultValue = /data + Conditions.Excluded := AdditionalNAS isnt true + + [[[parameter AdditionalNFSExportPath]]] + Label = NFS Export Path + Description = The path exported by the file system + DefaultValue = /data + Conditions.Excluded := AdditionalNAS isnt true + + [[[parameter AdditionalNFSMountOptions]]] + Label = NFS Mount Options + Description = NFS Client Mount Options + Conditions.Excluded := AdditionalNAS isnt true + + + +[parameters Advanced Settings] +Order = 20 + + [[parameters Azure Settings]] + Order = 10 + + [[[parameter Credentials]]] + Description = The credentials for the cloud provider + ParameterType = Cloud.Credentials + + [[[parameter ManagedIdentity]]] + Label = Managed Id + Description = Optionally assign an Azure user assigned managed identity to all nodes to access Azure resources using assigned roles. + ParameterType = Azure.ManagedIdentity + DefaultValue = =undefined + + [[[parameter BootDiskSize]]] + Description = Optional: Size of the OS/boot disk in GB for all nodes in the cluster (leave at 0 to use Image size) + ParameterType = Integer + Config.Plugin = pico.form.NumberTextBox + Config.MinValue = 0 + Config.MaxValue = 32,000 + Config.IntegerOnly = true + Config.Increment = 64 + DefaultValue = 0 + + + + [[parameters Software]] + Description = "Specify the scheduling software, and base OS installed on all nodes, and optionally the cluster-init and chef versions from your locker." + Order = 10 + + + [[[parameter SchedulerImageName]]] + Label = Scheduler OS + ParameterType = Cloud.Image + Config.OS = linux + DefaultValue = almalinux8 + Config.Filter := Package in {"cycle.image.centos7", "almalinux8"} + + [[[parameter ImageName]]] + Label = Compute OS + ParameterType = Cloud.Image + Config.OS = linux + DefaultValue = almalinux8 + Config.Filter := Package in {"cycle.image.centos7", "almalinux8"} + + [[[parameter PBSVersion]]] + Label = Altair PBS Version + Config.Plugin = pico.form.Dropdown + Config.Entries := {[Label="Altair PBS Pro 2022.1"; Value="2022.1.1"]} + DefaultValue = 2022.1.1 + + [[[parameter PBSLicenseServer]]] + Label = Altair License Server location + Description = Altair License Server location + Required = True + + [[[parameter serverClusterInitSpecs]]] + Label = Server Cluster-Init + DefaultValue = =undefined + Description = Cluster init specs to apply to the server node + ParameterType = Cloud.ClusterInitSpecs + + [[[parameter ExecuteClusterInitSpecs]]] + Label = Execute Cluster-Init + DefaultValue = =undefined + Description = Cluster init specs to apply to execute nodes + ParameterType = Cloud.ClusterInitSpecs + + [[[parameter NumberLoginNodes]]] + Label = Num Login Nodes + DefaultValue = 0 + Description = Number of optional login nodes to create. + Config.Plugin = pico.form.NumberTextBox + Config.MinValue = 0 + Config.MaxValue = 10000 + Config.IntegerOnly = true + + + [[parameters Advanced Networking]] + + [[[parameter ReturnProxy]]] + Label = Return Proxy + DefaultValue = true + ParameterType = Boolean + Config.Label = Use SSH tunnel to connect to CycleCloud (required if direct access is blocked) + + [[[parameter UsePublicNetwork]]] + Label = Public Head Node + DefaultValue = true + ParameterType = Boolean + Config.Label = Access server node from the Internet + + [[[parameter ExecuteNodesPublic]]] + Label = Public Execute + DefaultValue = false + ParameterType = Boolean + Config.Label = Access execute nodes from the Internet + Conditions.Excluded := UsePublicNetwork isnt true + + [[parameters Node Health Checks]] + Description = "Section for configuring Node Health Checks" + Order = 12 + + [[[parameter EnableNodeHealthChecks]]] + Label = Enable NHC tests + DefaultValue = false + Widget.Plugin = pico.form.BooleanCheckBox + Widget.Label = Run Node Health Checks on startup