# Creating custom optimization packs

To create a custom optimization pack, the following fixed directory structure and several YAML manifests need to be created.

#### Optimization pack directory structure <a href="#directory-structure" id="directory-structure"></a>

```
my_dir
  | optimizationPack.yaml
  | component-types
           | componentType1.yaml
  | metrics
           | metricsGroup1.yaml
  | parameters
           | parametersGroup1.yaml
  | telemetry-providers
           | provider1.yaml
```

#### Optimization pack manifest <a href="#optimization-pack-manifest" id="optimization-pack-manifest"></a>

The `optimizationPack.yaml` file is the manifest of the optimization pack to be created, which should always be named `optimizationPack` and have the following structure:

```yaml
name: My Pack
description: An optimization pack to optimize a custom framework
version: 0.0.1
tags: [Apache, Framework]
weight: 1
```

| Field         | Type            | Value restrictions                     | Is required | Default value  | Description                                                                                    |
| ------------- | --------------- | -------------------------------------- | ----------- | -------------- | ---------------------------------------------------------------------------------------------- |
| `name`        | string          | It should not contain spaces.          | TRUE        |                | The name of the optimization pack.                                                             |
| `description` | string          |                                        | TRUE        |                | A description to characterize the optimization pack.                                           |
| `weight`      | integer         | weight > 0                             | TRUE        |                | A weight to be associated to the optimization pack. This field is used for licensing purposes. |
| `version`     | string          | It should match the regexp: `\d.\d.\d` | TRUE        |                | The version of the optimization pack.                                                          |
| `tags`        | array of string |                                        | FALSE       | An empty array | A set of tags to make the optimization pack more easily searchable and discoverable.           |

#### Component types <a href="#component-types" id="component-types"></a>

The `component-types` directory should contain the manifests of the component types to be included in the optimization pack. No particular naming constraint is enforced on those manifests. See [Component Types template](https://docs.akamas.io/akamas-docs/3.6/reference/glossary/component-type) for details on the structure of those manifests.

#### Metrics <a href="#metrics" id="metrics"></a>

The `metrics` directory should contain the manifests of the groups of metrics to be included in the optimization pack. No particular naming constraint is enforced on those manifests. See [Metric template](https://docs.akamas.io/akamas-docs/3.6/reference/construct-templates/metric-template) for details on the structure of those manifests.

#### Parameters <a href="#parameters" id="parameters"></a>

The `parameters` directory should contain the manifests of the groups of parameters to be included in the optimization pack. No particular naming constraint is enforced on those manifests. See [Parameter template](https://docs.akamas.io/akamas-docs/3.6/reference/construct-templates/parameter-template) for details on the structure of those manifests.

### Building optimization pack descriptor <a href="#using-the-akamas-cli-to-build-the-final-optimization-pack-descriptor" id="using-the-akamas-cli-to-build-the-final-optimization-pack-descriptor"></a>

The following command needs to be executed to produce the final JSON descriptor:

```bash
akamas build optimization-pack PATH_TO_THE_DIRECTORY
```

After this, the optimization pack can be installed and used.
