# Component Types template

Component types are defined using a YAML manifest with the following structure:

```yaml
# General section
name: function_branin
description: A component type for the branin analytical function

# Parameters section
parameters:
  - name: x1
    domain:
      type: real
      domain: [-5.0, 10.0]
    defaultValue: -5.0
    decimals: 3
    operators:
    FileConfigurator:
      confTemplate: "${value}"

  - name: x2
    domain:
      type: real
      domain: [0.0, 15.0]
    defaultValue: 0.0

  - name: x3
    domain:
      type: categorical
      categories: [cat1,cat2,cat3]
    operators:
    LinuxConfigurator:
      echo:
        file: /sys/class/block/nvme0n1/queue/scheduler

# Metrics section
metrics:
  - name: function_value
```

and properties for the general section:

| Field           | Type   | Value restrictions                                                                                                                                                                                                                             | Is required | Default value | Description                                                                                                                                                                 |
| --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`          | string | <p>should match the following regexp:</p><p><code>^\[a-zA-Z]\[a-zA-Z0-9\_]\*$</code></p><p>that is only letters, number and underscores, no initial number of underscore</p><p>Notice: this should not match the name of another component</p> | Yes         |               | The name of the component.                                                                                                                                                  |
| `description`   | string |                                                                                                                                                                                                                                                | Yes         |               | A description to characterize the component.                                                                                                                                |
| `componentType` | string | notice: this should match the name of an existing component-type                                                                                                                                                                               | Yes         |               | The name of the component-type that defines the type of the component.                                                                                                      |
| `properties`    | object |                                                                                                                                                                                                                                                | No          |               | General custom properties of the component. These properties can be defined freely and usually have the purpose to expose information useful for configuring the component. |

The parameter section describes the relationship between the component type and already defined parameters with the following properties:

| Field                | Type                  | Value restrictions                                                                                                                                                     | Is required | Default value | Description                                                                             |
| -------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------- | --------------------------------------------------------------------------------------- |
| `name`               | string                | It should match the name of an existing parameter.                                                                                                                     | Yes         | -             | The name of the parameter that should be related to the component-type                  |
| `domain->type`       | string                | {real, integer, categorical}                                                                                                                                           | Yes         | -             | The type of domain to be set for the parameter in relationship with the component-type  |
| `domain->domain`     | array of numbers      | <p>The numbers should be either all integers or real numbers(do not omit the " . ") depending on <code>domain->type</code>.</p><p>The size of the array must be 2.</p> | No          | -             | The bounds to be used to define the domain of the parameter. These bounds are inclusive |
| `domain->categories` | array of strings      |                                                                                                                                                                        | No          | -             | The possible categories that the parameter could possess                                |
| `defaultValue`       | string, integer, real | The value must be included in the domain, for real and integer types and must be a value included in the categories                                                    | Yes         | -             | The default value of the parameter                                                      |
| `decimals`           | integer               | \[0-255]                                                                                                                                                               | No          | 5             | The number of decimal digits rendered for this parameter                                |
| `operators`          | object                | The name and the parameters of a supported [workflow operators](https://docs.akamas.io/akamas-docs/3.6/reference/workflow-operators)                                   | Yes         | -             | Specify what operators can be used to apply the parameter                               |

The metric section describes the relationship between the component type and already defined metrics with the following properties:

| Field | Type   | Value restrictions                             | Is required | Default value | Description                                                         |
| ----- | ------ | ---------------------------------------------- | ----------- | ------------- | ------------------------------------------------------------------- |
| name  | string | It should match the name of an existing metric | Yes         |               | The name of the metric that should be related to the component type |

Notice that component type definitions are shared across all the workspaces on the same Akamas installation, and require an account with administrative privileges to manage them.

### Examples

Example of a component for the Cassandra component type:

```yaml
name: Cassandra
description: The Cassandra NoSQL database version 3
parameters:
  - name: cassandra_compactionStrategy
    domain:
      type: categorical
      categories: [A, B]
    defaultValue: A

metrics:
  - name: total_rate
  - name: read_rate
  - name: write_rate
  - name: read_response_time_avg
  - name: read_response_time_p90
  - name: read_response_time_p99
  - name: read_response_time_max
  - name: write_response_time_avg
  - name: write_response_time_p90
  - name: write_response_time_p99
  - name: write_response_time_max
```

Example of a component for the Linux operating component type:

```yaml
name: Linux OS
description: A component type for the Linux Operating System
parameters:
  #CPU Related
  - name: os_cpuSchedMinGranularity
    domain:
      type: integer
      domain: [300000, 30000000]
    defaultValue: 3000000
  - name: os_cpuSchedWakeupGranularity
    domain:
      type: integer
      domain: [400000, 40000000]
    defaultValue: 4000000
  - name: osCpu.schedMigrationCost
    domain:
      type: integer
      domain: [100000, 5000000]
    defaultValue: 500000
  - name: os_CPUSchedChildRunsFirst
    domain:
      type: integer
      domain: [0, 1]
    defaultValue: 0
  - name: os_CPUSchedLatency
    domain:
      type: integer
      domain: [2400000, 240000000]
    defaultValue: 24000000
  - name: os_CPUSchedAutogroupEnabled
    domain:
      type: integer
      domain: [0, 1]
    defaultValue: 1
  - name: os_CPUSchedNrMigrate
    domain:
      type: integer
      domain: [3, 320]
    defaultValue: 32
  #Memory Related
  - name: os_MemorySwappiness
    domain:
      type: integer
      domain: [0, 100]
    defaultValue: 60
  - name: os_MemoryVmVfsCachePressure
    domain:
      type: integer
      domain: [10, 100]
    defaultValue: 100
  - name: os_MemoryVmMinFree
    domain:
      type: integer
      domain: [10240, 1024000]
    defaultValue: 67584
  - name: os_MemoryVmDirtyRatio
    domain:
      type: integer
      domain: [1, 99]
    defaultValue: 10
  - name: os_MemoryTransparentHugepageEnabled
    domain:
      type: categorical
      categories: ['True', 'False']
    defaultValue: 'True'
  - name: os_MemoryTransparentHugepageDefrag
    domain:
      type: categorical
      categories: ['True', 'False']
    defaultValue: 'True'
  - name: os_MemorySwap
    domain:
      type: categorical
      categories: ['True', 'False']
    defaultValue: 'True'
  - name: os_MemoryVmDirtyExpire
    domain:
      type: integer
      domain: [300, 30000]
    defaultValue: 3000
  - name: os_MemoryVmDirtyWriteback
    domain:
      type: integer
      domain: [50, 5000]
    defaultValue: 500

metrics:
  - name: cpu_num
  - name: cpu_util
  - name: mem_util
  - name: load_avg
  - name: swapins
  - name: swapouts
  - name: disk_iops_writes
  - name: disk_iops_reads
  - name: disk_iops_total
  - name: disk_await_worst
  - name: proc_blocked
  - name: context_switch
  - name: tcp_retrans
  - name: tcp_tozerowin
  - name: net_band_rx_bits
  - name: net_band_tx_bits
  - name: network_in_byte_rate
  - name: network_out_byte_rate
  - name: mem_fault_minor
  - name: mem_fault_major
  - name: mem_active_file
  - name: mem_active_anon
  - name: mem_inactive_file
  - name: mem_inactive_anon
```
