mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-04 03:09:33 -06:00
add storage architecture overview
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
This commit is contained in:
@@ -8,5 +8,144 @@ geekdocFilePath: _index.md
|
||||
geekdocCollapseSection: true
|
||||
---
|
||||
|
||||
## Abstract
|
||||
|
||||
This service provides an oCIS extension that wraps [reva](https://github.com/cs3org/reva/) and adds an opinionated configuration to it.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
The below diagram shows the ocis services and the contained reva services within as dashed boxes. In general:
|
||||
1. A request comes in at the proxy and is authenticated using oidc.
|
||||
2. It is forwarded to the ocis frontend which handles ocs and ocdav requests by talking to the reva gateway using the CS3 API.
|
||||
3. The gateway acts as a facade to the actual CS3 services: storage providers, user providers, group providers and sharing providers.
|
||||
|
||||
{{< svg src="extensions/storage/static/overview.drawio.svg" >}}
|
||||
|
||||
The dashed lines in the diagram indicate requests that are made to authenticate requests or lookup the storage provider:
|
||||
1. After authenticating a request the proxy may either use the CS3 `userprovider` or the accounts service to fetch the user information that will be minted into the `x-access-token`.
|
||||
2. The gateway will verify the JWT signature of the `x-access-token` or try to authenticate the request itself, eg. using a public link token.
|
||||
|
||||
{{< hint warning >}}
|
||||
The bottom part is lighter because we will deprecate it in favor of using only the CS3 user and group providers after moving some account functionality into reva and glauth. The metadata storage is not registered in the reva gateway to prevent seperate user metadata necessary for running the service from data that is being served directly.
|
||||
{{< /hint >}}
|
||||
|
||||
## Terminology
|
||||
|
||||
Communication is hard. And clear communication is even harder. You may encounter the following terms throughout the documentation, in the code or when talking to other developers. Just keep in mind that whenever you hear or read *storage*, that term needs to be clarified, because on its own it is too vague. PR welcome.
|
||||
|
||||
### Resources
|
||||
A *resource* is a logical concept. It can be have different [types](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceType)
|
||||
- an actual *file*
|
||||
- a *container*, eg. a folder or bucket
|
||||
- a *symlink*, or
|
||||
- a *reference* which can point to a resource in another *storage provider*
|
||||
|
||||
### References
|
||||
|
||||
A [*reference*](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.Reference) is a logical concept. It identifies a *resource* and consists of either
|
||||
- a *path* based reference, used to identify a *resource* in the *namespace* of a *storage provider*. It must start with a `/`.
|
||||
- an [*id* based reference](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId), uniquely identifying a *resounce* in the *namespace* of a *storage provider*. It consists of a `storage provider id` and an `opaque id`. The `storage provider id` must NOT start with a `/`.
|
||||
|
||||
{{< hint info >}}
|
||||
The `/` is important because currenty the static *storage registry* uses a map to look up which *storage provider* is responsible for the resource. Paths must be prefixed with `/` so there can be no collisions between paths and storage provider ids in the same map.
|
||||
{{< /hint >}}
|
||||
|
||||
{{< hint warning >}}
|
||||
**Proposed Change**
|
||||
|
||||
A *reference* is a logical concept. It identifies a *resource* and consists of
|
||||
a *root* and a *path* relative to that *root*.
|
||||
A *root* is a `storage space id` and a `logical uuid` of a resource inside the *storage space*:
|
||||
```
|
||||
<storages_pace>:<logical_uuid>:<relative_path>
|
||||
`------------root------------´ `----path-----´
|
||||
```
|
||||
Both, *root* and *path*, are optional. The `storage space id` should be a uuid to prevent references from breaking when a *user* or *storage space* gets renamed. These are all valid references:
|
||||
|
||||
| name | description |
|
||||
|------|-------------|
|
||||
|`::/users/alice/projects/foo` | follow this path in the global namespace (path based reference)|
|
||||
|`home-alice::projects/foo` | in the *storage space* `home-alice`, start at the *root*, follow `projects/foo` |
|
||||
|`home-alice:c3cf23bb-8f47-4719-a150-1d25a1f6fb56:foo` | in the *storage space* `home-alice`, start at the resource identified by the `logical uuid` `c3cf23bb-8f47-4719-a150-1d25a1f6fb56`, follow `projects/foo` |
|
||||
|`home-alice:56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:` | in the *storage space* `home-alice`, start at the resource identified by the `logical uuid` `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a`, no relativ path to follow |
|
||||
|`ee1687e5-ac7f-426d-a6c0-03fed91d5f62:56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:` | in the *storage space* `ee1687e5-ac7f-426d-a6c0-03fed91d5f62`, start at the resource identified by the `logical uuid` `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a`, no relativ path to follow (id based reference) |
|
||||
|
||||
They all reference the same *resource* (if the `logical uuid` of `projects` is
|
||||
`c3cf23bb-8f47-4719-a150-1d25a1f6fb56` and the `logical uuid` of `foo` is `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a`).
|
||||
To move *storage spaces* between *storage providers*, the `logical uuid` of a file must be settable by the system. This also allows importing file metadata during a migration and restoring correct file ids when restoring a backup.
|
||||
{{< /hint >}}
|
||||
|
||||
|
||||
### Namespaces
|
||||
A *namespace* is a set of paths with a common prefix. There is a global namespace when making requests against the CS3 *gateway* and a local namespace for every *storage provider*. Currently, oCIS mounts these *storage providers* out of the box:
|
||||
|
||||
| mountpoint | served namespace |
|
||||
|------------|------------------|
|
||||
| `/home` | currently logged in users home |
|
||||
| `/users` | all users, used to access collaborative shares |
|
||||
| `/public` | publicly shared files, used to access public links |
|
||||
|
||||
|
||||
{{< hint warning >}}
|
||||
We plan to serve all shares the current user has access to under `/shares`.
|
||||
{{< /hint >}}
|
||||
|
||||
### Storage Drivers
|
||||
|
||||
A *storage driver* implements access to a *storage system*:
|
||||
|
||||
It maps the *path* and *id* based CS3 *references* to an appropriate *storage system* specific reference, eg:
|
||||
- eos file ids
|
||||
- posix inodes or paths
|
||||
- deconstructed filesystem nodes
|
||||
|
||||
### Storage Provider
|
||||
|
||||
A *storage provider* manages *resources* identified by a *reference*
|
||||
by accessing a *storage system* with a *storage driver*.
|
||||
|
||||
{{< svg src="extensions/storage/static/storageprovider.drawio.svg" >}}
|
||||
|
||||
{{< hint warning >}}
|
||||
**Proposed Change**
|
||||
A *storage provider* manages multiple *storage spaces*
|
||||
by accessing a *storage system* with a *storage driver*.
|
||||
|
||||
{{< /hint >}}
|
||||
{{< svg src="extensions/storage/static/storageprovider-spaces.drawio.svg" >}}
|
||||
{{< hint warning >}}
|
||||
By making *storage providers* aware of *storage spaces* we can get rid of the current `enablehome` flag / hack in reva. Furthermore, provisioning a new *storage space* becomes a generic operation, regardless if a new user home or a new project space needs to be provisioned.
|
||||
{{< /hint >}}
|
||||
|
||||
### Storage Registries
|
||||
|
||||
A *storage registry* manages the global *namespace*:
|
||||
it is used by the *gateway*
|
||||
to look up `address` and `port` of the *storage provider*
|
||||
that should handle a *reference*.
|
||||
|
||||
{{< svg src="extensions/storage/static/storageregistry.drawio.svg" >}}
|
||||
|
||||
{{< hint warning >}}
|
||||
**Proposed Change**
|
||||
A *storage registry* manages the *namespace* for a *user*:
|
||||
it is used by the *gateway*
|
||||
to look up `address` and `port` of the *storage provider*
|
||||
that is currently serving a *storage space*.
|
||||
{{< /hint >}}
|
||||
{{< svg src="extensions/storage/static/storageregistry-spaces.drawio.svg" >}}
|
||||
{{< hint warning >}}
|
||||
By making *storage registries* aware of *storage spaces* we can query them for a listing of all *storage spaces* a user has access to. Including his home, received shares, project folders or group drives. See [Add draft of adr for spaces API ocis#1827](https://github.com/owncloud/ocis/pull/1827) for more info.
|
||||
{{< /hint >}}
|
||||
|
||||
### Storage Spaces
|
||||
A *storage space* is a logical concept:
|
||||
it is a tree of *resources*
|
||||
with a single *owner* (*user* or *group*),
|
||||
a *quota* and *permissions*, identified by a `storage space id`.
|
||||
|
||||
{{< svg src="extensions/storage/static/storagespace.drawio.svg" >}}
|
||||
|
||||
Examples would be every users home storage space, project storage spaces or group storage spaces. While they all serve different purposes and may or may not have workflows like anti virus scanning enabled, we need a way to identify and manage these subtrees in a generic way. By creating a dedicated concept for them this becomes easier and literally makes the codebase cleaner.
|
||||
|
||||
Finally, a logical `storage space id` is not tied to a specific storage provider. When the *storage driver* supports it we can import existing files including their fileid, which makes it possible to move storage spaces between storage spaces to implement storage classes eg. with or without archival, workflows, on SSDs or HDDs.
|
||||
634
docs/extensions/storage/static/overview.drawio.svg
Normal file
634
docs/extensions/storage/static/overview.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 77 KiB |
471
docs/extensions/storage/static/storageprovider-spaces.drawio.svg
Normal file
471
docs/extensions/storage/static/storageprovider-spaces.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 192 KiB |
126
docs/extensions/storage/static/storageprovider.drawio.svg
Normal file
126
docs/extensions/storage/static/storageprovider.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 97 KiB |
327
docs/extensions/storage/static/storageregistry-spaces.drawio.svg
Normal file
327
docs/extensions/storage/static/storageregistry-spaces.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 149 KiB |
233
docs/extensions/storage/static/storageregistry.drawio.svg
Normal file
233
docs/extensions/storage/static/storageregistry.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 116 KiB |
163
docs/extensions/storage/static/storagespace.drawio.svg
Normal file
163
docs/extensions/storage/static/storagespace.drawio.svg
Normal file
@@ -0,0 +1,163 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="851px" height="401px" viewBox="-0.5 -0.5 851 401" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="270" y="231" width="50" height="45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 296.52 236.99 L 302.25 231.73 C 302.78 231.28 303.38 231.01 304.11 231 L 317.04 231 C 318.39 231 320 232.12 320 234.03 L 320 236.99 Z M 270 276 L 270 242.17 C 270 240.51 271.49 239.25 272.93 239.25 L 320 239.25 L 320 276 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 320 243.29 L 395 212.67" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<rect x="270" y="134" width="50" height="45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 296.52 139.99 L 302.25 134.73 C 302.78 134.28 303.38 134.01 304.11 134 L 317.04 134 C 318.39 134 320 135.12 320 137.03 L 320 139.99 Z M 270 179 L 270 145.17 C 270 143.51 271.49 142.25 272.93 142.25 L 320 142.25 L 320 179 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="395" y="276" width="40" height="47" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 395 323 L 395 276 L 422.92 276 L 435 287.94 L 435 323 Z M 397.26 320.77 L 432.74 320.77 L 432.74 290.18 L 421.42 290.18 L 421.42 278.24 L 397.26 278.24 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 320 263.08 L 395 291.83" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 320 147.13 L 390 120.88" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 211 190.64 L 270 166.66" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 211 213.23 L 270 241.51" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<rect x="505" y="44" width="50" height="45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 531.52 49.99 L 537.25 44.73 C 537.78 44.28 538.38 44.01 539.11 44 L 552.04 44 C 553.39 44 555 45.12 555 47.03 L 555 49.99 Z M 505 89 L 505 55.17 C 505 53.51 506.49 52.25 507.93 52.25 L 555 52.25 L 555 89 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 440 101.72 L 505 76.28" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 440 121.5 L 510 149.5" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<rect x="160" y="176" width="51" height="50" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 164.28 226 L 164.28 201.99 L 162.24 201.99 C 160.67 201.93 160 200.29 160.92 199.17 L 183.64 177.21 C 185.15 176 185.78 176.12 187.11 177.08 L 197.54 186.98 L 197.54 180.95 C 197.54 180.28 198.1 179.47 199.05 179.47 L 203.62 179.47 C 204.38 179.47 205.09 180.07 205.09 180.99 L 205.09 194.49 L 209.94 199.15 C 211 200.38 210.07 201.99 208.61 201.99 L 206.61 201.99 L 206.61 226 L 190.74 226 L 190.74 207.99 L 180.15 207.99 L 180.15 226 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="620" y="87" width="40" height="47" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 620 134 L 620 87 L 647.92 87 L 660 98.94 L 660 134 Z M 622.26 131.77 L 657.74 131.77 L 657.74 101.18 L 646.42 101.18 L 646.42 89.24 L 622.26 89.24 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="620" y="0" width="40" height="47" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 620 47 L 620 0 L 647.92 0 L 660 11.94 L 660 47 Z M 622.26 44.77 L 657.74 44.77 L 657.74 14.18 L 646.42 14.18 L 646.42 2.24 L 622.26 2.24 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 555 56.73 L 620 31.32" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 555 76.5 L 620 102.5" fill="none" stroke="#505050" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<rect x="390" y="89" width="50" height="45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 416.52 94.99 L 422.25 89.73 C 422.78 89.28 423.38 89.01 424.11 89 L 437.04 89 C 438.39 89 440 90.12 440 92.03 L 440 94.99 Z M 390 134 L 390 100.17 C 390 98.51 391.49 97.25 392.93 97.25 L 440 97.25 L 440 134 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 50 211.75 L 170 211.75 L 170 253 L 100 253 L 50 280 L 80 253 L 50 253 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" transform="rotate(180,110,245.88)" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 259px; margin-left: 51px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
the root resource of the storage space
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="110" y="263" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
the root resource of...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 90 270 L 290 270 L 290 300 L 130 300 L 90 320 L 110 300 L 90 300 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" transform="rotate(180,190,295)" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 305px; margin-left: 91px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
RESOURCE_TYPE_CONTAINER
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="190" y="309" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
RESOURCE_TYPE_CONTAINER
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 240 320 L 400 320 L 400 350 L 280.8 350 L 240 370 L 260.8 350 L 240 350 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" transform="rotate(180,320,345)" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 355px; margin-left: 241px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
RESOURCE_TYPE_FILE
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="320" y="359" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
RESOURCE_TYPE_FILE
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="395" y="181" width="40" height="47" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 416.43 206.33 C 417.26 204.41 419.07 203.35 420.88 203.34 L 424.04 203.34 C 427.04 203.34 428.95 206.03 428.95 208.33 C 428.95 211.75 426.07 213.3 424.03 213.3 L 420.98 213.3 C 418.76 213.3 417.06 211.83 416.44 210.32 L 418.78 210.32 C 419.31 210.92 420.07 211.29 420.89 211.32 L 424.03 211.32 C 425.52 211.32 427 210.1 427 208.38 C 426.97 206.64 425.58 205.35 424.04 205.35 L 420.87 205.35 C 419.98 205.39 419.27 205.78 418.78 206.33 Z M 408.05 209.27 C 407.65 209.27 407.08 208.93 407.08 208.28 C 407.08 207.9 407.44 207.33 408.03 207.33 L 422.03 207.33 C 422.6 207.33 423.01 207.83 423.01 208.3 C 423.01 208.83 422.55 209.27 422.04 209.27 Z M 413.57 210.32 C 412.79 212.15 411.05 213.26 409.16 213.3 L 405.86 213.3 C 403.68 213.3 401.04 211.29 401.04 208.32 C 401.04 205.4 403.61 203.34 405.98 203.34 L 409.08 203.34 C 410.98 203.34 412.78 204.53 413.56 206.33 L 411.23 206.33 C 410.74 205.79 410.03 205.39 409.17 205.35 L 406.1 205.35 C 404.12 205.35 402.99 206.91 402.99 208.33 C 402.99 209.91 404.32 211.32 405.96 211.32 L 409.18 211.32 C 409.9 211.27 410.6 211.02 411.23 210.32 Z M 397.26 225.76 L 432.74 225.76 L 432.74 195.17 L 421.42 195.17 L 421.42 183.24 L 397.26 183.24 Z M 395 228 L 395 181 L 422.92 181 L 435 192.93 L 435 228 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="680" y="249.5" width="170" height="100" rx="15" ry="15" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 300px; margin-left: 681px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
if the gateway encounters a resource type reference it will look it up and replace the reference with the results of the actual node (which can live in another storage provider)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="765" y="303" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
if the gateway encounters a...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="340" width="130" height="60" rx="9" ry="9" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 370px; margin-left: 1px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
every resource can be referenced by path or by id
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="65" y="374" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
every resource can be...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 430 220.88 L 610 220.88 L 610 240.88 L 572.4 240.88 L 610 270.88 L 552.4 240.88 L 430 240.88 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" transform="rotate(180,520,245.88)" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 261px; margin-left: 431px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
RESOURCE_TYPE_SYMLINK
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="520" y="264" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
RESOURCE_TYPE_SYMLINK
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="510" y="134" width="40" height="47" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 510 181 L 510 134 L 537.92 134 L 550 145.94 L 550 181 Z M 512.26 178.77 L 547.74 178.77 L 547.74 148.18 L 536.42 148.18 L 536.42 136.24 L 512.26 136.24 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="520" y="149" width="20" height="20.8" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 522.49 157.98 L 520.43 157.09 C 520.13 156.91 520 156.67 520.12 156.31 L 520.9 154.35 C 521.08 154.05 521.3 153.88 521.65 154.03 L 523.58 155.04 C 524.2 154.29 524.87 153.53 525.62 152.88 L 524.78 150.72 C 524.72 150.47 524.69 150.21 525.05 149.97 L 526.98 149.12 C 527.36 149 527.57 149.17 527.69 149.39 L 528.56 151.6 C 529.43 151.42 530.29 151.34 531.31 151.65 L 532.18 149.41 C 532.37 149.1 532.62 149.01 532.91 149.12 L 534.84 149.97 C 535.16 150.18 535.19 150.43 535.11 150.7 L 534.25 152.9 C 535.01 153.53 535.7 154.2 536.26 154.96 L 538.34 154.08 C 538.71 153.97 538.94 154.12 539.07 154.41 L 539.89 156.41 C 539.94 156.71 539.88 156.96 539.6 157.12 L 537.49 158.01 C 537.59 158.87 537.58 159.95 537.48 160.9 L 539.59 161.79 C 539.88 161.97 540 162.21 539.91 162.52 L 539.15 164.4 C 539 164.65 538.79 164.77 538.48 164.69 L 536.35 163.8 C 535.79 164.59 535.09 165.3 534.3 165.91 L 535.15 168.08 C 535.28 168.42 535.11 168.71 534.91 168.82 L 532.86 169.71 C 532.59 169.76 532.35 169.74 532.22 169.38 L 531.36 167.17 C 530.58 167.4 529.61 167.45 528.62 167.19 L 527.76 169.37 C 527.63 169.6 527.47 169.8 527.09 169.7 L 525.1 168.84 C 524.82 168.63 524.69 168.37 524.87 168.02 L 525.81 166.05 C 524.97 165.4 524.28 164.69 523.73 163.95 L 521.69 164.82 C 521.37 164.94 521.11 164.86 520.93 164.55 L 520.11 162.53 C 520.03 162.26 520.09 161.94 520.39 161.79 L 522.5 160.84 C 522.42 159.88 522.41 158.93 522.49 157.98 Z M 524.77 159.36 C 524.77 162.74 527.44 164.83 530.04 164.83 C 532.88 164.83 535.22 162.33 535.22 159.41 C 535.22 156.29 532.7 153.95 530.06 153.95 C 527.47 153.95 524.77 155.98 524.77 159.36 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<path d="M 540 170 L 740 170 L 740 190 L 696 190 L 740 220 L 676 190 L 540 190 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" transform="rotate(180,640,195)" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 210px; margin-left: 541px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
RESOURCE_TYPE_REFERENCE
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="640" y="214" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
RESOURCE_TYPE_REFERENCE
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
</g>
|
||||
<switch>
|
||||
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
|
||||
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||
Viewer does not support full SVG 1.1
|
||||
</text>
|
||||
</a>
|
||||
</switch>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
Reference in New Issue
Block a user