MetalSoft Extensions

Available since 6.4

Extensions are a mechanism to extend the functionality of MetalSoft beyond what is provided out-of-the-box.

Currently there is only a single type of extension, the ‘app’ extension that adds a custom button in the Infrastructure Editor.

Creation Lifecycle:

  1. The user clicks the button and a custom form is shown with inputs defined in the yaml file in the inputs field:

  1. The instance arrays are created according to the yaml specification

  2. Upon Deploy the resources are deployed and the oncreate entrypoint is executed

Update lifecycle

  1. The user clicks the infrastructure elements and a form is opened allowing the user to change any of the input params.

  2. Upon deploy additional resources are deployed as needed and the onedit entrypoint is executed

Delete lifecycle

  1. The user clicks the delete button in the infrastrucure editor form associated with the button

  2. Upon deploy the ondelete entrypoint is executed and then all resources are released

id: 1
name: Incus Demo
label: incus-demo-1
description: Extension description
status: draft
definition:
    kind: ExtensionDefinition
    schemaVersion: "1.1"
    name: Incus Platform
    label: incus
    extensionType: incus-app
    vendor: MetalSoft
    extensionVersion: "1.0"
    description: Enables the automatic deployment of private and shared incus clusters. Latest supported version is 6.4.
    icon: none
    dependencies:
        controllerVersion: 6.4+
        osTemplates:
            - ubuntu-24-04
    inputs:
        - label: compute_nodes
          name: Compute nodes count
          inputType: ExtensionInputInteger
          options:
            minValue: 1
            maxValue: 100
            deniedValues:
                - 2
                - 4
        - label: compute_nodes_type
          name: Compute nodes type
          inputType: ExtensionInputServerType
          options: {}
        - label: instance_array_name
          name: Name of the Incus instance array
          inputType: ExtensionInputString
          options: {}
        - label: compute_nodes_os_template
          name: Compute nodes OS template
          inputType: ExtensionInputOsTemplate
          options:
            osFamily: Linux
        - label: vars_debugging_enabled
          name: Variables debugging enabled
          inputType: ExtensionInputBoolean
          options: {}
        - label: cluster_enabled
          name: Cluster enabled
          inputType: ExtensionInputBoolean
          options: {}
        - label: branch_release
          name: Name of the release branch
          inputType: ExtensionInputString
          options: {}
        - label: ui_installing
          name: UI installing
          inputType: ExtensionInputBoolean
          options: {}
        - label: storage_driver
          name: Name of the storage driver
          inputType: ExtensionInputString
          options: {}
        - label: separate_api_and_cluster_traffic
          name: Separate the API and cluster traffic
          inputType: ExtensionInputBoolean
          options: {}
        - label: images_auto_update_interval
          name: The interval to auto update the images
          inputType: ExtensionInputInteger
          options: {}
    outputs: []
    infrastructure:
        instanceArrays:
            - label: '#/input/instance_array_name'
              instanceCount: '#/input/compute_nodes'
              serverType: '#/input/compute_nodes_type'
              osTemplate: '#/input/compute_nodes_os_template'
              customVariables:
                - name: vars_debugging_enabled
                  value: '#/input/vars_debugging_enabled'
                - name: cluster_enabled
                  value: '#/input/cluster_enabled'
                - name: branch_release
                  value: '#/input/branch_release'
                - name: ui_installing
                  value: '#/input/ui_installing'
                - name: storage_driver
                  value: '#/input/storage_driver'
                - name: separate_api_and_cluster_traffic
                  value: '#/input/separate_api_and_cluster_traffic'
                - name: images_auto_update_interval
                  value: '#/input/images_auto_update_interval'
    assets:
        - label: my_ansible_bundle_1
          name: The Incus Ansible bundle
          assetType: AnsibleBundle
          url: https://repo.metalsoft.io/.extensions_ms/incus-v1alpha1.zip
    onCreate:
        postDeploy:
            - label: createStep
              taskType: ExtensionTaskAnsible
              options:
                asset: my_ansible_bundle_1
                playbook: deploy.yaml
    onEdit:
        postDeploy:
            - label: scaleStep
              taskType: ExtensionTaskAnsible
              options:
                asset: my_ansible_bundle_1
                playbook: scale.yaml
            - label: updateStep
              taskType: ExtensionTaskAnsible
              options:
                asset: my_ansible_bundle_1
                playbook: upgrade.yaml
              

To manage the extensions a series of CLI commands are provided:

extension list - Lists all extensions.
extension get - Get extension.
extension create - Create extension.
extension edit - Update extension.
extension archive - Archive extension.
extension publish - Publish extension.

It is not possible to delete an extension, only to archive it. Publishing an extension will allow users other than the owner to deploy it.

Additionally a series of commands are provided to manipulate extension instances which are instances of the extension, deployed by users.