move "storage" section out of the extensions section since it is no longer a (meta) extension
@@ -0,0 +1 @@
|
||||
grpc.md
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: "Storage"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 20
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: _index.md
|
||||
geekdocCollapseSection: true
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The storage extension wraps [reva](https://github.com/cs3org/reva/) and adds an opinionated configuration to provide two core services for the oCIS platform:
|
||||
1. A [*Spaces Registry*]({{< ref "./spacesregistry.md" >}}) that acts as a dictionary for storage *Spaces* and their metadata
|
||||
2. A [*Spaces Provider*]({{< ref "./spacesprovider.md" >}}) that organizes *Resources* in storage *Spaces* and persists them in an underlying *Storage System*
|
||||
|
||||
*Clients* will use the *Spaces Registry* to poll or get notified about changes in all *Spaces* a user has access to. Every *Space* has a dedicated `/dav/spaces/<spaceid>` WebDAV endpoint that is served by a *Spaces Provider* which uses a specific reva storage driver to wrap an underlying *Storage System*.
|
||||
|
||||
{{< figure src="/ocis/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, e.g. 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 separate metadata necessary for running the service from data that is being served directly.
|
||||
{{< /hint >}}
|
||||
|
||||
## Endpoints and references
|
||||
|
||||
In order to reason about the request flow, two aspects in the architecture need to be understood well:
|
||||
1. What kind of [*namespaces*]({{< ref "./namespaces.md" >}}) are presented at the different WebDAV and CS3 endpoints?
|
||||
2. What kind of [*resource*]({{< ref "./terminology.md#resources" >}}) [*references*]({{< ref "./terminology.md#references" >}}) are exposed or required: path or id based?
|
||||
{{< figure src="/ocis/storage/static/storage.drawio.svg" >}}
|
||||
@@ -0,0 +1,97 @@
|
||||
---
|
||||
title: "Namespaces"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 15
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: namespaces.md
|
||||
---
|
||||
|
||||
A *namespace* is a set of paths with a common prefix. Depending on the endpoint you are talking to you will encounter a different kind of namespace:
|
||||
In ownCloud 10 all paths are considered relative to the users home. The CS3 API uses a global namespace and the *storage providers* use a local namespace with paths relative to the storage providers root.
|
||||
|
||||
{{< figure src="/ocis/storage/static/namespaces.drawio.svg" >}}
|
||||
|
||||
The different paths in the namespaces need to be translated while passing [*references*]({{< ref "./terminology.md#references" >}}) from service to service. While the oc10 endpoints all work on paths we internally reference shared resources by id, so the shares don't break when a file is renamed or moved inside a storage [*space*]({{< ref "./spaces" >}}). The following table lists the various namespaces, paths and id based references:
|
||||
|
||||
| oc10 namespace | CS3 global namespace | storage provider | reference | content |
|
||||
|--------------------------------------------------|----------------------------------------|------------------|-----------|---------|
|
||||
| `/webdav/path/to/file.ext` `/dav/files/<username>/path/to/file.ext` | `/home/path/to/file.ext` | home | `/<user_layout>/path/to/file.ext` | currently logged in users home |
|
||||
| `/webdav/Shares/foo` `/dav/files/<username>/Shares/foo` | `/home/Shares/foo` | users | id based access | all users, used to access collaborative shares |
|
||||
| `/dav/public-files/<token>/rel/path/to/file.ext` | `/public/<token>/rel/path/to/file.ext` | public | id based access | publicly shared files, used to access public links |
|
||||
|
||||
|
||||
{{< hint danger >}}
|
||||
oCIS currently is configured to jail users into the CS3 `/home` namespace in the oc10 endpoints to mimic ownCloud 10. CernBox has been exposing a global namespace on `/webdav` for years already. The ocs service returns urls that are relative to the CS3 global namespace which makes both scenarios work, but only one of them at a time. Which is why the testsuite hiccups when trying to [Allow full paths targets in reva#1605](https://github.com/cs3org/reva/pull/1605).
|
||||
{{< /hint >}}
|
||||
|
||||
|
||||
{{< hint warning >}}
|
||||
In the global CS3 namespaces we plan to move `/home/Shares`, which currently lists all mounted shares of the currently logged-in user to a dedicated `/shares` namespace. See [below]({{< ref "#cs3-namespaces" >}}) and [Move shares folder out from home directory to a separate mount reva#1584](https://github.com/cs3org/reva/pull/1584).
|
||||
{{< /hint >}}
|
||||
|
||||
## ownCloud namespaces
|
||||
|
||||
In contrast to the global namespace of CS3, ownCloud always presented a user specific namespace on all endpoints. It will always list the users private files under `/`. Shares can be mounted at an arbitrary location in the users private spaces. See the [webdav]({{< ref "./spacesprovider#webdav" >}}) and [ocs]({{< ref "./spacesprovider#sharing" >}}) sections for more details end examples.
|
||||
|
||||
With the spaces concept we are planning to introduce a global namespace to the ownCloud webdav endpoints. This will push the users private space down in the hierarchy: it will move from `/webdav` to `/webdav/home` or `/webdav/users/<username>`. The related [migration stages]({{< ref "../../ocis/migration.md" >}}) are subject to change.
|
||||
|
||||
## CS3 global namespaces
|
||||
|
||||
The *CS3 global namespace* in oCIS is configured in the storage [*spaces registry*]({{< ref "./spacesregistry" >}}). oCIS uses these defaults:
|
||||
|
||||
| global namespace | description |
|
||||
|-|-|
|
||||
| `/home` | an alias for the currently logged in uses private space |
|
||||
| `/users/<user_layout>` | user private spaces |
|
||||
| `/shares` | a virtual listing of share spaces a user has access to |
|
||||
| `/public/<token>` | a virtual folder listing public shares |
|
||||
| `/spaces/<spacename>` | *TODO: project or group spaces* |
|
||||
|
||||
Technically, the `/home` namespace is not necessary: the storage [*spaces registry*]({{< ref "./spacesregistry" >}}) knows the path to a users private space in the `/users` namespace and the gateway can forward the requests to the responsible storage provider.
|
||||
|
||||
{{< hint warning >}}
|
||||
*@jfd: Why don't we use `/home/<user_layout>` instead of `/users/<user_layout>`. Then the paths would be consistent with most unix systems.
|
||||
{{< /hint >}}
|
||||
|
||||
The `/shares` namespace is used to solve two problems:
|
||||
- To query all shares the current user has access to the *share manager* can be used to list the resource ids. While the shares can then be navigated by resource id, they will return the relative path in the actual [*storage provider*]({{< ref "./terminology.md#storage-providers" >}}), leaking parent folders of the shared resource.
|
||||
- When accepting a remote share e.g., for OCM the resource does not exist on the local instance. They are made accessible in the global namespace under the `/shares` namespace.
|
||||
|
||||
{{< hint warning >}}
|
||||
*@jfd: Should we split `/shares` into `/collaborations`, `/ocm` and `/links`? We also have `/public` which uses token based authentication. They may have different latencies or polling strategies? Well, I guess we can cache them differently regardless of the mount point.*
|
||||
{{< /hint >}}
|
||||
|
||||
## Browser URLs vs API URLs
|
||||
In ownCloud 10 you can not only create *public links* but also *private links*. Both can be copy pasted into an email or chat to grant others access to a file. Most often though, end users will copy and paste the URL from their browsers location bar.
|
||||
|
||||
| URL | description |
|
||||
|-|-|
|
||||
| https://demo.owncloud.com/apps/files/?dir=/Photos/Vacation&fileid=24 | The normal browser URL |
|
||||
| https://demo.owncloud.com/apps/files/?fileid=24 | the `dir` is actually not used to find the directory and will be filled when pasting this URL |
|
||||
| https://demo.owncloud.com/f/24 | *private links* are the shortened version of this and work in the same way |
|
||||
| https://demo.owncloud.com/s/piLdAAt1m3Bg0Fk | public link |
|
||||
|
||||
{{< hint >}}
|
||||
The `dir` parameter alone cannot be used to look up the directory, because the path for a file may be different depending on the currently logged-in user:
|
||||
- User A shares his `/path/to/Photos` with User X.
|
||||
- User B shares his `/other/path/to/Photos` with User X and Y.
|
||||
- User A shares his `/path/to/Photos` with User Y.
|
||||
|
||||
(Depending on the order in which they accept the shares) X and Y now have two folders `/shares/Photos` and `/shares/Photos (1)`. But if they were to copy paste a link with that path in the URL and if the directory were only looked up by path X and Y would end up in different folders.
|
||||
|
||||
You could argue that the path should always use a global path in the CS3 namespace:
|
||||
- User A shares his `/users/a/path/to/Photos` with User X.
|
||||
- User B shares his `/users/b/other/path/to/Photos` with User X and Y.
|
||||
- User A shares his `/users/a/path/to/Photos` with User Y.
|
||||
|
||||
By using a global path like this X and Y would always end up in the correct folder. However, there are two caveats:
|
||||
- This only works for resources that reside on the instance (because only they have unique and global path). Shares from other instances need to be identified by id, or they cannot be uniquely addressed
|
||||
- User A may not want to leak path `path/to` segments leading to `Photos`. They might contain things like `low-priority` or personal data.
|
||||
|
||||
That is the reason why URLs always have to contain some kind of stable identifier. By introducing the concept of *storage spaces* and treating user homes, project drives and shares we can create a URL that contains an identifier for the *storage space* and a path relative to the root of it.
|
||||
{{< /hint >}}
|
||||
|
||||
In ocis we will unify the way links sharing works, however there will always be at least two types of URLs:
|
||||
1. the URL you see in the browsers location bar, and
|
||||
2. the URL that a client uses to actually access a file.
|
||||
@@ -0,0 +1,177 @@
|
||||
---
|
||||
title: "Proposed Changes"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 18
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: proposedchanges.md
|
||||
---
|
||||
|
||||
Some architectural changes still need to be clarified or changed. Maybe an ADR is in order for all of the below.
|
||||
|
||||
## Reva Gateway changes
|
||||
|
||||
## A dedicated shares storage provider
|
||||
|
||||
Currently, when a user accepts a share, a cs3 reference is created in the users `/home/shares` folder. This reference represents the mount point of a share and can be renamed, similar to the share jail in ownCloud 10. This spreads the metadata of a share in two places:
|
||||
- the share is persisted in the *share manager*
|
||||
- the mount point of a share is persisted in the home *storage provider*
|
||||
|
||||
Furthermore, the *gateway* treats `/home/shares` different than any other path: it will stat all children and calculate an etag to allow clients to discover changes in accepted shares. This requires the storage provider to cooperate and provide this special `/shares` folder in the root of a users home when it is accessed as a home storage. That is the origin of the `enable_home` config flag that needs to be implemented for every storage driver.
|
||||
|
||||
In order to have a single source of truth we need to make the *share manager* aware of the mount point. We can then move all the logic that aggregates the etag in the share folder to a dedicated *shares storage provider* that is using the *share manager* for persistence. The *shares storage provider* would provide a `/shares` namespace outside of `/home` that lists all accepted shares for the current user. As a result the storage drivers no longer need to have a `enable_home` flag that jails users into their home. The `/home/shares` folder would move outside of the `/home`. In fact `/home` will no longer be needed, because the home folder concept can be implemented as a space: `CreateHome` would create a `personal` space on the.
|
||||
|
||||
Work on this is done in https://github.com/cs3org/reva/pull/2023
|
||||
|
||||
{{< hint warning >}}
|
||||
What about copy pasting links from the browser? Well this storage is only really needed to have a path to ocm shares that actually reside on other instances. In the UI the shares would be listed by querying a *share manager*. It returns ResourceIds, which can be stated to fetch a path that is then accessible in the CS3 global namespace. Two caveats:
|
||||
- This only works for resources that are actually hosted by the current instance. For those it would leak the parent path segments to a shared resource.
|
||||
- For accepted OCM shares there must be a path in the [*CS3 global namespace*]({{< ref "./namespaces.md#cs3-global-namespaces" >}}) that has to be the same for all users, otherwise they cannot copy and share those URLs.
|
||||
{{< /hint >}}
|
||||
|
||||
### The gateway should be responsible for path transformations
|
||||
|
||||
Currently, storage providers are aware af their mount point, coupling them tightly with the gateway.
|
||||
|
||||
Tracked in https://github.com/cs3org/reva/issues/578
|
||||
|
||||
Work is done in https://github.com/cs3org/reva/pull/1866
|
||||
|
||||
## URL escaped string representation of a CS3 reference
|
||||
|
||||
For the spaces concept we introduced the `/dav/spaces/` endpoint. It encodes a cs3 *reference* in a URL compatible way.
|
||||
1. We can separate the path using a `/`: `/dav/spaces/<spaceid>/<path>`
|
||||
2. The `spaceid` currently is a cs3 resourceid, consisting of `<storageid>` and `<opaqueid>`. Since the opaqueid might contain `/` e.g. for the local driver we have to urlencode the spaceid.
|
||||
|
||||
To access resources by id we need to make the `/dav/meta/<resourceid>` able to list directories... Otherwise id based navigation first has to look up the path. Or we use the libregraph api for id based navigation.
|
||||
|
||||
A *reference* is a logical concept. It identifies a [*resource*]({{< ref "#resources" >}}) and consists of a `<resource_id>` and a `<path>`. A `<resource_id>` consists of a `<storage_id>` and a `<node_id>`. They can be concatenated using the separators `!` and `:`:
|
||||
```
|
||||
<storage_id>!<node_id>:<path>
|
||||
```
|
||||
While all components are optional, only three cases are used:
|
||||
| format | example | description |
|
||||
|-|-|-|
|
||||
| `!:<absolute_path>` | `!:/absolute/path/to/file.ext` | absolute path |
|
||||
| `<storage_space>!:<relative_path>` | `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!:path/to/file.ext` | path relative to the root of the storage space |
|
||||
| `<storage_space>!<root>:<relative_path>` | `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!c3cf23bb-8f47-4719-a150-1d25a1f6fb56:to/file.ext` | path relative to the specified node in the storage space, used to reference resources without disclosing parent paths |
|
||||
|
||||
`<storage_space>` should be a UUID to prevent references from breaking when a *user* or [*storage space*]({{< ref "#storage-spaces" >}}) gets renamed. But it can also be derived from a migration of an oc10 instance by concatenating an instance identifier and the numeric storage id from oc10, e.g. `oc10-instance-a$1234`.
|
||||
|
||||
A reference will often start as an absolute/global path, e.g. `!:/home/Projects/Foo`. The gateway will look up the storage provider that is responsible for the path
|
||||
|
||||
| Name | Description | Who resolves it? |
|
||||
|------|-------------|-|
|
||||
| `!:/home/Projects/Foo` | the absolute path a client like davfs will use. | The gateway uses the storage registry to look up the responsible storage provider |
|
||||
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!:/Projects/Foo` | the `storage_space` is the same as the `root`, the path becomes relative to the root | the storage provider can use this reference to identify this resource |
|
||||
|
||||
Now, the same file is accessed as a share
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| `!:/users/Einstein/Projects/Foo` | `Foo` is the shared folder |
|
||||
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:` | `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a` is the id of `Foo`, the path is empty |
|
||||
|
||||
|
||||
The `:`, `!` and `$` are chosen from the set of [RFC3986 sub delimiters](https://tools.ietf.org/html/rfc3986#section-2.2) on purpose. They can be used in URLs without having to be encoded. In some cases, a delimiter can be left out if a component is not set:
|
||||
| reference | interpretation |
|
||||
|-|-|
|
||||
| `/absolute/path/to/file.ext` | absolute path, all delimiters omitted |
|
||||
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!path/to/file.ext` | relative path in the given storage space, root delimiter `:` omitted |
|
||||
| `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:to/file.ext` | relative path in the given root node, storage space delimiter `!` omitted |
|
||||
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62!56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:` | node id in the given storage space, `:` must be present |
|
||||
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62` | root of the storage space, all delimiters omitted, can be distinguished by the `/` |
|
||||
|
||||
## space providers
|
||||
When looking up an id based resource the reference must use a logical space id, not a CS3 resource id. Otherwise id based requests, which only have a resourceid consisting of a storage id and a node id cannot be routed to the correct storage provider if the storage has moved from one storage provider to another.
|
||||
|
||||
if the registry routes based on the storageid AND the nodeid it has to keep a cache of all nodeids in order to route all requests for a storage space (which consists of storage it + nodeid) to the correct storage provider. the correct resourceid for a node in a storage space would be `<storageid>$<rootnodeid>!<nodeid>`. The `<storageid>$<rootnodeid>` part allow the storage registry to route all id based requests to the correct storage provider. This becomes relevant when the storage space was moved from one storage provider to another. The storage space id remains the same, but the internal address and port change.
|
||||
|
||||
TODO discuss to clarify further
|
||||
|
||||
## Storage drivers
|
||||
|
||||
### allow clients to send a uuid on upload
|
||||
iOS clients can only queue single requests to be executed in the background. They queue an upload and need to be able to identify the uploaded file after it has been uploaded to the server. The disconnected nature of the connection might cause workflows or manual user interaction with the file on the server to move the file to a different place or changing the content while the device is offline. However, on the device users might have marked the file as favorite or added it to other iOS specific collections. To be able to reliably identify the file the client can generate a `uuid` and attach it to the file metadata during the upload. While it is not necessary to look up files by this `uuid` having a second file id that serves exactly the same purpose as the `file id` is redundant.
|
||||
|
||||
Another aspect for the `file id` / `uuid` is that it must be a logical identifier that can be set, at least by internal systems. Without a writeable fileid we cannot restore backups or migrate storage spaces from one storage provider to another storage provider.
|
||||
|
||||
Technically, this means that every storage driver needs to have a map of a `uuid` to an internal resource identifier. This internal resource identifier can be
|
||||
- an eos fileid, because eos can look up files by id
|
||||
- an inode if the filesystem and the storage driver support looking up by inode
|
||||
- a path if the storage driver has no way of looking up files by id.
|
||||
- In this case other mechanisms like inotify, kernel audit or a fuse overlay might be used to keep the paths up to date.
|
||||
- to prevent excessive writes when deep folders are renamed a reverse map might be used: it will map the `uuid` to `<parentuuid>:<childname>`, in order to trade writes for reads
|
||||
- as a fallback a sync job can read the file id from the metadata of the resources and populate the uuid to internal id map.
|
||||
|
||||
The TUS upload can take metadata, for PUT we might need a header.
|
||||
|
||||
### Space id vs resource id vs storage id
|
||||
|
||||
We have `/dav/meta/<fileid>` where the `fileid` is a string that was returned by a PROPFIND or by the `/graph/v1.0/me/drives/` endpoint? That returns a space id and the root drive item which has an `id`
|
||||
|
||||
Does that `id` have a specific format? We currently concatenate as `<storageid>!<nodeid>`.
|
||||
|
||||
A request against `/dav/meta/fileid` will use the reva storage registry to look up a path.
|
||||
|
||||
What if the storage space is moved to another storage provider. This happens during a migration:
|
||||
|
||||
1. the current oc10 fileids need to be prefixed with at least the numeric storage id to shard them.
|
||||
|
||||
`123` becomes `instanceprefix$345!123` if we use a custom prefix that identifies an instance (so we can merge multiple instances into one ocis instance) and append the numeric storageid `345`. The pattern is `<instanceprefix>$<numericstorageid>!<fileid>`.
|
||||
|
||||
Every `<instanceprefix>$<numericstorageid>` identifies a space.
|
||||
|
||||
- [ ] the owncloudsql driver can return these spaceids when listing spaces.
|
||||
|
||||
Why does it not work if we just use the fileid of the root node in the db?
|
||||
|
||||
Say we have a space with three resources:
|
||||
`<instanceprefix>$<numericstorageid>!<fileid>`
|
||||
`instanceprefix$345!1`
|
||||
`instanceprefix$345!2`
|
||||
`instanceprefix$345!3`
|
||||
|
||||
All users have moved to ocis and the registry contains a regex to route all `instanceprefix.*` references to the storageprovider with the owncloudsql driver. It is up to the driver to locate the correct resource by using the filecache table. In this case the numeric storage id is unnecessary.
|
||||
|
||||
Now we migrate the space `345` to another storage driver:
|
||||
- the storage registry contains a new entry for `instanceprefix$345` to send all resource ids for that space to the new storage provider
|
||||
- the new storage driver has to take into account the full storageid because the nodeid may only be unique per storage space.
|
||||
|
||||
If we now have to fetch the path on the `/dav/meta/` endpoint:
|
||||
`/dav/meta/instanceprefix$345!1`
|
||||
`/dav/meta/instanceprefix$345!2`
|
||||
`/dav/meta/instanceprefix$345!3`
|
||||
|
||||
This would work because the registry always sees `instanceprefix$345` as the storageid.
|
||||
|
||||
Now if we use the fileids directly and leave out the numeric storageid:
|
||||
`<instanceprefix>!<fileid>`
|
||||
`instanceprefix!1`
|
||||
`instanceprefix!2`
|
||||
`instanceprefix!3`
|
||||
|
||||
This is the current `<storageid>!<nodeid>` format.
|
||||
|
||||
The reva storage registry contains a `instanceid` entry pointing to the storage provider with the owncloudsql driver.
|
||||
|
||||
Resources can be looked up because the oc_filecache has a unique fileid over all storages.
|
||||
|
||||
Now we again migrate the space `345` to another storage driver:
|
||||
- the storage registry contains a new entry for `instanceprefix!1` so the storage space root now points to the new storage provider
|
||||
- The registry needs to be aware of node ids to route properly. This is a no-go. We don't want to keep a cache of *all* nodeids in the registry. Only the root nodes of spaces.
|
||||
- The new storage driver only has a nodeid which might collide with other nodeids from other storage spaces, e.g. when two instances are imported into one ocis instance. Although it would be possible to just set up two storage providers extra care would have to be taken to prevent nodeid collisions when importing a space.
|
||||
|
||||
If we now have to fetch the path on the `/dav/meta/` endpoint:
|
||||
`/dav/meta/instanceprefix!1` would work because it is the root of a space
|
||||
`/dav/meta/instanceprefix!2` would cause the gateway to poll all storage providers because the registry has no way to determine the responsible storage provider
|
||||
`/dav/meta/instanceprefix!3` same
|
||||
|
||||
The problem is that without a part in the storageid that allows differentiating storage spaces we cannot route them individually.
|
||||
|
||||
Now, we could use the nodeid of the root of a storage space as the spaceid ... if it is a uuid. If it is numeric it needs a prefix to distinguish it from other spaces.
|
||||
`<space-root-uuid>!<fileid>` would be easy for the decomposedfs.
|
||||
eos might use numeric ids: `<eosprefix>$<space-root-fileid>!<fileid>`, but it needs a custom prefix to distinguish multiple eos instances.
|
||||
|
||||
Furthermore, when migrating spaces between storage providers we want to stay collision free, which is why we should recommend uuids.
|
||||
|
||||
All this has implications for the decomposedfs, because it needs to split the nodes per space to prevent them from colliding.
|
||||
@@ -0,0 +1,208 @@
|
||||
---
|
||||
title: "Spaces"
|
||||
date: 2020-04-27T18:46:00+01:00
|
||||
weight: 38
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: spaces.md
|
||||
---
|
||||
|
||||
{{< toc >}}
|
||||
|
||||
## Editing a Storage Space
|
||||
|
||||
The OData specification allows for a mirage of ways of addressing an entity. We will support addressing a Drive entity by its unique identifier, which is the one the graph-api returns when listing spaces, and its format is:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "1284d238-aa92-42ce-bdc4-0b0000009157!b6e2c9cc-9dbe-42f0-b522-4f2d3e175e9c"
|
||||
}
|
||||
```
|
||||
|
||||
This is an extract of an element of the list spaces response. An entire object has the following shape:
|
||||
|
||||
```json
|
||||
{
|
||||
"driveType": "project",
|
||||
"id": "1284d238-aa92-42ce-bdc4-0b0000009157!b6e2c9cc-9dbe-42f0-b522-4f2d3e175e9c",
|
||||
"lastModifiedDateTime": "2021-10-07T11:06:43.245418+02:00",
|
||||
"name": "marketing",
|
||||
"owner": {
|
||||
"user": {
|
||||
"id": "ddc2004c-0977-11eb-9d3f-a793888cd0f8"
|
||||
}
|
||||
},
|
||||
"quota": {
|
||||
"total": 65536
|
||||
},
|
||||
"root": {
|
||||
"id": "1284d238-aa92-42ce-bdc4-0b0000009157!b6e2c9cc-9dbe-42f0-b522-4f2d3e175e9c",
|
||||
"webDavUrl": "https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157!b6e2c9cc-9dbe-42f0-b522-4f2d3e175e9c"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Updating a space property
|
||||
|
||||
Having introduced the above, one can refer to a Drive with the following URL format:
|
||||
|
||||
```console
|
||||
'https://localhost:9200/graph/v1.0/drives/1284d238-aa92-42ce-bdc4-0b0000009157!07c26b3a-9944-4f2b-ab33-b0b326fc7570
|
||||
```
|
||||
|
||||
Updating an entity attribute:
|
||||
|
||||
```console
|
||||
curl -X PATCH 'https://localhost:9200/graph/v1.0/drives/1284d238-aa92-42ce-bdc4-0b0000009157!07c26b3a-9944-4f2b-ab33-b0b326fc7570' -d '{"name":"42"}' -v
|
||||
```
|
||||
|
||||
The previous URL resource path segment (`1284d238-aa92-42ce-bdc4-0b0000009157!07c26b3a-9944-4f2b-ab33-b0b326fc7570`) is parsed and handed over to the storage registry in order to apply the patch changes in the body, in this case update the space name attribute to `42`. Since space names are not unique we only support addressing them by their unique identifiers, any other query would render too ambiguous and explode in complexity.
|
||||
|
||||
|
||||
### Updating a space description
|
||||
|
||||
Since every space is the root of a webdav directory, following some conventions we can make use of this to set a default storage description and image. In order to do so, every space is created with a hidden `.space` folder at its root, which can be used to store such data.
|
||||
|
||||
```curl
|
||||
curl -k -X PUT https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157\!07c26b3a-9944-4f2b-ab33-b0b326fc7570/.space/description.md -d "Add a description to your spaces" -u admin:admin
|
||||
```
|
||||
|
||||
Verify the description was updated:
|
||||
|
||||
```curl
|
||||
❯ curl -k https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157\!07c26b3a-9944-4f2b-ab33-b0b326fc7570/.space/description.md -u admin:admin
|
||||
Add a description to your spaces
|
||||
```
|
||||
|
||||
This feature makes use of the internal storage layout and is completely abstracted from the end user.
|
||||
|
||||
### Quotas
|
||||
|
||||
Spaces capacity (quota) is independent of the Storage quota. As a Space admin you can set the quota for all users of a space, and as such, there are no limitations and is up to the admin to make a correct use of this.
|
||||
|
||||
It is possible to have a space quota greater than the storage quota. A Space may also have "infinite" quota, meaning a single space without quota can occupy the entirety of a disk.
|
||||
|
||||
#### Quota Enforcement
|
||||
|
||||
Creating a Space with a quota of 10 bytes:
|
||||
|
||||
`curl -k -X POST 'https://localhost:9200/graph/v1.0/drives' -u admin:admin -d '{"name":"marketing", "quota": {"total": 10}}' -v`
|
||||
|
||||
```console
|
||||
/var/tmp/ocis/storage/users
|
||||
├── blobs
|
||||
├── nodes
|
||||
│ ├── 627981c2-2a71-4adf-b680-177e245afdda
|
||||
│ ├── 9541e7c3-8fda-4b49-b697-e7e51457cf5a
|
||||
│ ├── b5692345-108d-4b80-9747-3a7e9739ad57
|
||||
│ └── root
|
||||
│ ├── 118351d7-67a4-4cdf-b495-6093d1e572ed -> ../627981c2-2a71-4adf-b680-177e245afdda
|
||||
│ └── ddc2004c-0977-11eb-9d3f-a793888cd0f8 -> ../b5692345-108d-4b80-9747-3a7e9739ad57
|
||||
├── spaces
|
||||
│ ├── personal
|
||||
│ │ └── b5692345-108d-4b80-9747-3a7e9739ad57 -> ../../nodes/b5692345-108d-4b80-9747-3a7e9739ad57
|
||||
│ ├── project
|
||||
│ │ └── 627981c2-2a71-4adf-b680-177e245afdda -> ../../nodes/627981c2-2a71-4adf-b680-177e245afdda
|
||||
│ └── share
|
||||
├── trash
|
||||
└── uploads
|
||||
```
|
||||
|
||||
Verify the new space has 10 bytes, and none of it is used:
|
||||
|
||||
```json
|
||||
{
|
||||
"driveType": "project",
|
||||
"id": "1284d238-aa92-42ce-bdc4-0b0000009157!627981c2-2a71-4adf-b680-177e245afdda",
|
||||
"lastModifiedDateTime": "2021-10-15T11:16:26.029188+02:00",
|
||||
"name": "marketing",
|
||||
"owner": {
|
||||
"user": {
|
||||
"id": "ddc2004c-0977-11eb-9d3f-a793888cd0f8"
|
||||
}
|
||||
},
|
||||
"quota": {
|
||||
"remaining": 10,
|
||||
"total": 10,
|
||||
"used": 0
|
||||
},
|
||||
"root": {
|
||||
"id": "1284d238-aa92-42ce-bdc4-0b0000009157!627981c2-2a71-4adf-b680-177e245afdda",
|
||||
"webDavUrl": "https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157!627981c2-2a71-4adf-b680-177e245afdda"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Upload a 6 bytes file:
|
||||
|
||||
`curl -k -X PUT https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157\!627981c2-2a71-4adf-b680-177e245afdda/6bytes.txt -d "012345" -u admin:admin -v`
|
||||
|
||||
Query the quota again:
|
||||
|
||||
```json
|
||||
{
|
||||
"quota": {
|
||||
"remaining": 4,
|
||||
"total": 10,
|
||||
"used": 6
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Now attempt to upload 5 bytes to the space:
|
||||
|
||||
`curl -k -X PUT https://localhost:9200/dav/spaces/1284d238-aa92-42ce-bdc4-0b0000009157\!627981c2-2a71-4adf-b680-177e245afdda/5bytes.txt -d "01234" -u admin:admin -v`
|
||||
|
||||
The request will fail with `507 Insufficient Storage`:
|
||||
|
||||
```
|
||||
HTTP/1.1 507 Insufficient Storage
|
||||
< Access-Control-Allow-Origin: *
|
||||
< Content-Length: 0
|
||||
< Content-Security-Policy: default-src 'none';
|
||||
< Date: Fri, 15 Oct 2021 09:24:46 GMT
|
||||
< Vary: Origin
|
||||
< X-Content-Type-Options: nosniff
|
||||
< X-Download-Options: noopen
|
||||
< X-Frame-Options: SAMEORIGIN
|
||||
< X-Permitted-Cross-Domain-Policies: none
|
||||
< X-Robots-Tag: none
|
||||
< X-Xss-Protection: 1; mode=block
|
||||
<
|
||||
* Connection #0 to host localhost left intact
|
||||
* Closing connection 0
|
||||
```
|
||||
|
||||
##### Considerations
|
||||
|
||||
- If a Space quota is updated to unlimited, the upper limit is the entire available space on disk
|
||||
{{< hint warning >}}
|
||||
|
||||
The current implementation in oCIS might not yet fully reflect this concept. Feel free to add links to ADRs, PRs and Issues in short warning boxes like this.
|
||||
|
||||
{{< /hint >}}
|
||||
|
||||
## Storage Spaces
|
||||
A storage *space* is a logical concept. It organizes a set of [*resources*]({{< ref "#resources" >}}) in a hierarchical tree. It has a single *owner* (*user* or *group*),
|
||||
a *quota*, *permissions* and is identified by a `storage space id`.
|
||||
|
||||
{{< figure src="/ocis/storage/static/storagespace.drawio.svg" >}}
|
||||
|
||||
Examples would be every user's personal storage *space*, project storage *spaces* or group storage *spaces*. While they all serve different purposes and may or may not have workflows like antivirus 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. A storage [*Spaces Registry*]({{< ref "./spacesregistry.md" >}}) then allows listing the capabilities of storage *spaces*, e.g. free space, quota, owner, syncable, root etag, upload workflow steps, ...
|
||||
|
||||
Finally, a logical `storage space id` is not tied to a specific [*spaces provider*]({{< ref "./spacesprovider.md" >}}). If the [*storage driver*]({{< ref "./storagedrivers.md" >}}) supports it, we can import existing files including their `file id`, which makes it possible to move storage *spaces* between [*spaces providers*]({{< ref "./spacesprovider.md" >}}) to implement storage classes, e.g. with or without archival, workflows, on SSDs or HDDs.
|
||||
|
||||
## Shares
|
||||
*To be clarified: we are aware that [*storage spaces*]({{< ref "#storage-spaces" >}}) may be too 'heavyweight' for ad hoc sharing with groups. That being said, there is no technical reason why group shares should not be treated like storage [*spaces*]({{< ref "#storage-spaces" >}}) that users can provision themselves. They would share the quota with the users home or personal storage [*space*]({{< ref "#storage-spaces" >}}) and the share initiator would be the sole owner. Technically, the mechanism of treating a share like a new storage [*space*]({{< ref "#storage-spaces" >}}) would be the same. This obviously also extends to user shares and even file individual shares that would be wrapped in a virtual collection. It would also become possible to share collections of arbitrary files in a single storage space, e.g. the ten best pictures from a large album.*
|
||||
|
||||
## Notes
|
||||
|
||||
We can implement [ListStorageSpaces](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ListStorageSpacesRequest) by either
|
||||
- iterating over the root of the storage and treating every folder following the `<user_layout>` as a `home` *storage space*,
|
||||
- iterating over the root of the storage and treating every folder following a new `<project_layout>` as a `project` *storage space*, or
|
||||
- iterating over the root of the storage and treating every folder following a generic `<layout>` as a *storage space* for a configurable space type, or
|
||||
- we allow configuring a map of `space type` to `layout` (based on the [CreateStorageSpaceRequest](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.CreateStorageSpaceRequest)) which would allow things like
|
||||
```
|
||||
home=/var/lib/ocis/storage/home/{{substr 0 1 .Owner.Username}}/{{.Owner.Username}}
|
||||
spaces=/spaces/var/lib/ocis/storage/projects/{{.Name}}
|
||||
```
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: "Spaces Provider"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 6
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: spacesprovider.md
|
||||
---
|
||||
|
||||
{{< hint warning >}}
|
||||
|
||||
The current implementation in oCIS might not yet fully reflect this concept. Feel free to add links to ADRs, PRs and Issues in short warning boxes like this.
|
||||
|
||||
{{< /hint >}}
|
||||
|
||||
## Spaces Provider
|
||||
A *storage provider* manages [*resources*]({{< ref "#resources" >}}) identified by a [*reference*]({{< ref "#references" >}})
|
||||
by accessing a [*storage system*]({{< ref "#storage-systems" >}}) with a [*storage driver*]({{< ref "./storagedrivers.md" >}}).
|
||||
|
||||
{{< figure src="/ocis/storage/static/spacesprovider.drawio.svg" >}}
|
||||
|
||||
|
||||
## Frontend
|
||||
|
||||
The oCIS frontend service starts all services that handle incoming HTTP requests:
|
||||
- *ocdav* for ownCloud flavoured WebDAV
|
||||
- *ocs* for sharing, user provisioning, capabilities and other OCS API endpoints
|
||||
- *datagateway* for up and downloads
|
||||
- TODO: *ocm*
|
||||
|
||||
{{< figure src="/ocis/storage/static/frontend.drawio.svg" >}}
|
||||
|
||||
### WebDAV
|
||||
|
||||
The ocdav service not only handles all WebDAV requests under `(remote.php/)(web)dav` but also some other legacy endpoints like `status.php`:
|
||||
|
||||
| endpoint | service | CS3 api | CS3 namespace | description | TODO |
|
||||
|----------|---------|-------------|------|------|------|
|
||||
| *ownCloud 10 / current ocis setup:* |||||
|
||||
| `status.php` | ocdav | - | - | currently static | should return compiled version and dynamic values |
|
||||
| `(remote.php/)webdav` | ocdav | storageprovider | `/home` | the old webdav endpoint | |
|
||||
| `(remote.php/)dav/files/<username>` | ocdav | storageprovider | `/home` | the new webdav endpoint | |
|
||||
| `(remote.php/)dav/meta/<fileid>/v` | ocdav | storageprovider | id based | versions | |
|
||||
| `(remote.php/)dav/trash-bin/<username>` | ocdav | recycle | - | trash | should aggregate the trash of [*storage spaces*]({{< ref "./terminology.md#storage-spaces" >}}) the user has access to |
|
||||
| `(remote.php/)dav/public-files/<token>` | ocdav | storageprovider | `/public/<token>` | public links | |
|
||||
| `(remote.php/)dav/avatars/<username>` | ocdav | - | - | avatars, hardcoded | look up from user provider and cache |
|
||||
| *CernBox setup:* |||||
|
||||
| `(remote.php/)webdav` | ocdav | storageprovider | `/` | | |
|
||||
| *Note: existing folder sync pairs in legacy clients will break when moving the user home down in the path hierarchy* |||||
|
||||
| `(remote.php/)webdav/home` | ocdav | storageprovider | `/home` | | |
|
||||
| `(remote.php/)webdav/users` | ocdav | storageprovider | `/users` | | |
|
||||
| `(remote.php/)dav/files/<username>` | ocdav | storageprovider | `/users/<user_layout>` | | |
|
||||
| *Spaces concept also needs a new endpoint:* |||||
|
||||
| `(remote.php/)dav/spaces/<spaceid>/<relative_path>` | ocdav | storageregistry & storageprovider | bypass path based namespace and directly talk to the responsible storage provider using a relative path | [spaces concept](https://github.com/owncloud/ocis/pull/1827) needs to point to storage [*spaces*]({{< ref "./spaces.md" >}}) | allow accessing spaces, listing is done by the graph api |
|
||||
|
||||
|
||||
The correct endpoint for a users home storage [*space*]({{< ref "./spaces.md" >}}) in oc10 is `remote.php/dav/files/<username>`. In oc10 all requests at this endpoint use a path based reference that is relative to the users home. In oCIS this can be configured and defaults to `/home` as well. Other API endpoints like ocs and the web UI still expect this to be the users home.
|
||||
|
||||
In oc10 we originally had `remote.php/webdav` which would render the current users home [*storage space*]({{< ref "./terminology.md#storage-spaces" >}}). The early versions (pre OC7) would jail all received shares into a `remote.php/webdav/shares` subfolder. The semantics for syncing such a folder are [not trivially predictable](https://github.com/owncloud/core/issues/5349), which is why we made shares [freely mountable](https://github.com/owncloud/core/pull/8026) anywhere in the users home.
|
||||
|
||||
The current reva implementation jails shares into a `remote.php/webdav/Shares` folder for performance reasons. Obviously, this brings back the [special semantics for syncing](https://github.com/owncloud/product/issues/7). In the future we will follow [a different solution](https://github.com/owncloud/product/issues/302) and jail the received shares into a dedicated `/shares` space, on the same level as `/home` and `/spaces`. We will add a dedicated [API to list all *storage spaces*](https://github.com/owncloud/ocis/pull/1827) a user has access to and where they are mounted in the users *namespace*.
|
||||
|
||||
{{< hint warning >}}
|
||||
TODO rewrite this hint with `/dav/spaces`
|
||||
Existing folder sync pairs in legacy clients will break when moving the user home down in the path hierarchy like CernBox did.
|
||||
For legacy clients the `remote.php/webdav` endpoint will no longer list the users home directly, but instead present the different types of storage spaces:
|
||||
- `remote.php/webdav/home`: the users home is pushed down into a new `home` [*storage space*]({{< ref "./terminology.md#storage-spaces" >}})
|
||||
- `remote.php/webdav/shares`: all mounted shares will be moved to a new `shares` [*storage space*]({{< ref "./terminology.md#storage-spaces" >}})
|
||||
- `remote.php/webdav/spaces`: other [*storage spaces*]({{< ref "./terminology.md#storage-spaces" >}}) the user has access to, e.g. group or project drives
|
||||
{{< /hint >}}
|
||||
|
||||
|
||||
### Sharing
|
||||
|
||||
The [OCS Share API](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html) endpoint `/ocs/v1.php/apps/files_sharing/api/v1/shares` returns shares, which have their own share id and reference files using a path relative to the users home. They API also lists the numeric storage id as well as the string type `storage_id` (which is confusing ... but yeah) which would allow constructing combined references with a `storage space id` and a `path` relative to the root of that [*storage space*]({{< ref "./terminology.md#storage-spaces" >}}). The web UI however assumes that it can take the path from the `file_target` and append it to the users home to access it.
|
||||
|
||||
{{< hint >}}
|
||||
The API [already returns the storage id](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html#example-request-response-payloads-4) (and numeric id) in addition to the file id:
|
||||
```
|
||||
<storage_id>home::auser</storage_id>
|
||||
<storage>993</storage>
|
||||
<item_source>3994486</item_source>
|
||||
<file_source>3994486</file_source>
|
||||
<file_parent>3994485</file_parent>
|
||||
<file_target>/Shared/Paris.jpg</file_target>
|
||||
```
|
||||
[Creating shares only takes the **path** as the argument](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html#function-arguments) so creating and navigating shares only needs the path. When you update or delete a share it takes the `share id` not the `file id`.
|
||||
{{< /hint >}}
|
||||
|
||||
The OCS service makes a stat request to the storage provider to get a [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) object. It contains both, a [`ResourceId`](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId) *and* an absolute path. If the *resource* exists a request is sent to the gateway. Depending on the type of share the [Collaboration API](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.CollaborationAPI), the [Link API](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.LinkAPI) or the [Open Cloud Mesh API](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.OcmAPI) endpoints are used.
|
||||
|
||||
| API | Request | Resource identified by | Grant type | Further arguments |
|
||||
|-----|---------|------------------------|------------|-------------------|
|
||||
| Collaboration | [CreateShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.CreateShareRequest) | [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) | [ShareGrant](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.ShareGrant) | - |
|
||||
| Link | [CreatePublicShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.CreatePublicShareRequest) | [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) | Link [Grant](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.Grant) | We send the public link `name` in the `ArbitraryMetadata` of the `ResourceInfo` |
|
||||
| Open Cloud Mesh | [CreateOCMShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.CreateOCMShareRequest) | [ResourceId](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId) | OCM [ShareGrant](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.ShareGrant) | OCM [ProviderInfo](https://cs3org.github.io/cs3apis/#cs3.ocm.provider.v1beta1.ProviderInfo) |
|
||||
|
||||
|
||||
{{< hint >}}
|
||||
The user and public share provider implementations identify the file using the [`ResourceId`](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId). The [`ResourceInfo`](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) is passed so the share provider can also store who the owner of the resource is. The *path* is not part of the other API calls, e.g. when listing shares.
|
||||
The OCM API takes an id based reference on the CS3 api, even if the OCM HTTP endpoint takes a path argument. *@jfd: Why? Does it not need the owner? It only stores the owner of the share, which is always the currently logged-in user, when creating a share. Afterwards only the owner can update a share ... so collaborative management of shares is not possible. At least for OCM shares.*
|
||||
{{< /hint >}}
|
||||
|
||||
|
||||
## REVA Storage Registry
|
||||
|
||||
The reva *storage registry* manages the [*CS3 global namespace*]({{< ref "./namespaces.md#cs3-global-namespaces" >}}):
|
||||
It is used by the reva *gateway*
|
||||
to look up `address` and `port` of the [*storage provider*]({{< ref "#storage-providers" >}})
|
||||
that should handle a [*reference*]({{< ref "#references" >}}).
|
||||
|
||||
{{< figure src="/ocis/storage/static/storageregistry.drawio.svg" >}}
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: "Spaces Registry"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 9
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: spacesregistry.md
|
||||
---
|
||||
|
||||
{{< hint warning >}}
|
||||
|
||||
The current implementation in oCIS might not yet fully reflect this concept. Feel free to add links to ADRs, PRs and Issues in short warning boxes like this.
|
||||
|
||||
{{< /hint >}}
|
||||
|
||||
## Storage Space Registries
|
||||
|
||||
A storage *spaces registry* manages the [*namespace*]({{< ref "./namespaces.md" >}}) for a *user*: it is used by *clients* to look up storage spaces a user has access to, the `/dav/spaces` endpoint to access it via WabDAV, and where the client should mount it in the users personal namespace.
|
||||
|
||||
{{< figure src="/ocis/storage/static/spacesregistry.drawio.svg" >}}
|
||||
@@ -0,0 +1,303 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-0.5 -0.5 1154 474" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<path d="M 8 71 L 317.87 70.73" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 323.87 70.73 L 315.87 74.73 L 317.87 70.73 L 315.86 66.73 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 62px; margin-left: 162px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
GET /data/<transfer_token>
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="162" y="65" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
GET /da...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 8 132 L 317.87 132.21" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 323.87 132.21 L 315.86 136.21 L 317.87 132.21 L 315.87 128.21 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 122px; margin-left: 162px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
PROPFIND /webdav
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="162" y="125" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
PROPFIN...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 8 228 L 317.87 227.74" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 323.87 227.73 L 315.87 231.74 L 317.87 227.74 L 315.86 223.74 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 194px; margin-left: 152px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<font face="Courier New">
|
||||
POST /ocs/v1/apps/files_sharing/api/v1/shares
|
||||
</font>
|
||||
</div>
|
||||
<div style="text-align: left">
|
||||
<font face="Courier New">
|
||||
path=/path/to/file
|
||||
</font>
|
||||
</div>
|
||||
<div style="text-align: left">
|
||||
<font face="Courier New">
|
||||
shareType=0
|
||||
</font>
|
||||
</div>
|
||||
<div style="text-align: left">
|
||||
<font face="Courier New">
|
||||
shareWith=<username>
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="152" y="197" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
POST /o...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="308" y="2" width="217" height="326.31" rx="8.68" ry="8.68" fill="none" stroke="#505050" stroke-width="5" 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 flex-start; justify-content: unsafe center; width: 189px; height: 1px; padding-top: 22px; margin-left: 322px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
frontend
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="417" y="34" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
frontend
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="500.13" y="293.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,515.77,317.92)" pointer-events="all"/>
|
||||
<rect x="495.35" y="296.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 500.79 315.89 L 496.28 313.98 C 495.62 313.61 495.35 313.08 495.6 312.32 L 497.32 308.13 C 497.7 307.5 498.19 307.14 498.96 307.45 L 503.18 309.61 C 504.53 307.99 506 306.38 507.64 304.98 L 505.79 300.38 C 505.65 299.83 505.6 299.29 506.38 298.78 L 510.62 296.96 C 511.43 296.7 511.89 297.05 512.16 297.54 L 514.06 302.25 C 515.96 301.87 517.85 301.69 520.07 302.36 L 521.98 297.57 C 522.39 296.9 522.93 296.72 523.57 296.96 L 527.79 298.78 C 528.48 299.22 528.55 299.76 528.38 300.32 L 526.51 305.04 C 528.15 306.38 529.67 307.82 530.9 309.44 L 535.44 307.55 C 536.26 307.32 536.74 307.64 537.04 308.25 L 538.82 312.54 C 538.94 313.17 538.8 313.7 538.19 314.06 L 533.57 315.96 C 533.79 317.8 533.77 320.1 533.56 322.13 L 538.18 324.03 C 538.8 324.42 539.07 324.93 538.87 325.59 L 537.21 329.61 C 536.88 330.13 536.42 330.4 535.75 330.23 L 531.09 328.32 C 529.87 330.02 528.34 331.53 526.62 332.84 L 528.46 337.47 C 528.75 338.2 528.37 338.83 527.94 339.06 L 523.47 340.96 C 522.87 341.06 522.33 341.02 522.07 340.25 L 520.18 335.52 C 518.48 336.01 516.36 336.13 514.19 335.57 L 512.32 340.23 C 512.02 340.72 511.68 341.15 510.85 340.94 L 506.49 339.1 C 505.87 338.65 505.59 338.1 505.98 337.34 L 508.05 333.14 C 506.22 331.74 504.69 330.24 503.49 328.65 L 499.04 330.51 C 498.34 330.77 497.77 330.59 497.37 329.94 L 495.59 325.6 C 495.4 325.04 495.55 324.36 496.21 324.03 L 500.81 322 C 500.63 319.96 500.61 317.93 500.79 315.89 Z M 505.76 318.84 C 505.76 326.05 511.6 330.52 517.3 330.52 C 523.5 330.52 528.61 325.18 528.61 318.95 C 528.61 312.28 523.1 307.28 517.33 307.28 C 511.69 307.28 505.76 311.61 505.76 318.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="326.1" y="38.17" width="183.38" height="65.11" rx="9.77" ry="9.77" fill="none" stroke="#505050" stroke-dasharray="3 3" 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: 181px; height: 1px; padding-top: 71px; margin-left: 327px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
datagateway
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="418" y="74" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
datagateway
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="326.1" y="110.51" width="183.38" height="86.81" rx="13.02" ry="13.02" fill="none" stroke="#505050" stroke-dasharray="3 3" 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: 181px; height: 1px; padding-top: 154px; margin-left: 327px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
ocdav
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="418" y="158" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
ocdav
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="326.1" y="206.55" width="183.38" height="84.71" rx="12.71" ry="12.71" fill="none" stroke="#505050" stroke-dasharray="3 3" 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: 181px; height: 1px; padding-top: 249px; margin-left: 327px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
ocs
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="418" y="253" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
ocs
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="678" y="96" width="217" height="232.31" rx="8.68" ry="8.68" fill="none" stroke="#505050" stroke-width="5" 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 flex-start; justify-content: unsafe center; width: 189px; height: 1px; padding-top: 116px; margin-left: 692px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
gateway
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="786" y="128" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
gateway
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="870.13" y="293.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,885.77,317.92)" pointer-events="all"/>
|
||||
<rect x="865.34" y="296.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 870.79 315.89 L 866.27 313.98 C 865.61 313.61 865.34 313.08 865.6 312.32 L 867.32 308.13 C 867.69 307.5 868.19 307.14 868.96 307.45 L 873.18 309.61 C 874.52 307.99 876 306.38 877.63 304.98 L 875.78 300.38 C 875.65 299.83 875.59 299.29 876.37 298.78 L 880.61 296.96 C 881.42 296.7 881.88 297.05 882.16 297.54 L 884.05 302.25 C 885.96 301.87 887.84 301.69 890.07 302.36 L 891.97 297.57 C 892.38 296.9 892.92 296.72 893.56 296.96 L 897.78 298.78 C 898.48 299.22 898.54 299.76 898.38 300.32 L 896.5 305.04 C 898.15 306.38 899.67 307.82 900.89 309.44 L 905.43 307.55 C 906.25 307.32 906.73 307.64 907.04 308.25 L 908.81 312.54 C 908.93 313.17 908.79 313.7 908.18 314.06 L 903.57 315.96 C 903.79 317.8 903.76 320.1 903.56 322.13 L 908.17 324.03 C 908.79 324.42 909.06 324.93 908.87 325.59 L 907.2 329.61 C 906.87 330.13 906.41 330.4 905.75 330.23 L 901.09 328.32 C 899.86 330.02 898.33 331.53 896.61 332.84 L 898.45 337.47 C 898.74 338.2 898.37 338.83 897.94 339.06 L 893.46 340.96 C 892.87 341.06 892.33 341.02 892.06 340.25 L 890.18 335.52 C 888.47 336.01 886.35 336.13 884.18 335.57 L 882.31 340.23 C 882.01 340.72 881.67 341.15 880.85 340.94 L 876.48 339.1 C 875.87 338.65 875.58 338.1 875.98 337.34 L 878.05 333.14 C 876.22 331.74 874.69 330.24 873.49 328.65 L 869.04 330.51 C 868.33 330.77 867.77 330.59 867.36 329.94 L 865.59 325.6 C 865.4 325.04 865.54 324.36 866.2 324.03 L 870.81 322 C 870.62 319.96 870.6 317.93 870.79 315.89 Z M 875.76 318.84 C 875.76 326.05 881.6 330.52 887.29 330.52 C 893.49 330.52 898.61 325.18 898.61 318.95 C 898.61 312.28 893.1 307.28 887.33 307.28 C 881.68 307.28 875.76 311.61 875.76 318.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="918" y="2" width="217" height="216.31" rx="8.65" ry="8.65" fill="none" stroke="#505050" stroke-width="5" 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 flex-start; justify-content: unsafe center; width: 189px; height: 1px; padding-top: 22px; margin-left: 932px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
storage home | users | ...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1026" y="34" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
storage home | users | ...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1110.13" y="183.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,1125.77,207.92)" pointer-events="all"/>
|
||||
<rect x="1105.34" y="186.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
|
||||
<path d="M 1110.79 205.89 L 1106.27 203.98 C 1105.61 203.61 1105.34 203.08 1105.6 202.32 L 1107.32 198.13 C 1107.69 197.5 1108.19 197.14 1108.96 197.45 L 1113.18 199.61 C 1114.52 197.99 1116 196.38 1117.63 194.98 L 1115.78 190.38 C 1115.65 189.83 1115.59 189.29 1116.37 188.78 L 1120.61 186.96 C 1121.42 186.7 1121.88 187.05 1122.16 187.54 L 1124.05 192.25 C 1125.96 191.87 1127.84 191.69 1130.07 192.36 L 1131.97 187.57 C 1132.38 186.9 1132.92 186.72 1133.56 186.96 L 1137.78 188.78 C 1138.48 189.22 1138.54 189.76 1138.38 190.32 L 1136.5 195.04 C 1138.15 196.38 1139.67 197.82 1140.89 199.44 L 1145.43 197.55 C 1146.25 197.32 1146.73 197.64 1147.04 198.25 L 1148.81 202.54 C 1148.93 203.17 1148.79 203.7 1148.18 204.06 L 1143.57 205.96 C 1143.79 207.8 1143.76 210.1 1143.56 212.13 L 1148.17 214.03 C 1148.79 214.42 1149.06 214.93 1148.87 215.59 L 1147.2 219.61 C 1146.87 220.13 1146.41 220.4 1145.75 220.23 L 1141.09 218.32 C 1139.86 220.02 1138.33 221.53 1136.61 222.84 L 1138.45 227.47 C 1138.74 228.2 1138.37 228.83 1137.94 229.06 L 1133.46 230.96 C 1132.87 231.06 1132.33 231.02 1132.06 230.25 L 1130.18 225.52 C 1128.47 226.01 1126.35 226.13 1124.18 225.57 L 1122.31 230.23 C 1122.01 230.72 1121.67 231.15 1120.85 230.94 L 1116.48 229.1 C 1115.87 228.65 1115.58 228.1 1115.98 227.34 L 1118.05 223.14 C 1116.22 221.74 1114.69 220.24 1113.49 218.65 L 1109.04 220.51 C 1108.33 220.77 1107.77 220.59 1107.36 219.94 L 1105.59 215.6 C 1105.4 215.04 1105.54 214.36 1106.2 214.03 L 1110.81 212 C 1110.62 209.96 1110.6 207.93 1110.79 205.89 Z M 1115.76 208.84 C 1115.76 216.05 1121.6 220.52 1127.29 220.52 C 1133.49 220.52 1138.61 215.18 1138.61 208.95 C 1138.61 202.28 1133.1 197.28 1127.33 197.28 C 1121.68 197.28 1115.76 201.61 1115.76 208.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
|
||||
<rect x="934.8" y="114.16" width="183.38" height="65.11" rx="9.77" ry="9.77" fill="none" stroke="#505050" stroke-dasharray="3 3" 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: 181px; height: 1px; padding-top: 147px; margin-left: 936px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
storageprovider
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1026" y="150" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
storageprovider
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="934.81" y="40.16" width="183.38" height="60" rx="9" ry="9" fill="none" stroke="#505050" stroke-dasharray="3 3" 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: 181px; height: 1px; padding-top: 70px; margin-left: 936px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
dataprovider
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1026" y="74" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
dataprovider
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 509.49 70.72 L 926.57 70.17" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 932.57 70.16 L 924.57 74.17 L 926.57 70.17 L 924.56 66.17 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 62px; margin-left: 717px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
GET target URL extracted from transfer token (JWT)
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="717" y="66" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
GET tar...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 509.49 153.91 L 669.76 154.07" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 675.76 154.08 L 667.76 158.07 L 669.76 154.07 L 667.77 150.07 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 132px; margin-left: 597px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
Stat
|
||||
<br/>
|
||||
ListContainer
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="597" y="135" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Stat...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 509.49 270.09 L 669.76 270.23" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 675.76 270.23 L 667.76 274.22 L 669.76 270.23 L 667.77 266.22 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 232px; margin-left: 597px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
Stat
|
||||
<br/>
|
||||
CreateShare
|
||||
<br/>
|
||||
CreatePublicShare
|
||||
<br/>
|
||||
CreateOCMShare
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="597" y="235" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Stat...
|
||||
</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: 30 KiB |
@@ -0,0 +1,341 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1157px" height="295px" viewBox="-0.5 -0.5 1157 295" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<path d="M 808 142.26 L 989.76 141.69" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 995.76 141.67 L 987.78 145.7 L 989.76 141.69 L 987.75 137.7 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 131px; margin-left: 908px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
/rel/path/to/file.ext
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="908" y="134" fill="#505050" font-family="Courier New" font-size="11px" text-anchor="middle">
|
||||
/rel/p...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 456.33 139.03 L 597.89 139.21" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 604.64 139.22 L 595.64 143.71 L 597.89 139.21 L 595.65 134.71 Z" fill="#505050" stroke="#505050" stroke-width="3" stroke-miterlimit="10" 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 flex-start; width: 1px; height: 1px; padding-top: 101px; margin-left: 470px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div>
|
||||
/
|
||||
<br/>
|
||||
</div>
|
||||
<div>
|
||||
/home
|
||||
</div>
|
||||
<div>
|
||||
/users/<user_layout>
|
||||
</div>
|
||||
<div>
|
||||
/public
|
||||
</div>
|
||||
<div>
|
||||
/shares
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="470" y="104" fill="#505050" font-family="Courier New" font-size="11px">
|
||||
/...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="998" y="83" width="148.03" height="117.34" rx="4.69" ry="4.69" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
|
||||
<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 flex-start; justify-content: unsafe center; width: 146px; height: 1px; padding-top: 90px; margin-left: 999px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
storage home
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1072" y="102" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
storage home
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1132.62" y="182.64" width="16.86" height="26.26" rx="2.53" ry="2.53" fill="#ffffff" stroke="none" transform="rotate(40,1141.05,195.77)" pointer-events="none"/>
|
||||
<path d="M 1132.98 194.66 L 1130.54 193.62 C 1130.19 193.42 1130.04 193.13 1130.18 192.71 L 1131.11 190.43 C 1131.31 190.09 1131.58 189.89 1131.99 190.06 L 1134.26 191.24 C 1134.99 190.35 1135.78 189.48 1136.67 188.71 L 1135.67 186.2 C 1135.6 185.9 1135.57 185.61 1135.99 185.33 L 1138.27 184.34 C 1138.71 184.2 1138.96 184.39 1139.11 184.65 L 1140.13 187.22 C 1141.15 187.02 1142.17 186.92 1143.37 187.28 L 1144.4 184.67 C 1144.62 184.31 1144.91 184.21 1145.25 184.34 L 1147.53 185.33 C 1147.91 185.57 1147.94 185.86 1147.85 186.17 L 1146.84 188.74 C 1147.73 189.48 1148.55 190.26 1149.21 191.14 L 1151.66 190.12 C 1152.09 189.99 1152.36 190.16 1152.52 190.5 L 1153.48 192.83 C 1153.54 193.18 1153.47 193.47 1153.14 193.66 L 1150.65 194.7 C 1150.77 195.7 1150.75 196.96 1150.64 198.06 L 1153.13 199.1 C 1153.47 199.31 1153.61 199.59 1153.51 199.95 L 1152.61 202.14 C 1152.43 202.43 1152.18 202.58 1151.82 202.48 L 1149.31 201.44 C 1148.65 202.37 1147.83 203.19 1146.9 203.91 L 1147.89 206.43 C 1148.05 206.83 1147.85 207.17 1147.61 207.3 L 1145.2 208.33 C 1144.88 208.39 1144.59 208.36 1144.45 207.95 L 1143.43 205.36 C 1142.51 205.63 1141.37 205.7 1140.2 205.39 L 1139.19 207.94 C 1139.03 208.2 1138.84 208.43 1138.4 208.32 L 1136.05 207.32 C 1135.72 207.07 1135.56 206.77 1135.77 206.36 L 1136.89 204.07 C 1135.9 203.3 1135.08 202.48 1134.43 201.62 L 1132.03 202.63 C 1131.65 202.77 1131.35 202.68 1131.13 202.32 L 1130.17 199.96 C 1130.07 199.65 1130.15 199.28 1130.5 199.1 L 1132.99 197.99 C 1132.89 196.88 1132.88 195.77 1132.98 194.66 Z M 1135.66 196.27 C 1135.66 200.2 1138.8 202.64 1141.87 202.64 C 1145.22 202.64 1147.97 199.72 1147.97 196.33 C 1147.97 192.69 1145 189.96 1141.89 189.96 C 1138.85 189.96 1135.66 192.33 1135.66 196.27 Z" fill="#505050" stroke="none" pointer-events="none"/>
|
||||
<rect x="1007.02" y="110.14" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 126px; margin-left: 1008px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
storageprovider
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1072" y="129" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
storageprovider
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1007.02" y="148.78" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 164px; margin-left: 1008px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
dataprovider
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1072" y="168" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
dataprovider
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="328" y="56.06" width="128.33" height="165.94" rx="5.13" ry="5.13" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
|
||||
<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 flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 70px; margin-left: 336px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
frontend
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="392" y="82" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
frontend
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="442.77" y="202.21" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,451.3,215.34)" pointer-events="none"/>
|
||||
<path d="M 443.13 214.23 L 440.67 213.19 C 440.31 212.99 440.16 212.7 440.3 212.28 L 441.24 210 C 441.44 209.65 441.71 209.45 442.13 209.63 L 444.43 210.81 C 445.17 209.92 445.97 209.04 446.86 208.28 L 445.86 205.77 C 445.78 205.47 445.75 205.18 446.17 204.9 L 448.49 203.91 C 448.93 203.76 449.18 203.96 449.33 204.22 L 450.36 206.79 C 451.4 206.58 452.43 206.49 453.64 206.85 L 454.68 204.24 C 454.91 203.88 455.2 203.77 455.55 203.91 L 457.85 204.9 C 458.23 205.14 458.26 205.43 458.17 205.74 L 457.15 208.31 C 458.05 209.04 458.88 209.83 459.55 210.71 L 462.02 209.68 C 462.47 209.56 462.73 209.73 462.9 210.06 L 463.87 212.4 C 463.93 212.75 463.86 213.04 463.52 213.23 L 461.01 214.27 C 461.13 215.27 461.11 216.52 461 217.63 L 463.52 218.67 C 463.86 218.88 464 219.16 463.9 219.52 L 462.99 221.71 C 462.81 222 462.56 222.14 462.19 222.05 L 459.65 221 C 458.98 221.93 458.15 222.76 457.21 223.47 L 458.21 225.99 C 458.37 226.4 458.17 226.74 457.94 226.86 L 455.49 227.9 C 455.17 227.96 454.88 227.93 454.73 227.51 L 453.7 224.93 C 452.77 225.2 451.62 225.27 450.43 224.96 L 449.41 227.5 C 449.25 227.77 449.07 228 448.62 227.89 L 446.23 226.88 C 445.9 226.64 445.75 226.34 445.96 225.93 L 447.09 223.64 C 446.09 222.87 445.26 222.05 444.6 221.19 L 442.18 222.2 C 441.79 222.34 441.48 222.24 441.26 221.89 L 440.29 219.53 C 440.19 219.22 440.27 218.84 440.63 218.67 L 443.14 217.56 C 443.04 216.45 443.03 215.34 443.13 214.23 Z M 445.84 215.84 C 445.84 219.77 449.03 222.21 452.13 222.21 C 455.51 222.21 458.3 219.29 458.3 215.9 C 458.3 212.26 455.29 209.53 452.15 209.53 C 449.07 209.53 445.84 211.89 445.84 215.84 Z" fill="#505050" stroke="none" pointer-events="none"/>
|
||||
<rect x="347.87" y="93.06" width="100" height="66" rx="9.9" ry="9.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 98px; height: 1px; padding-top: 126px; margin-left: 349px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
ocdav
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="398" y="130" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
ocdav
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="347.87" y="173.06" width="100" height="26.65" rx="4" ry="4" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 98px; height: 1px; padding-top: 186px; margin-left: 349px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
ocs
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="398" y="190" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
ocs
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 8 110 L 339.63 109.57" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
|
||||
<path d="M 345.63 109.56 L 337.64 113.57 L 339.63 109.57 L 337.63 105.57 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
|
||||
<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 flex-start; width: 1px; height: 1px; padding-top: 51px; margin-left: 80px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
/webdav
|
||||
<br/>
|
||||
/dav/files/<username>
|
||||
<br/>
|
||||
</font>
|
||||
<div>
|
||||
<font face="Courier New">
|
||||
/dav/trash-bin/<username>
|
||||
</font>
|
||||
</div>
|
||||
<div>
|
||||
<span style="font-family: "courier new"">
|
||||
/dav/public-files/<token>
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<font face="Courier New">
|
||||
/dav/meta/<fileid>/v
|
||||
</font>
|
||||
</div>
|
||||
<div>
|
||||
<font face="Courier New">
|
||||
/dav/avatars/<username>
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="80" y="54" fill="#505050" font-family="Helvetica" font-size="11px">
|
||||
/webdav...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 8 186 L 339.63 186.38" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
|
||||
<path d="M 345.63 186.38 L 337.63 190.37 L 339.63 186.38 L 337.64 182.37 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
|
||||
<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: 1px; height: 1px; padding-top: 170px; margin-left: 178px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
|
||||
<font face="Courier New">
|
||||
/ocs/v1.php/apps/files_sharing/api/v1/shares
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="178" y="173" fill="#505050" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
/ocs/v1.ph...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="608" y="56.06" width="213.87" height="166.34" rx="6.65" ry="6.65" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
|
||||
<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 flex-start; justify-content: unsafe center; width: 216px; height: 1px; padding-top: 61px; margin-left: 607px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
gateway
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="715" y="73" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
gateway
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="808.31" y="203.61" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,816.83,216.74)" pointer-events="none"/>
|
||||
<path d="M 808.67 215.63 L 806.2 214.59 C 805.85 214.39 805.7 214.1 805.84 213.68 L 806.77 211.4 C 806.98 211.05 807.25 210.85 807.67 211.03 L 809.97 212.21 C 810.7 211.32 811.51 210.44 812.4 209.68 L 811.39 207.17 C 811.32 206.87 811.29 206.58 811.71 206.3 L 814.02 205.31 C 814.47 205.16 814.72 205.36 814.87 205.62 L 815.9 208.19 C 816.94 207.98 817.97 207.89 819.18 208.25 L 820.22 205.64 C 820.44 205.28 820.74 205.17 821.09 205.31 L 823.39 206.3 C 823.77 206.54 823.8 206.83 823.71 207.14 L 822.69 209.71 C 823.59 210.44 824.41 211.23 825.08 212.11 L 827.56 211.08 C 828 210.96 828.27 211.13 828.43 211.46 L 829.4 213.8 C 829.47 214.15 829.39 214.44 829.06 214.63 L 826.54 215.67 C 826.66 216.67 826.65 217.92 826.54 219.03 L 829.05 220.07 C 829.39 220.28 829.54 220.56 829.43 220.92 L 828.52 223.11 C 828.34 223.4 828.09 223.54 827.73 223.45 L 825.19 222.4 C 824.52 223.33 823.69 224.16 822.75 224.87 L 823.75 227.39 C 823.91 227.8 823.71 228.14 823.47 228.26 L 821.03 229.3 C 820.71 229.36 820.41 229.33 820.27 228.91 L 819.24 226.33 C 818.31 226.6 817.15 226.67 815.97 226.36 L 814.95 228.9 C 814.79 229.17 814.6 229.4 814.15 229.29 L 811.77 228.28 C 811.44 228.04 811.28 227.74 811.5 227.33 L 812.62 225.04 C 811.63 224.27 810.79 223.45 810.14 222.59 L 807.71 223.6 C 807.33 223.74 807.02 223.64 806.8 223.29 L 805.83 220.93 C 805.73 220.62 805.81 220.24 806.16 220.07 L 808.68 218.96 C 808.58 217.85 808.57 216.74 808.67 215.63 Z M 811.38 217.24 C 811.38 221.17 814.56 223.61 817.67 223.61 C 821.05 223.61 823.84 220.69 823.84 217.3 C 823.84 213.66 820.83 210.93 817.69 210.93 C 814.61 210.93 811.38 213.29 811.38 217.24 Z" fill="#505050" stroke="none" pointer-events="none"/>
|
||||
<rect x="738" y="86.06" width="70" height="112.41" rx="4.9" ry="4.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 68px; height: 1px; padding-top: 142px; margin-left: 739px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
gateway
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="773" y="146" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
gateway
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="628" y="86.06" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 88px; height: 1px; padding-top: 110px; margin-left: 629px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
authregistry
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="673" y="114" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
authregistry
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="628" y="149.99" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<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: 88px; height: 1px; padding-top: 174px; margin-left: 629px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
|
||||
storageregistry
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="673" y="178" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
storageregistry
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 738 114.16 L 718 110.3" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<path d="M 738 170.36 L 718 174.23" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/>
|
||||
<path d="M 338 251 L 338 1" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="none"/>
|
||||
<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: 1px; height: 1px; padding-top: 281px; margin-left: 338px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
|
||||
oc10 namespace
|
||||
<br/>
|
||||
(all paths aere relative to the users home)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="338" y="284" fill="#505050" font-family="Courier New" font-size="11px" text-anchor="middle">
|
||||
oc10 names...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 618 251 L 618 11" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="none"/>
|
||||
<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: 1px; height: 1px; padding-top: 281px; margin-left: 618px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
|
||||
CS3 global namespace
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="618" y="284" fill="#505050" font-family="Courier New" font-size="11px" text-anchor="middle">
|
||||
CS3 global...
|
||||
</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: 33 KiB |
|
After Width: | Height: | Size: 81 KiB |
@@ -0,0 +1,352 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1161px" height="342px" viewBox="-0.5 -0.5 1161 342" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="180" y="1" width="800" height="230" fill="none" stroke="#666666" stroke-width="2" stroke-dasharray="6 6" 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 flex-end; justify-content: unsafe flex-start; width: 798px; height: 1px; padding-top: 228px; margin-left: 182px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #666666; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
oCIS spaces provider
|
||||
<br/>
|
||||
[Software System]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="182" y="228" fill="#666666" font-family="Helvetica" font-size="12px">
|
||||
oCIS spaces provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="800" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 801px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva storage provider
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
hosts multiple storage spaces using a storage driver
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="880" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva storage provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="600" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 601px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva gateway
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
API facade for internal reva services
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="680" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva gateway...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1000" y="71" width="160" height="110" rx="11" ry="11" fill="#999999" stroke="#8a8a8a" 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: 126px; margin-left: 1001px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage System
|
||||
</b>
|
||||
<div>
|
||||
[Software System]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
provides persistent storage
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1080" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 960 126 L 991.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 997.76 126 L 989.76 130 L 991.76 126 L 989.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 980px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[POSIX, S3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="980" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="400" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 401px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva frontend
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
handles protocol translation
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="480" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva frontend...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="200" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 201px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
oCIS proxy
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Routes requests to oc10 or ecis
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
oCIS proxy...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 360 126 L 391.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 397.76 126 L 389.76 130 L 391.76 126 L 389.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 380px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Mints an internal JWT
|
||||
<br/>
|
||||
and torwards requests to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, OCS, OCM, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="380" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Mints an internal JWT...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="71" width="160" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 126px; 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: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Client
|
||||
</b>
|
||||
<div>
|
||||
[Container: C++, Kotlin,
|
||||
<br/>
|
||||
Swift or Vue]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
A desktop, mobile or web Client
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="80" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Client...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 160 126 L 191.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 197.76 126 L 189.76 130 L 191.76 126 L 189.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 180px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, libregraph, CS3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="180" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 560 126 L 591.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 597.76 126 L 589.76 130 L 591.76 126 L 589.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 580px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="580" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 760 126 L 791.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 797.76 126 L 789.76 130 L 791.76 126 L 789.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 780px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Forwards to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, storage registry]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="780" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Forwards to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="241" width="960" height="100" fill="none" stroke="none" 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 flex-start; justify-content: unsafe flex-start; width: 952px; height: 1px; padding-top: 231px; margin-left: 5px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 110px; overflow: hidden; ">
|
||||
<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; ">
|
||||
<h1>
|
||||
C4 Component diagram for an oCIS spaces provider
|
||||
</h1>
|
||||
<p>
|
||||
An oCIS spaces provider manages resources in storage spaces by persisting them with a specific storage driver in a storage system.
|
||||
</p>
|
||||
<p>
|
||||
Date: 2021-07-22T12:40
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="5" y="243" fill="#000000" font-family="Helvetica" font-size="12px">
|
||||
C4 Component diagram for an oCIS spaces provider...
|
||||
</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: 26 KiB |
@@ -0,0 +1,405 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1361px" height="342px" viewBox="-0.5 -0.5 1361 342" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="180" y="1" width="1000" height="230" fill="none" stroke="#666666" stroke-width="2" stroke-dasharray="6 6" 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 flex-end; justify-content: unsafe flex-start; width: 998px; height: 1px; padding-top: 228px; margin-left: 182px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #666666; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
oCIS spaces registry
|
||||
<br/>
|
||||
[Software System]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="182" y="228" fill="#666666" font-family="Helvetica" font-size="12px">
|
||||
oCIS spaces registry...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="800" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 801px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva storage registry
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
manages and caches storage space metadata
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="880" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva storage registry...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="600" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 601px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva gateway
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
API facade for internal reva services
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="680" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva gateway...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1200" y="71" width="160" height="110" rx="11" ry="11" fill="#999999" stroke="#8a8a8a" 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: 126px; margin-left: 1201px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage System
|
||||
</b>
|
||||
<div>
|
||||
[Software System]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
provides persistent storage
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1280" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 960 126 L 991.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 997.76 126 L 989.76 130 L 991.76 126 L 989.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 980px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Provisions and manages spaces in
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="980" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Provisions and manages spaces...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="400" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 401px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva frontend
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
handles protocol translation
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="480" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva frontend...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="200" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 201px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
oCIS proxy
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Routes requests to oc10 or ecis
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
oCIS proxy...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 360 126 L 391.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 397.76 126 L 389.76 130 L 391.76 126 L 389.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 380px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Mints an internal JWT
|
||||
<br/>
|
||||
and torwards requests to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[libregraph]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="380" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Mints an internal JWT...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="71" width="160" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 126px; 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: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Client
|
||||
</b>
|
||||
<div>
|
||||
[Container: C++, Kotlin,
|
||||
<br/>
|
||||
Swift or Vue]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
A desktop, mobile or web Client
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="80" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Client...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 160 126 L 191.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 197.76 126 L 189.76 130 L 191.76 126 L 189.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 180px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
polls or gets notified about changes in
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[libregraph]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="180" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
polls or gets notified about c...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 560 126 L 591.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 597.76 126 L 589.76 130 L 591.76 126 L 589.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 580px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="580" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 760 126 L 791.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 797.76 126 L 789.76 130 L 791.76 126 L 789.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 780px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Lists spaces using
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="780" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Lists spaces using...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="241" width="960" height="100" fill="none" stroke="none" 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 flex-start; justify-content: unsafe flex-start; width: 952px; height: 1px; padding-top: 231px; margin-left: 5px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 110px; overflow: hidden; ">
|
||||
<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; ">
|
||||
<h1>
|
||||
C4 Component diagram for an oCIS spaces registry
|
||||
</h1>
|
||||
<p>
|
||||
An oCIS spaces provider manages resources in storage spaces by persisting them with a specific storage driver in a storage system.
|
||||
</p>
|
||||
<p>
|
||||
Date: 2021-07-22T12:40
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="5" y="243" fill="#000000" font-family="Helvetica" font-size="12px">
|
||||
C4 Component diagram for an oCIS spaces registry...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1000" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 1001px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva storage provider
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
hosts multiple storage spaces using a storage driver
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1080" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva storage provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 1160 126 L 1191.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 1197.76 126 L 1189.76 130 L 1191.76 126 L 1189.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 1180px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[POSIX, S3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1180" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</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: 30 KiB |
@@ -0,0 +1,434 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="632px" height="901px" viewBox="-0.5 -0.5 632 901" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="10" y="200" width="620" height="390" fill="none" stroke="#666666" stroke-width="2" stroke-dasharray="6 6" 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 flex-end; justify-content: unsafe flex-start; width: 618px; height: 1px; padding-top: 587px; margin-left: 12px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #666666; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
oCIS System
|
||||
<br/>
|
||||
[Software System]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="12" y="587" fill="#666666" font-family="Helvetica" font-size="12px">
|
||||
oCIS System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<ellipse cx="175" cy="23.33" rx="23.333333333333332" ry="23.333333333333332" fill="#08427b" stroke="none" pointer-events="all"/>
|
||||
<path d="M 120 60.67 C 120 47.78 130.45 37.33 143.33 37.33 L 206.67 37.33 C 212.86 37.33 218.79 39.79 223.17 44.17 C 227.54 48.54 230 54.48 230 60.67 L 230 116.67 C 230 129.55 219.55 140 206.67 140 L 143.33 140 C 130.45 140 120 129.55 120 116.67 Z" fill="#08427b" stroke="none" pointer-events="all"/>
|
||||
<ellipse cx="175" cy="23.33" rx="23.333333333333332" ry="23.333333333333332" fill="#08427b" stroke="none" 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: 1px; height: 1px; padding-top: 89px; margin-left: 175px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: nowrap; ">
|
||||
<b>
|
||||
Einstein
|
||||
</b>
|
||||
<div>
|
||||
[Person]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
End user
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="175" y="92" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Einstein...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="60" y="220" width="230" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 228px; height: 1px; padding-top: 275px; margin-left: 61px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Client
|
||||
</b>
|
||||
<div>
|
||||
[Container: C++, Kotlin, Swift or Vue]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
A desktop, mobile or web Client
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="175" y="279" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Client...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="440" y="430" width="160" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 485px; margin-left: 441px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage Space Registry
|
||||
</b>
|
||||
<div>
|
||||
[Container: golang, HTTP, libregraph]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Manages spaces for users
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="520" y="489" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage Space Registry...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="40" y="430" width="160" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 485px; margin-left: 41px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage Space Provider
|
||||
</b>
|
||||
<div>
|
||||
[Container: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Persists storage spaces using reva
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="120" y="489" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage Space Provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="40" y="670" width="160" height="110" rx="11" ry="11" fill="#999999" stroke="#8a8a8a" 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: 725px; margin-left: 41px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage System
|
||||
</b>
|
||||
<div>
|
||||
[Software System]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
provides persistent storage
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="120" y="729" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<ellipse cx="467" cy="23.33" rx="23.333333333333332" ry="23.333333333333332" fill="#08427b" stroke="none" pointer-events="all"/>
|
||||
<path d="M 412 60.67 C 412 47.78 422.45 37.33 435.33 37.33 L 498.67 37.33 C 504.86 37.33 510.79 39.79 515.17 44.17 C 519.54 48.54 522 54.48 522 60.67 L 522 116.67 C 522 129.55 511.55 140 498.67 140 L 435.33 140 C 422.45 140 412 129.55 412 116.67 Z" fill="#08427b" stroke="none" pointer-events="all"/>
|
||||
<ellipse cx="467" cy="23.33" rx="23.333333333333332" ry="23.333333333333332" fill="#08427b" stroke="none" 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: 1px; height: 1px; padding-top: 89px; margin-left: 467px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: nowrap; ">
|
||||
<b>
|
||||
Moss
|
||||
</b>
|
||||
<div>
|
||||
[Person]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Administrator
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="467" y="92" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Moss...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 120 540 L 120 661.76" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 120 667.76 L 116 659.76 L 120 661.76 L 124 659.76 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 640px; margin-left: 120px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[POSIX, S3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="120" y="643" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 117.5 330 L 118.98 421.77" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 119.08 427.76 L 114.95 419.83 L 118.98 421.77 L 122.95 419.7 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 380px; margin-left: 118px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, libregraph, CS3, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="118" y="383" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 232.5 330 L 432.75 437.96" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 438.03 440.81 L 429.09 440.53 L 432.75 437.96 L 432.89 433.49 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 386px; margin-left: 336px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Manages the users Storage Spaces in
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[libregraph]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="336" y="389" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Manages the users Storage Spac...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 175 140 L 175 211.76" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 175 217.76 L 171 209.76 L 175 211.76 L 179 209.76 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 180px; margin-left: 175px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Manages resources with
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[Web UI or native clients]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="175" y="183" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Manages resources with...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 200 485 L 431.76 485" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 437.76 485 L 429.76 489 L 431.76 485 L 429.76 481 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 485px; margin-left: 320px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Registers itself at and
|
||||
<br/>
|
||||
sends space root etag changes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, libregraph?, PUSH]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="320" y="488" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Registers itself at and...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 471.31 140 L 474.49 191.78" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 474.86 197.77 L 470.38 190.03 L 474.49 191.78 L 478.36 189.54 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 170px; margin-left: 473px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Manages organizational Storage Spaces in
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, libregraph, CS3, CLI]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="473" y="173" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Manages organizational Storage...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="395" y="670" width="160" height="110" rx="11" ry="11" fill="#999999" stroke="#8a8a8a" 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: 725px; margin-left: 396px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Identity Management System
|
||||
</b>
|
||||
<div>
|
||||
[Software System]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
provides users and groups
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="475" y="729" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Identity Management System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 475 590 L 475 661.76" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 475 667.76 L 471 659.76 L 475 661.76 L 479 659.76 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 640px; margin-left: 475px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Authenticates users and searches recipients with
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[OpenID Connect, LDAP, REST]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="475" y="643" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Authenticates users and search...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="790" width="620" height="110" fill="none" stroke="none" 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 flex-start; justify-content: unsafe flex-start; width: 612px; height: 1px; padding-top: 780px; margin-left: 5px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 120px; overflow: hidden; ">
|
||||
<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; ">
|
||||
<h1>
|
||||
C4 Container diagram for the oCIS System
|
||||
</h1>
|
||||
<p>
|
||||
As a platform, the oCIS system may not only includes web, mobile and desktop clients but also the underlying storage system or an identity management system
|
||||
</p>
|
||||
<p>
|
||||
Date: 2021-07-22T16:43
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="5" y="792" fill="#000000" font-family="Helvetica" font-size="12px">
|
||||
C4 Container diagram for the oCIS System...
|
||||
</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: 33 KiB |
|
After Width: | Height: | Size: 192 KiB |
@@ -0,0 +1,352 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1161px" height="342px" viewBox="-0.5 -0.5 1161 342" content="<mxfile pages="4"><diagram id="ivlTgcF_GoFNmAPzzRq-" name="overview">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</diagram></mxfile>">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="180" y="1" width="800" height="230" fill="none" stroke="#666666" stroke-width="2" stroke-dasharray="6 6" 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 flex-end; justify-content: unsafe flex-start; width: 798px; height: 1px; padding-top: 228px; margin-left: 182px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #666666; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
oCIS storage provider
|
||||
<br/>
|
||||
[Software System]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="182" y="228" fill="#666666" font-family="Helvetica" font-size="12px">
|
||||
oCIS storage provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="800" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 801px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva storage provider
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
hosts multiple storage spaces using a storage driver
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="880" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva storage provider...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="600" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 601px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva gateway
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
API facade for internal reva services
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="680" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva gateway...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="1000" y="71" width="160" height="110" rx="11" ry="11" fill="#999999" stroke="#8a8a8a" 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: 126px; margin-left: 1001px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Storage System
|
||||
</b>
|
||||
<div>
|
||||
[Software System]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
provides persistent storage
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="1080" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Storage System...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 960 126 L 991.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 997.76 126 L 989.76 130 L 991.76 126 L 989.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 980px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[POSIX, S3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="980" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="400" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 401px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
reva frontend
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
handles protocol translation
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="480" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
reva frontend...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="200" y="71" width="160" height="110" rx="11" ry="11" fill="#85bbf0" stroke="#78a8d8" 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: 126px; margin-left: 201px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
oCIS proxy
|
||||
</b>
|
||||
<div>
|
||||
[Component: golang]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
Routes requests to oc10 or ecis
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
oCIS proxy...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 360 126 L 391.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 397.76 126 L 389.76 130 L 391.76 126 L 389.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 380px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Mints an internal JWT
|
||||
<br/>
|
||||
and torwards requests to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, OCS, OCM, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="380" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Mints an internal JWT...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="71" width="160" height="110" rx="11" ry="11" fill="#438dd5" stroke="#3c7fc0" 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: 126px; 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: #ffffff; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
|
||||
<b>
|
||||
Client
|
||||
</b>
|
||||
<div>
|
||||
[Container: C++, Kotlin,
|
||||
<br/>
|
||||
Swift or Vue]
|
||||
</div>
|
||||
<br/>
|
||||
<div>
|
||||
A desktop, mobile or web Client
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="80" y="130" fill="#ffffff" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Client...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 160 126 L 191.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 197.76 126 L 189.76 130 L 191.76 126 L 189.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 180px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[WebDAV, libregraph, CS3]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="180" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 560 126 L 591.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 597.76 126 L 589.76 130 L 591.76 126 L 589.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 580px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Reads from and writes to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, tus]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="580" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Reads from and writes to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 760 126 L 791.76 126" fill="none" stroke="#707070" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/>
|
||||
<path d="M 797.76 126 L 789.76 130 L 791.76 126 L 789.76 122 Z" fill="#707070" stroke="#707070" stroke-width="2" stroke-miterlimit="10" 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: 1px; height: 1px; padding-top: 41px; margin-left: 780px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
|
||||
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #707070; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<div style="text-align: left">
|
||||
<div style="text-align: center">
|
||||
<b>
|
||||
Forwards to
|
||||
</b>
|
||||
</div>
|
||||
<div style="text-align: center">
|
||||
[CS3, storage registry]
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="780" y="44" fill="#707070" font-family="Helvetica" font-size="11px" text-anchor="middle">
|
||||
Forwards to...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="0" y="241" width="960" height="100" fill="none" stroke="none" 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 flex-start; justify-content: unsafe flex-start; width: 952px; height: 1px; padding-top: 231px; margin-left: 5px;">
|
||||
<div style="box-sizing: border-box; font-size: 0; text-align: left; max-height: 110px; overflow: hidden; ">
|
||||
<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; ">
|
||||
<h1>
|
||||
C4 Component diagram for an oCIS storage provider
|
||||
</h1>
|
||||
<p>
|
||||
An oCIS storage provider manages resources in storage spaces by persisting them with a specific storage driver in a storage system.
|
||||
</p>
|
||||
<p>
|
||||
Date: 2021-07-22T12:40
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="5" y="243" fill="#000000" font-family="Helvetica" font-size="12px">
|
||||
C4 Component diagram for an oCIS storage provider...
|
||||
</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: 26 KiB |
|
After Width: | Height: | Size: 116 KiB |
@@ -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" 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 |
@@ -0,0 +1,173 @@
|
||||
---
|
||||
title: "Storage drivers"
|
||||
date: 2020-04-27T18:46:00+01:00
|
||||
weight: 12
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: storages.md
|
||||
---
|
||||
|
||||
A *storage driver* implements access to a [*storage system*]({{< ref "#storage-systems" >}}):
|
||||
|
||||
It maps the *path* and *id* based CS3 *references* to an appropriate [*storage system*]({{< ref "#storage-systems" >}}) specific reference, e.g.:
|
||||
- eos file ids
|
||||
- posix inodes or paths
|
||||
- deconstructed filesystem nodes
|
||||
|
||||
## Storage providers
|
||||
|
||||
To manage the file tree oCIS uses *storage providers* that are accessing the underlying storage using a *storage driver*. The driver can be used to change the implementation of a storage aspect to better reflect the actual underlying storage capabilities. As an example a move operation on a POSIX filesystem ([theoretically](https://danluu.com/deconstruct-files/)) is an atomic operation. When trying to implement a file tree on top of S3 there is no native move operation that can be used. A naive implementation might fall back on a COPY and DELETE. Some S3 implementations provide a COPY operation that uses an existing key as the source, so the file at least does not need to be reuploaded. In the worst case scenario, which is renaming a folder with hundreds of thousands of objects, a reupload for every file has to be made. Instead of hiding this complexity a better choice might be to disable renaming of files or at least folders on S3. There are however implementations of filesystems on top of S3 that store the tree metadata in dedicated objects or use a completely different persistence mechanism like a distributed key value store to implement the file tree aspect of a storage.
|
||||
|
||||
|
||||
{{< hint info >}}
|
||||
While the *storage provider* is responsible for managing the tree, file up- and downloads are delegated to a dedicated *data provider*. See below.
|
||||
{{< /hint >}}
|
||||
|
||||
## Storage aspects
|
||||
A lot of different storage technologies exist, ranging from general purpose file systems with POSIX semantics to software defined storage with multiple APIs. Choosing any of them is making a tradeoff decision. Or, if a storage technology is already in place it automatically predetermines the capabilities that can be made available. *Not all storage systems are created equal.*
|
||||
|
||||
Unfortunately, no POSIX filesystem natively supports all storage aspects that ownCloud 10 requires:
|
||||
|
||||
### A hierarchical file tree
|
||||
An important aspect of a filesystem is organizing files and directories in a file hierarchy, or tree. It allows you to create, move and delete nodes. Beside the name a node also has well known metadata like size and mtime that are persisted in the tree as well.
|
||||
|
||||
{{< hint info >}}
|
||||
**Folders are not directories**
|
||||
There is a difference between *folder* and *directory*: a *directory* is a file system concept. A *folder* is a metaphor for the concept of a physical file folder. There are also *virtual folders* or *smart folders* like the recent files folder which are no file system *directories*. So, every *directory* and every *virtual folder* is a *folder*, but not every *folder* is a *directory*. See [the folder metaphor in wikipedia](https://en.wikipedia.org/wiki/Directory_(computing)#Folder_metaphor). Also see the activity history below.
|
||||
{{< /hint >}}
|
||||
|
||||
#### Id based lookup
|
||||
While traditionally nodes in the tree are reached by traversing the path the tree persistence should be prepared to look up a node by an id. Think of an inode in a POSIX filesystem. If this operation needs to be cached for performance reasons keep in mind that cache invalidation is hard and crawling all files to update the inode to path mapping takes O(n), not O(1).
|
||||
|
||||
#### ETag propagation
|
||||
For the state based sync a client can discover changes by recursively descending the tree and comparing the ETag for every node. If the storage technology supports propagating ETag changes up the tree, only the root node of a tree needs to be checked to determine if a discovery needs to be started and which nodes need to be traversed. This allows using the storage technology itself to persist all metadata that is necessary for sync, without additional services or caches.
|
||||
|
||||
#### Subtree size accounting
|
||||
The tree can keep track of how many bytes are stored in a folder. Similar to ETag propagation a change in file size is propagated up the hierarchy.
|
||||
|
||||
{{< hint info >}}
|
||||
**ETag and Size propagation**
|
||||
When propagating the ETag (mtime) and size changes up the tree the question is where to stop. If all changes need to be propagated to the root of a storage then the root or busy folders will become a hotspot. There are two things to keep in mind: 1. propagation only happens up to the root of a single space (a user private drive or a single group drive), 2. no cross storage propagation. The latter was used in oc10 to let clients detect when a file in a received shared folder changed. This functionality is moving to the storage registry which caches the ETag for every root so clients can discover if and which storage changed.
|
||||
{{< /hint >}}
|
||||
|
||||
#### Rename
|
||||
Depending on the underlying storage technology some operations may either be slow, up to a point where it makes more sense to disable them entirely. One example is a folder rename: on S3 a *simple* folder rename translates to a copy and delete operation for every child of the renamed folder. There is an exception though: this restriction only applies if the S3 storage is treated like a filesystem, where the keys are the path and the value is the file content. There are smarter ways to implement file systems on top of S3, but again: there is always a tradeoff.
|
||||
|
||||
{{< hint info >}}
|
||||
**S3 has no rename**
|
||||
Technically, [S3 has no rename operation at all](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-objects.html#copy-object). By design, the location of the value is determined by the key, so it always has to do a copy and delete. Another example is the [redis RENAME operation](https://redis.io/commands/rename): while being specified as O(1) it *executes an implicit DEL operation, so if the deleted key contains a very big value it may cause high latency...*
|
||||
{{< /hint >}}
|
||||
|
||||
#### Arbitrary metadata persistence
|
||||
In addition to well known metadata like name size and mtime, users might be able to add arbitrary metadata like tags, comments or [dublin core](https://en.wikipedia.org/wiki/Dublin_Core). In POSIX filesystems this maps to extended attributes.
|
||||
|
||||
### Grant persistence
|
||||
The CS3 API uses grants to describe access permissions. Storage systems have a wide range of permissions granularity and not all grants may be supported by every storage driver. POSIX ACLs for example have no expiry. If the storage system does not support certain grant properties, e.g. expiry, then the storage driver may choose to implement them in a different way. Expiries could be persisted in a different way and checked periodically to remove the grants. Again: every decision is a tradeoff.
|
||||
|
||||
### Trash persistence
|
||||
After deleting a node the storage allows listing the deleted nodes and has an undo mechanism for them.
|
||||
|
||||
### Versions persistence
|
||||
A user can restore a previous version of a file.
|
||||
|
||||
{{< hint info >}}
|
||||
**Snapshots are not versions**
|
||||
Modern POSIX filesystems support snapshotting of volumes. This is different from keeping track of versions to a file or folder, but might be another implementation strategy for a storage driver to allow users to restore content.
|
||||
{{< /hint >}}
|
||||
|
||||
### Activity History
|
||||
The storage keeps an activity history, tracking the different actions that have been performed. This does not only include file changes but also metadata changes like renames and permission changes.
|
||||
|
||||
## Storage drivers
|
||||
|
||||
Reva currently has several storage driver implementations that can be used for *storage providers* as well as *data providers*.
|
||||
|
||||
### OCIS and S3NG Storage Driver
|
||||
|
||||
The oCIS storage driver is the default storage driver. It decomposes the metadata and persists it in a POSIX filesystem. Blobs are stored on the filesystem as well. The layout makes extensive use of symlinks and extended attributes. A filesystem like xfs or zfs without inode size limitations is recommended. We will evolve this to further integrate with file systems like cephfs or gpfs.
|
||||
|
||||
The S3NG storage driver uses the same metadata layout on a POSIX storage as the oCIS driver, but it uses S3 as the blob storage.
|
||||
|
||||
TODO add list of capabilities / tradeoffs
|
||||
|
||||
#### Related Kernel limits
|
||||
The decomposedfs currently stores CS3 grants in extended attributes. When listing extended attributes the result is currently limited to 64kB. Assuming a 20 byte uuid a grant has ~40 bytes. Which would limit the number of extended attributes to ~1630 entries or ~1600 shares. This can be extended by moving the grants from extended attributes into a dedicated file.
|
||||
|
||||
From [Wikipedia on Extended file attributes](https://en.wikipedia.org/wiki/Extended_file_attributes#Linux):
|
||||
> The Linux kernel allows extended attribute to have names of up to 255 bytes and values of up to 64 KiB,[14] as do XFS and ReiserFS, but ext2/3/4 and btrfs impose much smaller limits, requiring all the attributes (names and values) of one file to fit in one "filesystem block" (usually 4 KiB). Per POSIX.1e,[citation needed] the names are required to start with one of security, system, trusted, and user plus a period. This defines the four namespaces of extended attributes.[15]
|
||||
|
||||
And from the [man page on listxattr](https://www.man7.org/linux/man-pages/man2/listxattr.2.html):
|
||||
> As noted in xattr(7), the VFS imposes a limit of 64 kB on the size of the extended attribute name list returned by listxattr(7). If the total size of attribute names attached to a file exceeds this limit, it is no longer possible to retrieve the list of attribute names.
|
||||
|
||||
### Local Storage Driver
|
||||
|
||||
The *minimal* storage driver for a POSIX based filesystem. It literally supports none of the storage aspect other than basic file tree management. Sharing can - to a degree - be implemented using POSIX ACLs.
|
||||
|
||||
- tree provided by a POSIX filesystem
|
||||
- inefficient path by id lookup, currently uses the file path as id, so ids are not stable
|
||||
- can store a uuid in extended attributes and use a cache to look them up, similar to the ownCloud driver
|
||||
- no native ETag propagation, five options are available:
|
||||
- built in propagation (changes bypassing ocis are not picked up until a rescan)
|
||||
- built in inotify (requires 48 bytes of RAM per file, needs to keep track of every file and folder)
|
||||
- external inotify (same RAM requirement, but could be triggered by external tools, e.g. a workflow engine)
|
||||
- kernel audit log (use the linux kernel audit to capture file events on the storage and offload them to a queue)
|
||||
- fuse filesystem overlay
|
||||
- no subtree accounting, same options as for ETag propagation
|
||||
- efficient rename
|
||||
- arbitrary metadata using extended attributes
|
||||
- grant persistence
|
||||
- using POSIX ACLs
|
||||
- requires an LDAP server to make guest accounts available in the OS
|
||||
- an existing LDAP could be used if guests ar provisioned in another way
|
||||
- using extended attributes to implement expiry or sharing that does not require OS level integration
|
||||
- fuse filesystem overlay
|
||||
- no native trash
|
||||
- could use [The FreeDesktop.org Trash specification](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html)
|
||||
- fuse filesystem overlay
|
||||
- no native versions, multiple options possible
|
||||
- git for folders
|
||||
- rcs for single files
|
||||
- rsnapshot for hourly / daily / weekly / monthly backups ... but this is not versioning as known from oc10
|
||||
- design new freedesktop spec, basically what is done in oc10 without the limitations or borrow ideas from the freedesktop trash spec
|
||||
- fuse filesystem overlay
|
||||
|
||||
To provide the other storage aspects we plan to implement a FUSE overlay filesystem which will add the different aspects on top of local filesystems like ext4, btrfs or xfs. It should work on NFSv45 as well, although NFSv4 supports RichACLs and we will explore how to leverage them to implement sharing at a future date. The idea is to use the storages native capabilities to deliver the best user experience. But again: that means making the right tradeoffs.
|
||||
|
||||
### EOS Storage Driver
|
||||
|
||||
The CERN eos storage has evolved with ownCloud and natively supports id based lookup, ETag propagation, subtree size accounting, sharing, trash and versions. To use it you need to change the default configuration of the `storage storage-home` command (or have a look at the Makefile ̀ eos-start` target):
|
||||
|
||||
```
|
||||
export STORAGE_DRIVER_EOS_NAMESPACE=/eos
|
||||
export STORAGE_DRIVER_EOS_MASTER_URL="root://eos-mgm1.eoscluster.cern.ch:1094"
|
||||
export STORAGE_DRIVER_EOS_ENABLE_HOME=true
|
||||
export STORAGE_DRIVER_EOS_LAYOUT="dockertest/{{.Username}}"
|
||||
```
|
||||
|
||||
Running it locally also requires the `eos` and `xrootd` binaries. Running it using `make eos-start` will use CentOS based containers that already have the necessary packages installed.
|
||||
|
||||
{{< hint info >}}
|
||||
Pull requests to add explicit `storage storage-(s3|custom|...)` commands with working defaults are welcome.
|
||||
{{< /hint >}}
|
||||
|
||||
### S3 Storage Driver
|
||||
|
||||
A naive driver that treats the keys in an S3 capable storage as `/` delimited path names. While it does not support MOVE or ETag propagation it can be used to read and write files. Better integration with native capabilities like versioning is possible but depends on the Use Case. Several storage solutions that provide an S3 interface also support some form of notifications that can be used to implement ETag propagation.
|
||||
|
||||
## Data Providers
|
||||
|
||||
Clients using the CS3 API use an [InitiateFileDownload](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.InitiateFileDownloadRequest) and ]InitiateUpload](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.InitiateFileUploadRequest) request at the [storage gateway](https://cs3org.github.io/cs3apis/#cs3.gateway.v1beta1.GatewayAPI) to obtain a URL endpoint that can be used to either GET the file content or upload content using the resumable [tus.io](https://tus.io) protocol.
|
||||
|
||||
The *data provider* uses the same *storage driver* as the *storage provider* but can be scaled independently.
|
||||
|
||||
The dataprovider allows uploading the file to a quarantine area where further data analysis may happen before making the file accessible again. One use case for this is antivirus scanning for files coming from untrusted sources.
|
||||
|
||||
## Future work
|
||||
|
||||
### FUSE overlay filesystem
|
||||
We are planning to further separate the concerns and use a local storage provider with a FUSE filesystem overlaying the actual POSIX storage that can be used to capture deletes and writes that might happen outside of ocis/reva.
|
||||
|
||||
It would allow us to extend the local storage driver with missing storage aspects while keeping a tree like filesystem that end users are used to see when sshing into the machine.
|
||||
|
||||
### Upload to Quarantine area
|
||||
Antivirus scanning of random files uploaded from untrusted sources and executing metadata extraction or thumbnail generation should happen in a sandboxed system to prevent malicious users from gaining any information about the system. By spawning a new container with access to only the uploaded data we can further limit the attack surface.
|
||||
@@ -0,0 +1,100 @@
|
||||
---
|
||||
title: "Terminology"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 17
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: terminology.md
|
||||
---
|
||||
|
||||
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.
|
||||
|
||||
## Logical concepts
|
||||
|
||||
### Resources
|
||||
A *resource* is the basic building block that oCIS manages. It can be of [different types](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceType):
|
||||
- an actual *file*
|
||||
- a *container*, e.g. a folder or bucket
|
||||
- a *symlink*, or
|
||||
- a [*reference*]({{< ref "#references" >}}) which can point to a resource in another [*storage provider*]({{< ref "#storage-providers" >}})
|
||||
|
||||
### References
|
||||
A *reference* identifies a [*resource*]({{< ref "#resources" >}}). A [*CS3 reference*](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.Reference) can carry a *path* and a [CS3 *resource id*](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId). The references come in two flavors: absolute and combined.
|
||||
Absolute references have either the *path* or the *resource id* set:
|
||||
- An absolute *path* MUST start with a `/`. The *resource id* MUST be empty.
|
||||
- An absolute *resource id* uniquely identifies a [*resource*]({{< ref "#resources" >}}) and is used as a stable identifier for sharing. The *path* MUST be empty.
|
||||
Combined references have both, *path* and *resource id* set:
|
||||
- the *resource id* identifies the root [*resource*]({{< ref "#resources" >}})
|
||||
- the *path* is relative to that root. It MUST start with `.`
|
||||
## References
|
||||
|
||||
A *reference* is a logical concept that identifies a [*resource*]({{< ref "#resources" >}}). A [*CS3 reference*](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.Reference) consists of either
|
||||
- a *path* based reference, used to identify a [*resource*]({{< ref "#resources" >}}) in the [*namespace*]({{< ref "./namespaces.md" >}}) of a [*storage provider*]({{< ref "#storage-providers" >}}). It must start with a `/`.
|
||||
- a [CS3 *id* based reference](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId), uniquely identifying a [*resource*]({{< ref "#resources" >}}) in the [*namespace*]({{< ref "./namespaces.md" >}}) of a [*storage provider*]({{< ref "#storage-providers" >}}). 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 currently the static [*storage registry*]({{< ref "#storage-space-registries" >}}) uses a map to look up which [*storage provider*]({{< ref "#storage-providers" >}}) 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 >}}
|
||||
|
||||
## Storage Drivers
|
||||
|
||||
A *storage driver* implements access to a [*storage system*]({{< ref "#storage-systems" >}}):
|
||||
|
||||
It maps the *path* and *id* based CS3 *references* to an appropriate [*storage system*]({{< ref "#storage-systems" >}}) specific reference, e.g.:
|
||||
- eos file ids
|
||||
- posix inodes or paths
|
||||
- deconstructed filesystem nodes
|
||||
|
||||
{{< hint warning >}}
|
||||
**Proposed Change**
|
||||
iOS clients can only queue single requests to be executed in the background. The queue an upload and need to be able to identify the uploaded file after it has been uploaded to the server. The disconnected nature of the connection might cause workflows or manual user interaction with the file on the server to move the file to a different place or changing the content while the device is offline. However, on the device users might have marked the file as favorite or added it to other iOS specific collections. To be able to reliably identify the file the client can generate a `uuid` and attach it to the file metadata during the upload. While it is not necessary to look up files by this `uuid` having a second file id that serves exactly the same purpose as the `file id` is redundant.
|
||||
|
||||
Another aspect for the `file id` / `uuid` is that it must be a logical identifier that can be set, at least by internal systems. Without a writeable fileid we cannot restore backups or migrate storage spaces from one storage provider to another storage provider.
|
||||
|
||||
Technically, this means that every storage driver needs to have a map of a `uuid` to in internal resource identifier. This internal resource identifier can be
|
||||
- an eos fileid, because eos can look up files by id
|
||||
- an inode if the filesystem and the storage driver support looking up by inode
|
||||
- a path if the storage driver has no way of looking up files by id.
|
||||
- In this case other mechanisms like inotify, kernel audit or a fuse overlay might be used to keep the paths up to date.
|
||||
- to prevent excessive writes when deep folders are renamed a reverse map might be used: it will map the `uuid` to `<parentuuid>:<childname>`, allowing to trade writes for reads
|
||||
|
||||
{{< /hint >}}
|
||||
## Storage Providers
|
||||
|
||||
## Technical concepts
|
||||
|
||||
### Storage Systems
|
||||
{{< figure src="/ocis/storage/static/storageprovider.drawio.svg" >}}
|
||||
|
||||
A *storage provider* manages multiple [*storage spaces*]({{< ref "#storage-space" >}})
|
||||
by accessing a [*storage system*]({{< ref "#storage-systems" >}}) with a [*storage driver*]({{< ref "#storage-drivers" >}}).
|
||||
|
||||
{{< figure src="/ocis/storage/static/storageprovider-spaces.drawio.svg" >}}
|
||||
|
||||
## Storage Space Registries
|
||||
|
||||
A [*storage spaces registry*]({{< ref "./spacesregistry.md" >}}) manages the [*namespace*]({{< ref "./namespaces.md" >}}) for a *user*
|
||||
|
||||
## Storage Spaces
|
||||
A *storage space* is a logical concept:
|
||||
It is a tree of [*resources*]({{< ref "#resources" >}})*resources*
|
||||
with a single *owner* (*user* or *group*),
|
||||
a *quota* and *permissions*, identified by a `storage space id`.
|
||||
|
||||
{{< figure src="/ocis/storage/static/storagespace.drawio.svg" >}}
|
||||
|
||||
Examples would be every user's home storage space, project storage spaces or group storage spaces. While they all serve different purposes and may or may not have workflows like antivirus 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. A [*storage space registry*]({{< ref "#storage-space-registries" >}}) then allows listing the capabilities of [*storage spaces*]({{< ref "#storage-spaces" >}}), e.g. free space, quota, owner, syncable, root etag, upload workflow steps, ...
|
||||
|
||||
Finally, a logical `storage space id` is not tied to a specific [*storage provider*]({{< ref "#storage-providers" >}}). If the [*storage driver*]({{< ref "#storage-drivers" >}}) supports it, we can import existing files including their `file id`, which makes it possible to move [*storage spaces*]({{< ref "#storage-spaces" >}}) between [*storage providers*]({{< ref "#storage-providers" >}}) to implement storage classes, e.g. with or without archival, workflows, on SSDs or HDDs.
|
||||
|
||||
## Shares
|
||||
*To be clarified: we are aware that [*storage spaces*]({{< ref "#storage-spaces" >}}) may be too 'heavyweight' for ad hoc sharing with groups. That being said, there is no technical reason why group shares should not be treated like [*storage spaces*]({{< ref "#storage-spaces" >}}) that users can provision themselves. They would share the quota with the users home [*storage space*]({{< ref "#storage-spaces" >}}) and the share initiator would be the sole owner. Technically, the mechanism of treating a share like a new [*storage space*]({{< ref "#storage-spaces" >}}) would be the same. This obviously also extends to user shares and even file individual shares that would be wrapped in a virtual collection. It would also become possible to share collections of arbitrary files in a single storage space, e.g. the ten best pictures from a large album.*
|
||||
|
||||
|
||||
## Storage Systems
|
||||
Every *storage system* has different native capabilities like id and path based lookups, recursive change time propagation, permissions, trash, versions, archival and more.
|
||||
A [*storage provider*]({{< ref "#storage-providers" >}}) makes the storage system available in the CS3 API by wrapping the capabilities as good as possible using a [*storage driver*]({{< ref "./storagedrivers.md" >}}).
|
||||
There might be multiple [*storage drivers*]({{< ref "./storagedrivers.md" >}}) for a *storage system*, implementing different tradeoffs to match varying requirements.
|
||||
|
||||
### Gateways
|
||||
A *gateway* acts as a facade to the storage related services. It authenticates and forwards API calls that are publicly accessible.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: "Users"
|
||||
date: 2020-01-16T00:00:00+00:00
|
||||
weight: 17
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: users.md
|
||||
---
|
||||
|
||||
TODO add this to the storage overview? or is this a different part? That should be started as a separate service ? And documented elsewhere, e.g. in the accounts?
|
||||
|
||||
### User and Group provisioning
|
||||
|
||||
In oc10 users are identified by a username, which cannot change, because it is used as a foreign key in several tables. For oCIS we are internally identifying users by a UUID, while using the username in the WebDAV and OCS APIs for backwards compatability. To distinguish this in the URLs we are using `<username>` instead of `<userid>`. You may have encountered `<user_layout>`, which refers to a template that can be configured to build several path segments by filling in user properties, e.g. the first character of the username (`{{substr 0 1 .Username}}/{{.Username}}`), the identity provider (`{{.Id.Idp}}/{{.Username}}`) or the email (`{{.Mail}}`)
|
||||
|
||||
{{< hint warning >}}
|
||||
Make no mistake, the [OCS Provisioning API](https://doc.owncloud.com/server/developer_manual/core/apis/provisioning-api.html) uses `userid` while it actually is the username, because it is what you use to login.
|
||||
{{< /hint >}}
|
||||
|
||||
We are currently working on adding [user management through the CS3 API](https://github.com/owncloud/ocis/pull/1930) to handle user and group provisioning (and deprovisioning).
|
||||
|
||||
### Demo driver
|
||||
|
||||
This is a simple user driver for testing. It contains three users:
|
||||
```
|
||||
einstein:relativity
|
||||
marie:radioactivity
|
||||
richard:superfluidity
|
||||
```
|
||||
In order to use the `demo` driver you need to export the relevant environment variable:
|
||||
```
|
||||
export STORAGE_USERS_DRIVER=demo
|
||||
```
|
||||
|
||||
### JSON driver
|
||||
|
||||
In order to switch from the `ldap` driver to JSON based users you need to export the relevant environment variables:
|
||||
```
|
||||
export STORAGE_USERS_DRIVER=json
|
||||
export STORAGE_USERS_JSON=/path/to/users.json
|
||||
```
|
||||
|
||||
For the format of the users.json have a look at the [reva examples](https://github.com/cs3org/reva/blob/master/examples/oc-phoenix/users.demo.json)
|
||||
|
||||
### LDAP driver
|
||||
|
||||
This is the default user driver.
|
||||
|
||||
If the below defaults don't match your environment change them accordingly:
|
||||
```
|
||||
export STORAGE_LDAP_HOSTNAME=localhost
|
||||
export STORAGE_LDAP_PORT=9126
|
||||
export STORAGE_LDAP_BASE_DN='dc=ocis,dc=test'
|
||||
export STORAGE_LDAP_USER_FILTER='(&(objectclass=posixAccount)(cn=%s))'
|
||||
export STORAGE_LDAP_GROUP_FILTER='(&(objectclass=posixGroup)(cn=%s))'
|
||||
export STORAGE_LDAP_BIND_DN='cn=reva,ou=sysusers,dc=ocis,dc=test'
|
||||
export STORAGE_LDAP_BIND_PASSWORD=reva
|
||||
export STORAGE_LDAP_USER_SCHEMA_UID=uid
|
||||
export STORAGE_LDAP_USER_SCHEMA_MAIL=mail
|
||||
export STORAGE_LDAP_USER_SCHEMA_DISPLAYNAME=sn
|
||||
export STORAGE_LDAP_USER_SCHEMA_CN=cn
|
||||
```
|
||||
|
||||
Then restart the `bin/storage users` and `bin/storage auth-basic` services for the changes to take effect.
|
||||