From 2f1dde2f1f780f367b0001156d5e54cdde5a604c Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Thu, 13 Aug 2020 16:09:13 +1000 Subject: [PATCH 1/7] Provided base ceph-rbd CSI driver example + tf external_id generator. --- demo/csi/ceph-csi-plugin/README.md | 66 ++++++++++ demo/csi/ceph-csi-plugin/ceph-csi-id.tf | 30 +++++ demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl | 119 +++++++++++++++++++ demo/csi/ceph-csi-plugin/example_volume.hcl | 22 ++++ 4 files changed, 237 insertions(+) create mode 100644 demo/csi/ceph-csi-plugin/README.md create mode 100644 demo/csi/ceph-csi-plugin/ceph-csi-id.tf create mode 100644 demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl create mode 100644 demo/csi/ceph-csi-plugin/example_volume.hcl diff --git a/demo/csi/ceph-csi-plugin/README.md b/demo/csi/ceph-csi-plugin/README.md new file mode 100644 index 00000000000..7304d28f5b2 --- /dev/null +++ b/demo/csi/ceph-csi-plugin/README.md @@ -0,0 +1,66 @@ +# Openstack Ceph-CSI Plugin + +The configuration here is for the Ceph RBD driver, migrated from the k8s config [documentation](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md). It can be easily modified for the CephFS Driver, as used [here](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-cephfs.md). + +## Requirements + +The example plugin job creates a file at `local/cloud.conf` using a [`template`](https://www.nomadproject.io/docs/job-specification/template) stanza which pulls the necessary credentials from a [Vault kv-v2](https://www.vaultproject.io/docs/secrets/kv/kv-v2) secrets store. + + +### Docker Privileged Mode + +The Ceph CSI Node task requires that [`privileged = true`](https://www.nomadproject.io/docs/drivers/docker#privileged) be set. This is not needed for the Controller task. + +## Container Arguments + +see [](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md) + +- `"--type=rbd"` + + - This option must match the `mount_dir` specified in the `csi_plugin` stanza for the task. + +- `--endpoint=unix:///csi/csi.sock` + + - This option must match the `mount_dir` specified in the `csi_plugin` stanza for the task. + +- `--nodeid=${node.unique.name}` + + - A unique ID for the node the task is running on. Reccomend using `${node.unique.name}` + +- `--cluster=${NOMAD_DC}` + + - The cluster the Controller/Node is apart of. Reccomend using `${NOMAD_DC}` + +- `--instanceid=${attr.unique.platform.aws.instance-id}` + + - Unique ID distinguishing this instance of Ceph CSI among other instances, when sharing Ceph clusters across CSI instances for provisioning. Used for topology-aware deployments. + +## Deployment + +### Plugin + +```bash +export NOMAD_ADDR=https://nomad.example.com:4646 +export NOMAD_TOKEN=34534-3sdf3-szfdsafsdf3423-zxdfsd3 +nomad job run ceph-csi-plugin.hcl +``` + +### Volume Registration + +The `external_id` value for the volume must be strictly formatted, see `ceph_csi.tf`. Based on [Ceph-CSI ID Format](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid.go#L27), see [examples](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid_test.go#L33) + +the `secrets` block will be populated with values pulled from `/etc/ceph/ceph.client..keyring`, e.g. +``` +userid = "" +userkey = "AWBg/BtfJInSFBATOrrnCh6UGE3QB3nYakdF+g==" +``` + +```bash +export NOMAD_ADDR=https://nomad.example.com:4646 +export NOMAD_TOKEN=34534-3sdf3-szfdsafsdf3423-zxdfsd3 +nomad volume register example_volume.hcl +``` + +## Ceph CSI Driver Source + +- https://github.com/ceph/ceph-csi \ No newline at end of file diff --git a/demo/csi/ceph-csi-plugin/ceph-csi-id.tf b/demo/csi/ceph-csi-plugin/ceph-csi-id.tf new file mode 100644 index 00000000000..6e3bf24eaff --- /dev/null +++ b/demo/csi/ceph-csi-plugin/ceph-csi-id.tf @@ -0,0 +1,30 @@ +locals { + # ClusterID: Is a unique ID per cluster that the CSI instance is serving and is restricted to + # lengths that can be accommodated in the encoding scheme. + # must be less than 128 chars. must match the cluster id in the csi plugin conf. + ClusterID = "" + # EncodingVersion: Carries the version number of the encoding scheme used to encode the CSI ID, + # and is preserved for any future proofing w.r.t changes in the encoding scheme, and to retain + # ability to parse backward compatible encodings. + # https://github.com/ceph/ceph-csi/blob/ef1785ce4db0aa1f6878c770893bcabc71cff300/internal/cephfs/driver.go#L31 + EncodingVersion = 1 + # LocationID: 64 bit integer identifier determining the location of the volume on the Ceph cluster. + # It is the ID of the poolname or fsname, for RBD or CephFS backed volumes respectively. + # see https://docs.ceph.com/docs/mimic/rbd/rados-rbd-cmds/ + LocationID = 7 + # ObjectUUID: Is the on-disk uuid of the object (image/snapshot) name, for the CSI volume that + # corresponds to this CSI ID.. must be 36 chars long. + ObjectUUID = "abcd" +} + +data "template_file" "csi_id" { + count = var.vol_count + template = "$${versionEncodedHex}-$${clusterIDLength}-$${ciClusterID}-$${poolIDEncodedHex}-$${ciObjectUUID}" + vars = { + versionEncodedHex = format("%02X", local.EncodingVersion) + clusterIDLength = format("%02X", length(local.ClusterID)) + ciClusterID = local.ClusterID + poolIDEncodedHex = format("%016X", local.LocationID) + ciObjectUUID = local.ObjectUUID + } +} \ No newline at end of file diff --git a/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl b/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl new file mode 100644 index 00000000000..c122d314e01 --- /dev/null +++ b/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl @@ -0,0 +1,119 @@ +job "ceph-csi-plugin" { + datacenters = ["dc1"] + type = "system" + group "nodes" { + task "ceph-node" { + driver = "docker" + template { + data = <", + "monitors": [ + {{range $index, $service := service "mon.ceph"}}{{if gt $index 0}}, {{end}}"{{.Address}}"{{end}} + ] +}] +EOF + destination = "local/config.json" + change_mode = "restart" + } + config { + image = "quay.io/cephcsi/cephcsi:v2.1.2-amd64" + volumes = [ + "./local/config.json:/etc/ceph-csi-config/config.json" + ] + mounts = [ + { + type = "tmpfs" + target = "/tmp/csi/keys" + readonly = false + tmpfs_options { + size = 1000000 # size in bytes + } + } + ] + args = [ + "--type=rbd", + # Name of the driver + "--drivername=rbd.csi.ceph.com", + "--logtostderr", + "--nodeserver=true", + "--endpoint=unix://csi/csi.sock", + "--instanceid=${attr.unique.platform.aws.instance-id}", + "--nodeid=${attr.unique.consul.name}", + # TCP port for liveness metrics requests (/metrics) + "--metricsport=${NOMAD_PORT_prometheus}", + ] + privileged = true + resources { + cpu = 200 + memory = 500 + network { + mbits = 1 + // prometheus metrics port + port "prometheus" {} + } + } + } + service { + name = "prometheus" + port = "prometheus" + tags = [ "ceph-csi" ] + } + csi_plugin { + id = "ceph-csi" + type = "node" + mount_dir = "/csi" + } + } + task "ceph-controller" { + + template { + data = <", + "monitors": [ + {{range $index, $service := service "mon.ceph"}}{{if gt $index 0}}, {{end}}"{{.Address}}"{{end}} + ] +}] +EOF + destination = "local/config.json" + change_mode = "restart" + } + driver = "docker" + config { + image = "quay.io/cephcsi/cephcsi:v2.1.2-amd64" + volumes = [ + "./local/config.json:/etc/ceph-csi-config/config.json" + ] + resources { + cpu = 200 + memory = 500 + network { + mbits = 1 + // prometheus metrics port + port "prometheus" {} + } + } + args = [ + "--type=rbd", + "--controllerserver=true", + "--drivername=rbd.csi.ceph.com", + "--logtostderr", + "--endpoint=unix://csi/csi.sock", + "--metricsport=$${NOMAD_PORT_prometheus}", + "--nodeid=$${attr.unique.platform.aws.hostname}" + ] + } + service { + name = "prometheus" + port = "prometheus" + tags = [ "ceph-csi" ] + } + csi_plugin { + id = "ceph-csi" + type = "controller" + mount_dir = "/csi" + } + } + } +} \ No newline at end of file diff --git a/demo/csi/ceph-csi-plugin/example_volume.hcl b/demo/csi/ceph-csi-plugin/example_volume.hcl new file mode 100644 index 00000000000..54499e3d871 --- /dev/null +++ b/demo/csi/ceph-csi-plugin/example_volume.hcl @@ -0,0 +1,22 @@ +type = "csi" +id = "testvol" +name = "test_volume" +# this must be strictly formatted, see README +external_id = "ffff-0024-01616094-9d93-4178-bf45-c7eac19e8b15-000000000000ffff-00000000-1111-2222-bbbb-cacacacacaca" +access_mode = "single-node-writer" +attachment_mode = "block-device" +plugin_id = "ceph-csi" +mount_options { + fs_type = "ext4" +} +parameters {} +secrets { + userID = "admin" + userKey = "AWBg/BtfJInSFBATOrrnCh6UGE3QB3nYakdF+g==" +} +context { + # note: although these are 'parameters' in the ceph-csi spec + # they are passed through to the provider as 'context' + clusterID = "" + pool = "my_pool" +} \ No newline at end of file From 28114c78d669cea7ec90f84144376c663eb695be Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 01:50:54 +1000 Subject: [PATCH 2/7] Update demo/csi/ceph-csi-plugin/README.md Co-authored-by: Tim Gross --- demo/csi/ceph-csi-plugin/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/csi/ceph-csi-plugin/README.md b/demo/csi/ceph-csi-plugin/README.md index 7304d28f5b2..1b29bdb26df 100644 --- a/demo/csi/ceph-csi-plugin/README.md +++ b/demo/csi/ceph-csi-plugin/README.md @@ -25,7 +25,7 @@ see [](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md) - `--nodeid=${node.unique.name}` - - A unique ID for the node the task is running on. Reccomend using `${node.unique.name}` + - A unique ID for the node the task is running on. Recommend using `${node.unique.name}` - `--cluster=${NOMAD_DC}` @@ -63,4 +63,4 @@ nomad volume register example_volume.hcl ## Ceph CSI Driver Source -- https://github.com/ceph/ceph-csi \ No newline at end of file +- https://github.com/ceph/ceph-csi From 712e6280e686c75469723d842f1c48cab71902f0 Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 01:51:03 +1000 Subject: [PATCH 3/7] Update demo/csi/ceph-csi-plugin/README.md Co-authored-by: Tim Gross --- demo/csi/ceph-csi-plugin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/csi/ceph-csi-plugin/README.md b/demo/csi/ceph-csi-plugin/README.md index 1b29bdb26df..eb750b86eb6 100644 --- a/demo/csi/ceph-csi-plugin/README.md +++ b/demo/csi/ceph-csi-plugin/README.md @@ -29,7 +29,7 @@ see [](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md) - `--cluster=${NOMAD_DC}` - - The cluster the Controller/Node is apart of. Reccomend using `${NOMAD_DC}` + - The cluster the Controller/Node is a part of. Recommend using `${NOMAD_DC}` - `--instanceid=${attr.unique.platform.aws.instance-id}` From e253687590fa009b3f1156fc3f9d5d52c44ef366 Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 01:51:16 +1000 Subject: [PATCH 4/7] Update demo/csi/ceph-csi-plugin/README.md Co-authored-by: Tim Gross --- demo/csi/ceph-csi-plugin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/csi/ceph-csi-plugin/README.md b/demo/csi/ceph-csi-plugin/README.md index eb750b86eb6..f802c506daa 100644 --- a/demo/csi/ceph-csi-plugin/README.md +++ b/demo/csi/ceph-csi-plugin/README.md @@ -49,7 +49,7 @@ nomad job run ceph-csi-plugin.hcl The `external_id` value for the volume must be strictly formatted, see `ceph_csi.tf`. Based on [Ceph-CSI ID Format](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid.go#L27), see [examples](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid_test.go#L33) -the `secrets` block will be populated with values pulled from `/etc/ceph/ceph.client..keyring`, e.g. +The `secrets` block will be populated with values pulled from `/etc/ceph/ceph.client..keyring`, e.g. ``` userid = "" userkey = "AWBg/BtfJInSFBATOrrnCh6UGE3QB3nYakdF+g==" From f405009bda25bf6f3f29693fb902fd16a64c71b0 Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 02:37:09 +1000 Subject: [PATCH 5/7] fixes from review. ran hclfmt --- demo/csi/ceph-csi-plugin/README.md | 14 +++++++------- demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl | 10 +++++----- demo/csi/ceph-csi-plugin/example_volume.hcl | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/demo/csi/ceph-csi-plugin/README.md b/demo/csi/ceph-csi-plugin/README.md index f802c506daa..267a4cd58b9 100644 --- a/demo/csi/ceph-csi-plugin/README.md +++ b/demo/csi/ceph-csi-plugin/README.md @@ -12,12 +12,12 @@ The example plugin job creates a file at `local/cloud.conf` using a [`template`] The Ceph CSI Node task requires that [`privileged = true`](https://www.nomadproject.io/docs/drivers/docker#privileged) be set. This is not needed for the Controller task. ## Container Arguments - -see [](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md) - -- `"--type=rbd"` - - - This option must match the `mount_dir` specified in the `csi_plugin` stanza for the task. + +Refer to the official plugin [guide](https://github.com/ceph/ceph-csi/blob/master/docs/deploy-rbd.md). + +- `--type=rbd` + + - Driver type `rbd` (or alternately `cephfs`) - `--endpoint=unix:///csi/csi.sock` @@ -47,7 +47,7 @@ nomad job run ceph-csi-plugin.hcl ### Volume Registration -The `external_id` value for the volume must be strictly formatted, see `ceph_csi.tf`. Based on [Ceph-CSI ID Format](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid.go#L27), see [examples](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid_test.go#L33) +The `external_id` value for the volume must be strictly formatted, see `ceph_csi.tf`. Based on [Ceph-CSI ID Format](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid.go#L27), see [examples](https://github.com/ceph/ceph-csi/blob/71ddf51544be498eee03734573b765eb04480bb9/internal/util/volid_test.go#L33). The `secrets` block will be populated with values pulled from `/etc/ceph/ceph.client..keyring`, e.g. ``` diff --git a/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl b/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl index c122d314e01..eb745460854 100644 --- a/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl +++ b/demo/csi/ceph-csi-plugin/ceph-csi-plugin.hcl @@ -23,8 +23,8 @@ EOF ] mounts = [ { - type = "tmpfs" - target = "/tmp/csi/keys" + type = "tmpfs" + target = "/tmp/csi/keys" readonly = false tmpfs_options { size = 1000000 # size in bytes @@ -39,7 +39,7 @@ EOF "--nodeserver=true", "--endpoint=unix://csi/csi.sock", "--instanceid=${attr.unique.platform.aws.instance-id}", - "--nodeid=${attr.unique.consul.name}", + "--nodeid=${attr.unique.consul.name}", # TCP port for liveness metrics requests (/metrics) "--metricsport=${NOMAD_PORT_prometheus}", ] @@ -57,7 +57,7 @@ EOF service { name = "prometheus" port = "prometheus" - tags = [ "ceph-csi" ] + tags = ["ceph-csi"] } csi_plugin { id = "ceph-csi" @@ -107,7 +107,7 @@ EOF service { name = "prometheus" port = "prometheus" - tags = [ "ceph-csi" ] + tags = ["ceph-csi"] } csi_plugin { id = "ceph-csi" diff --git a/demo/csi/ceph-csi-plugin/example_volume.hcl b/demo/csi/ceph-csi-plugin/example_volume.hcl index 54499e3d871..a772bc1329f 100644 --- a/demo/csi/ceph-csi-plugin/example_volume.hcl +++ b/demo/csi/ceph-csi-plugin/example_volume.hcl @@ -1,6 +1,6 @@ -type = "csi" -id = "testvol" -name = "test_volume" +type = "csi" +id = "testvol" +name = "test_volume" # this must be strictly formatted, see README external_id = "ffff-0024-01616094-9d93-4178-bf45-c7eac19e8b15-000000000000ffff-00000000-1111-2222-bbbb-cacacacacaca" access_mode = "single-node-writer" @@ -8,15 +8,15 @@ attachment_mode = "block-device" plugin_id = "ceph-csi" mount_options { fs_type = "ext4" -} +} parameters {} secrets { - userID = "admin" + userID = "admin" userKey = "AWBg/BtfJInSFBATOrrnCh6UGE3QB3nYakdF+g==" } context { - # note: although these are 'parameters' in the ceph-csi spec - # they are passed through to the provider as 'context' - clusterID = "" - pool = "my_pool" + # note: although these are 'parameters' in the ceph-csi spec + # they are passed through to the provider as 'context' + clusterID = "" + pool = "my_pool" } \ No newline at end of file From 4bc372efbec668d06b3dafa4841471f69fbbba60 Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 02:39:43 +1000 Subject: [PATCH 6/7] fixing random user/key. example still in readme. --- demo/csi/ceph-csi-plugin/example_volume.hcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/csi/ceph-csi-plugin/example_volume.hcl b/demo/csi/ceph-csi-plugin/example_volume.hcl index a772bc1329f..636c31ed26d 100644 --- a/demo/csi/ceph-csi-plugin/example_volume.hcl +++ b/demo/csi/ceph-csi-plugin/example_volume.hcl @@ -11,8 +11,8 @@ mount_options { } parameters {} secrets { - userID = "admin" - userKey = "AWBg/BtfJInSFBATOrrnCh6UGE3QB3nYakdF+g==" + userID = "" + userKey = "" } context { # note: although these are 'parameters' in the ceph-csi spec From 6255be8487d18c5a1e3b4f815c0c762919c007ec Mon Sep 17 00:00:00 2001 From: Ryan Mickler Date: Fri, 14 Aug 2020 02:41:19 +1000 Subject: [PATCH 7/7] terraform fmt --- demo/csi/ceph-csi-plugin/ceph-csi-id.tf | 51 +++++++++++++------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/demo/csi/ceph-csi-plugin/ceph-csi-id.tf b/demo/csi/ceph-csi-plugin/ceph-csi-id.tf index 6e3bf24eaff..7ee7c13ebfc 100644 --- a/demo/csi/ceph-csi-plugin/ceph-csi-id.tf +++ b/demo/csi/ceph-csi-plugin/ceph-csi-id.tf @@ -1,30 +1,33 @@ locals { - # ClusterID: Is a unique ID per cluster that the CSI instance is serving and is restricted to - # lengths that can be accommodated in the encoding scheme. - # must be less than 128 chars. must match the cluster id in the csi plugin conf. - ClusterID = "" - # EncodingVersion: Carries the version number of the encoding scheme used to encode the CSI ID, - # and is preserved for any future proofing w.r.t changes in the encoding scheme, and to retain - # ability to parse backward compatible encodings. - # https://github.com/ceph/ceph-csi/blob/ef1785ce4db0aa1f6878c770893bcabc71cff300/internal/cephfs/driver.go#L31 - EncodingVersion = 1 - # LocationID: 64 bit integer identifier determining the location of the volume on the Ceph cluster. - # It is the ID of the poolname or fsname, for RBD or CephFS backed volumes respectively. - # see https://docs.ceph.com/docs/mimic/rbd/rados-rbd-cmds/ - LocationID = 7 - # ObjectUUID: Is the on-disk uuid of the object (image/snapshot) name, for the CSI volume that - # corresponds to this CSI ID.. must be 36 chars long. - ObjectUUID = "abcd" + # ClusterID: Is a unique ID per cluster that the CSI instance is serving and is restricted to + # lengths that can be accommodated in the encoding scheme. + # must be less than 128 chars. must match the cluster id in the csi plugin conf. + ClusterID = "" + + # EncodingVersion: Carries the version number of the encoding scheme used to encode the CSI ID, + # and is preserved for any future proofing w.r.t changes in the encoding scheme, and to retain + # ability to parse backward compatible encodings. + # https://github.com/ceph/ceph-csi/blob/ef1785ce4db0aa1f6878c770893bcabc71cff300/internal/cephfs/driver.go#L31 + EncodingVersion = 1 + + # LocationID: 64 bit integer identifier determining the location of the volume on the Ceph cluster. + # It is the ID of the poolname or fsname, for RBD or CephFS backed volumes respectively. + # see https://docs.ceph.com/docs/mimic/rbd/rados-rbd-cmds/ + LocationID = 7 + + # ObjectUUID: Is the on-disk uuid of the object (image/snapshot) name, for the CSI volume that + # corresponds to this CSI ID.. must be 36 chars long. + ObjectUUID = "abcd" } data "template_file" "csi_id" { - count = var.vol_count - template = "$${versionEncodedHex}-$${clusterIDLength}-$${ciClusterID}-$${poolIDEncodedHex}-$${ciObjectUUID}" + template = "$${versionEncodedHex}-$${clusterIDLength}-$${ciClusterID}-$${poolIDEncodedHex}-$${ciObjectUUID}" + vars = { - versionEncodedHex = format("%02X", local.EncodingVersion) - clusterIDLength = format("%02X", length(local.ClusterID)) - ciClusterID = local.ClusterID - poolIDEncodedHex = format("%016X", local.LocationID) - ciObjectUUID = local.ObjectUUID + versionEncodedHex = "${format("%02X", local.EncodingVersion)}" + clusterIDLength = "${format("%02X", length(local.ClusterID))}" + ciClusterID = "${local.ClusterID}" + poolIDEncodedHex = "${format("%016X", local.LocationID)}" + ciObjectUUID = "${local.ObjectUUID}" } -} \ No newline at end of file +}