Merge pull request #2318 from owncloud/cleanup-spaces-docs
[docs-only] separate proposed changes from terminology
@@ -8,16 +8,13 @@ geekdocFilePath: _index.md
|
||||
geekdocCollapseSection: true
|
||||
---
|
||||
|
||||
## Abstract
|
||||
## Overview
|
||||
|
||||
This service provides an oCIS extension that wraps [reva](https://github.com/cs3org/reva/) and adds an opinionated configuration to it.
|
||||
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*
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
The below diagram shows the oCIS services and the contained reva services within as dashed boxes. In general:
|
||||
1. A request comes in at the proxy and is authenticated using OIDC.
|
||||
2. It is forwarded to the oCIS frontend which handles ocs and ocdav requests by talking to the reva gateway using the CS3 API.
|
||||
3. The gateway acts as a facade to the actual CS3 services: storage providers, user providers, group providers and sharing providers.
|
||||
*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*.
|
||||
|
||||
{{< svg src="extensions/storage/static/overview.drawio.svg" >}}
|
||||
|
||||
@@ -34,3 +31,4 @@ The bottom part is lighter because we will deprecate it in favor of using only t
|
||||
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?
|
||||
{{< svg src="extensions/storage/static/storage.drawio.svg" >}}
|
||||
|
||||
@@ -12,11 +12,11 @@ In ownCloud 10 all paths are considered relative to the users home. The CS3 API
|
||||
|
||||
{{< svg src="extensions/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 "./terminology.md#storage-spaces" >}}). The following table lists the various namespaces, paths and id based references:
|
||||
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 | `/<userlayout>/path/to/file.ext` | currently logged in users home |
|
||||
| `/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 |
|
||||
|
||||
@@ -32,26 +32,26 @@ In the global CS3 namespaces we plan to move `/home/Shares`, which currently lis
|
||||
|
||||
## 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 "./architecture#webdav" >}}) and [ocs]({{< ref "./architecture#sharing" >}}) sections for more details end examples.
|
||||
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 space registry*]({{< ref "./terminology.md#storage-space-registries" >}}). oCIS uses these defaults:
|
||||
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/<userlayout>` | user private spaces |
|
||||
| `/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 space registry*]({{< ref "./terminology.md#storage-space-registries" >}}) knows the path to a users private space in the `/users` namespace and the gateway can forward the requests to the responsible storage provider.
|
||||
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/<userlayout>` instead of `/users/<userlayout>`. Then the paths would be consistent with most unix systems.
|
||||
*@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:
|
||||
|
||||
177
docs/extensions/storage/proposedchanges.md
Normal 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 `/` eg. 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, eg 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.
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
title: "Releasing"
|
||||
date: 2020-05-22T00:00:00+00:00
|
||||
weight: 60
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: releasing.md
|
||||
---
|
||||
|
||||
{{< toc >}}
|
||||
|
||||
To release a new version of the storage submodule, you have to follow a few simple steps.
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Before releasing, make sure that reva has been [updated to the desired version]({{< ref "updating" >}})
|
||||
|
||||
## Release
|
||||
1. Check out master
|
||||
{{< highlight txt >}}
|
||||
git checkout master
|
||||
git pull origin master
|
||||
{{< / highlight >}}
|
||||
2. Create a new tag (preferably signed) and replace the version number accordingly. Prefix the tag with the submodule `storage/v`.
|
||||
{{< highlight txt >}}
|
||||
git tag -s storage/vx.x.x -m "release vx.x.x"
|
||||
git push origin storage/vx.x.x
|
||||
{{< / highlight >}}
|
||||
5. Wait for CI and check that the GitHub release was published.
|
||||
|
||||
Congratulations, you just released the storage submodule!
|
||||
@@ -176,3 +176,33 @@ The request will fail with `507 Insufficient Storage`:
|
||||
##### 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`.
|
||||
|
||||
{{< svg src="extensions/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 anti virus scanning enabled, we need a way to identify and manage these subtrees in a generic way. By creating a dedicated concept for them this becomes easier and literally makes the codebase cleaner. 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 'heavywheight' 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}}
|
||||
```
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
---
|
||||
title: "Architecture"
|
||||
title: "Spaces Provider"
|
||||
date: 2018-05-02T00:00:00+00:00
|
||||
weight: 10
|
||||
weight: 6
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: architecture.md
|
||||
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" >}}).
|
||||
|
||||
{{< svg src="extensions/storage/static/spacesprovider.drawio.svg" >}}
|
||||
|
||||
|
||||
## Frontend
|
||||
|
||||
The oCIS frontend service starts all services that handle incoming HTTP requests:
|
||||
@@ -36,18 +49,19 @@ The ocdav service not only handles all WebDAV requests under `(remote.php/)(web)
|
||||
| *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/<userlayout>` | | |
|
||||
| `(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 "./terminology.md#storage-spaces" >}}) or a global endpoint | allow accessing spaces, listing is done by the graph api |
|
||||
| `(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 "./terminology.md#storage-spaces" >}}) 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.
|
||||
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" >}})
|
||||
@@ -55,11 +69,6 @@ For legacy clients the `remote.php/webdav` endpoint will no longer list the user
|
||||
- `remote.php/webdav/spaces`: other [*storage spaces*]({{< ref "./terminology.md#storage-spaces" >}}) the user has access to, e.g. group or project drives
|
||||
{{< /hint >}}
|
||||
|
||||
{{< hint warning >}}
|
||||
An alternative would be to introduce a new `remote.php/dav/spaces` or `remote.php/dav/global` endpoint. However, `remote.php/dav` properly follows the WebDAV RFCs strictly. To ensure that all resources under that [*namespace*]({{< ref "./terminology.md#namespaces" >}}) are scoped to the user the URL would have to include the principal like `remote.php/dav/spaces/<username>`, a precondition for e.g. WebDAV [RFC5397](https://tools.ietf.org/html/rfc5397). For a history lesson start at [Replace WebDAV with REST
|
||||
owncloud/core#12504](https://github.com/owncloud/core/issues/12504#issuecomment-65218491) which spawned [Add extra layer in DAV to accomodate for other services like versions, trashbin, etc owncloud/core#12543](https://github.com/owncloud/core/issues/12543)
|
||||
{{< /hint >}}
|
||||
|
||||
|
||||
### Sharing
|
||||
|
||||
@@ -92,12 +101,12 @@ The user and public share provider implementations identify the file using the [
|
||||
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 >}}
|
||||
|
||||
### 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 `<userlayout>`, 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}}`)
|
||||
## REVA Storage Registry
|
||||
|
||||
{{< 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 >}}
|
||||
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" >}}).
|
||||
|
||||
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).
|
||||
{{< svg src="extensions/storage/static/storageregistry.drawio.svg" >}}
|
||||
21
docs/extensions/storage/spacesregistry.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
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.
|
||||
|
||||
{{< svg src="extensions/storage/static/spacesregistry.drawio.svg" >}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<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>">
|
||||
<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"/>
|
||||
@@ -35,7 +35,7 @@
|
||||
/home
|
||||
</div>
|
||||
<div>
|
||||
/users/<userlayout>
|
||||
/users/<user_layout>
|
||||
</div>
|
||||
<div>
|
||||
/public
|
||||
@@ -52,13 +52,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -69,16 +69,15 @@
|
||||
</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="all"/>
|
||||
<rect x="1130.04" y="184.2" width="23.57" height="24.24" fill="none" stroke="none" pointer-events="all"/>
|
||||
<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="all"/>
|
||||
<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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -89,13 +88,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -106,13 +105,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -123,16 +122,15 @@
|
||||
</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="all"/>
|
||||
<rect x="440.16" y="203.76" width="23.84" height="24.24" fill="none" stroke="none" pointer-events="all"/>
|
||||
<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="all"/>
|
||||
<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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -143,13 +141,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -160,14 +158,14 @@
|
||||
</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="stroke"/>
|
||||
<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="all"/>
|
||||
<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: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<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/>
|
||||
@@ -203,14 +201,14 @@
|
||||
</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="stroke"/>
|
||||
<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="all"/>
|
||||
<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: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<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>
|
||||
@@ -223,13 +221,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -240,16 +238,15 @@
|
||||
</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="all"/>
|
||||
<rect x="805.7" y="205.16" width="23.84" height="24.24" fill="none" stroke="none" pointer-events="all"/>
|
||||
<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="all"/>
|
||||
<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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -260,13 +257,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -277,13 +274,13 @@
|
||||
</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="all"/>
|
||||
<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: all; white-space: normal; word-wrap: normal; ">
|
||||
<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>
|
||||
@@ -294,15 +291,15 @@
|
||||
</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="stroke"/>
|
||||
<path d="M 738 170.36 L 718 174.23" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 338 251 L 338 1" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/>
|
||||
<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: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<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)
|
||||
@@ -315,13 +312,13 @@
|
||||
</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="stroke"/>
|
||||
<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: all; background-color: #ffffff; white-space: nowrap; ">
|
||||
<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>
|
||||
|
||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
352
docs/extensions/storage/static/spacesprovider.drawio.svg
Normal file
@@ -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 |
405
docs/extensions/storage/static/spacesregistry.drawio.svg
Normal file
@@ -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 |
434
docs/extensions/storage/static/storage.drawio.svg
Normal file
@@ -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 |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 149 KiB |
@@ -1,15 +1,18 @@
|
||||
---
|
||||
title: "Storages"
|
||||
title: "Storage drivers"
|
||||
date: 2020-04-27T18:46:00+01:00
|
||||
weight: 37
|
||||
weight: 12
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: storages.md
|
||||
---
|
||||
|
||||
## Storage commands
|
||||
A *storage driver* implements access to a [*storage system*]({{< ref "#storage-systems" >}}):
|
||||
|
||||
`storage` has multiple storage provider commands to preconfigure different default configurations for the reva *storage provider* service. While you could rerun `storage storage-oc` multiple times with different flags to get multiple instances we are giving the different commands the necessary default configuration to allow the `ocis` binary to simply start them and not deal with configuration.
|
||||
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
|
||||
|
||||
@@ -25,7 +28,6 @@ A lot of different storage technologies exist, ranging from general purpose file
|
||||
|
||||
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.
|
||||
|
||||
@@ -78,7 +80,15 @@ The storage keeps an activity history, tracking the different actions that have
|
||||
|
||||
## Storage drivers
|
||||
|
||||
Reva currently has four storage driver implementations that can be used for *storage providers* an well as *data providers*.
|
||||
Reva currently has several storage driver implementations that can be used for *storage providers* an 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
|
||||
|
||||
### Local Storage Driver
|
||||
|
||||
@@ -9,13 +9,23 @@ 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.
|
||||
|
||||
## Resources
|
||||
A *resource* is a logical concept. Resources can be of [different types](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceType):
|
||||
## 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
|
||||
@@ -37,8 +47,8 @@ a `storage_space`, a `<root_id>` and a `<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 |
|
||||
| `!:<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`.
|
||||
@@ -93,9 +103,9 @@ Technically, this means that every storage driver needs to have a map of a `uuid
|
||||
{{< /hint >}}
|
||||
## Storage Providers
|
||||
|
||||
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 "#storage-drivers" >}}).
|
||||
## Technical concepts
|
||||
|
||||
### Storage Systems
|
||||
{{< svg src="extensions/storage/static/storageprovider.drawio.svg" >}}
|
||||
|
||||
{{< hint warning >}}
|
||||
@@ -132,7 +142,7 @@ By making *storage registries* aware of [*storage spaces*]({{< ref "#storage-spa
|
||||
## 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*),
|
||||
with a single *owner* (*user* or *group*),
|
||||
a *quota* and *permissions*, identified by a `storage space id`.
|
||||
|
||||
{{< svg src="extensions/storage/static/storagespace.drawio.svg" >}}
|
||||
@@ -147,35 +157,9 @@ Finally, a logical `storage space id` is not tied to a specific [*storage provid
|
||||
|
||||
## 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 "#storage-drivers" >}}).
|
||||
There migt be multiple [*storage drivers*]({{< ref "#storage-drivers" >}}) for a *storage system*, implementing different tradeoffs to match varying requirements.
|
||||
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
|
||||
### Gateways
|
||||
A *gateway* acts as a facade to the storage related services. It authenticates and forwards API calls that are publicly accessible.
|
||||
|
||||
|
||||
{{< hint warning >}}
|
||||
**Proposed Change**
|
||||
Currently, 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, which is a config flag that needs to be set for every storage driver.
|
||||
|
||||
The `enable_home` flag will cause drivers to jail path based requests into a `<userlayout>` subfolder. In effect it divides a storage provider into multiple [*storage spaces*]({{< ref "#storage-spaces" >}}): when calling `CreateHome` a subfolder following the `<userlayout>` is created and market as the root of a users home. Both, the eos and ocis storage drivers use extended attributes to mark the folder as the end of the size aggregation and tree mtime propagation mechanism. Even setting the quota is possible like that. All this literally is a [*storage space*]({{< ref "#storage-spaces" >}}).
|
||||
|
||||
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 `<userlayout>` as a `home` *storage space*,
|
||||
- iterating over the root of the storage and treating every folder following a new `<projectlayout>` 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}}
|
||||
```
|
||||
|
||||
This would make the `GetHome()` call return the path to the *storage provider* including the relative path to the *storage space*. No need for a *storage provider* mounted at `/home`. This is just a UI alias for `/users/<userlayout>`. Just like a normal `/home/<username>` on a linux machine.
|
||||
|
||||
But if we have no `/home` where do we find the shares, and how can clients discover changes in accepted shares?
|
||||
|
||||
The `/shares` namespace should be provided by a *storage provider* that lists all accepted shares for the current user... but 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 >}}
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
title: "Updating reva"
|
||||
date: 2020-05-22T00:00:00+00:00
|
||||
weight: 50
|
||||
geekdocRepo: https://github.com/owncloud/ocis
|
||||
geekdocEditPath: edit/master/docs/extensions/storage
|
||||
geekdocFilePath: updating.md
|
||||
---
|
||||
|
||||
{{< toc >}}
|
||||
|
||||
## Updating reva
|
||||
|
||||
1. Run `go get github.com/cs3org/reva@master`
|
||||
2. Create a changelog entry containing changes that were done in [reva](https://github.com/cs3org/reva/commits/master)
|
||||
3. Create a Pull Request to ocis-reva master with those changes
|
||||
4. If test issues appear, you might need to adjust the tests
|
||||
5. After the PR is merged, consider doing a [release of the storage submodule]({{< ref "releasing" >}})
|
||||
|
||||
@@ -1,12 +1,24 @@
|
||||
---
|
||||
title: "Users"
|
||||
date: 2020-01-16T00:00:00+00:00
|
||||
weight: 35
|
||||
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, eg. 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:
|
||||
|
||||
@@ -10,18 +10,16 @@ geekdocFilePath: _index.md
|
||||
{{< figure class="floatright" src="/media/is.png" width="70%" height="auto" >}}
|
||||
|
||||
## ownCloud Infinite Scale
|
||||
|
||||
Welcome to oCIS, the modern file-sync and share platform, which is based on our knowledge and experience with the PHP based [ownCloud server](https://owncloud.com/#server).
|
||||
|
||||
### The idea of federated storage
|
||||
To creata a truly federated storage architecture oCIS breaks down the old ownCloud 10 user specific namespace, which is assembled on the server side, and makes the individual parts accessible to clients as storage spaces and storage space registries.
|
||||
|
||||
To create a truly federated storage architecture oCIS breaks down the old ownCloud 10 user specific namespace, which is assembled on the server side, and makes the individual parts accessible to clients as storage spaces and storage space registries.
|
||||
|
||||
The below diagram shows the core concepts that are the foundation for the new architecture:
|
||||
The below diagram shows the core conceps that are the foundation for the new architecture:
|
||||
- End user devices can fetch the list of *storage spaces* a user has access to, by querying one or multiple *storage space registries*. The list contains a unique endpoint for every *storage space*.
|
||||
- [*Storage space registries*]({{< ref "../extensions/storage/terminology#storage-space-registries" >}}) manage the list of storage spaces a user has access to. They may subscribe to *storage spaces* in order to receive notifications about changes on behalf of an end users mobile or desktop client.
|
||||
- [*Storage spaces*]({{< ref "../extensions/storage/terminology#storage-spaces" >}}) represent a collection of files and folders. A users personal files are a *storage space*, a group or project drive is a *storage space*, and even incoming shares are treated and implemented as *storage spaces*. Each with properties like owners, permissions, quota and type.
|
||||
- [*Storage providers*]({{< ref "../extensions/storage/terminology#storage-providers" >}}) can hold multiple *storage spaces*. At an oCIS instance, there might be a dedicated *storage provider* responsible for users personal storage spaces. There might be multiple, sharing the load or there might be just one, hosting all types of *storage spaces*.
|
||||
- [*Storage spaces*]({{< ref "../extensions/storage/terminology#storage-spaces" >}}) represent a collection of files and folders. A users personal files are contained in a *storage space*, a group or project drive is a *storage space*, and even incoming shares are treated and implemented as *storage spaces*. Each with properties like owners, permissions, quota and type.
|
||||
- [*Storage providers*]({{< ref "../extensions/storage/terminology#storage-providers" >}}) can hold multiple *storage spaces*. At an oCIS instance, there might be a dedicated *storage provider* responsible for users personal storage spaces. There might be multiple, either to shard the load, provide different levels of redundancy or support custom workflows. Or there might be just one, hosting all types of *storage spaces*.
|
||||
|
||||
{{< svg src="ocis/static/idea.drawio.svg" >}}
|
||||
|
||||
@@ -42,7 +40,7 @@ The oCIS runtime allows us to dynamically manage services running in a single pr
|
||||
### oCIS extensions
|
||||
|
||||
Every oCIS extension uses [ocis-pkg](https://github.com/owncloud/ocis/tree/master/ocis-pkg), which implements the [go-micro](https://go-micro.dev/) interfaces for [servers](https://github.com/asim/go-micro/blob/v3.5.0/server/server.go#L17-L37) to register and [clients](https://github.com/asim/go-micro/blob/v3.5.0/client/client.go#L11-L23) to lookup nodes with a service [registry](https://github.com/asim/go-micro/blob/v3.5.0/registry/registry.go).
|
||||
We are following the [12 Factor](https://12factor.net/) methodology with oCIS. The uniformity of services also allows us to use the same command, logging and configuration mechanism. Configurations are forwarded from the
|
||||
We are following the [12 Factor](https://12factor.net/) methodology with oCIS. The uniformity of services also allows us to use the same command, logging and configuration mechanism. Configurations are forwarded from the
|
||||
oCIS runtime to the individual extensions.
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ is also responsible for redirecting requests on the OIDC discovery endpoints (e.
|
||||
|
||||
Keycloak add two containers: Keycloak itself and a PostgreSQL as database. Keycloak will be configured as oCIS' IDP instead of the internal IDP [LibreGraph Connect]({{< ref "../../extensions/idp" >}})
|
||||
|
||||
The other container is oCIS itself running all extensions in one container. In this example oCIS uses [oCIS storage driver]({{< ref "../../extensions/storage/storages#storage-drivers" >}})
|
||||
The other container is oCIS itself running all extensions in one container. In this example oCIS uses the [oCIS storage driver]({{< ref "../../extensions/storage/storagedrivers" >}})
|
||||
|
||||
## Server Deployment
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ geekdocFilePath: ocis_traefik.md
|
||||
|
||||
The docker stack consists of two containers. One of them is Traefik, a proxy which is terminating ssl and forwards the requests to oCIS in the internal docker network.
|
||||
|
||||
The other one is oCIS itself running all extensions in one container. In this example oCIS uses its internal IDP [LibreGraph Connect]({{< ref "../../extensions/idp" >}}) and the [oCIS storage driver]({{< ref "../../extensions/storage/storages#storage-drivers" >}})
|
||||
The other one is oCIS itself running all extensions in one container. In this example oCIS uses its internal IDP [LibreGraph Connect]({{< ref "../../extensions/idp" >}}) and the [oCIS storage driver]({{< ref "../../extensions/storage/storagedrivers" >}})
|
||||
|
||||
## Server Deployment
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ Is the pre-migration stage when having a functional ownCloud 10 instance.
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -45,10 +45,10 @@ _TODO allow limiting the web ui switch to an 'early adopters' group_
|
||||
</div>
|
||||
|
||||
#### Validation
|
||||
Ensure switching back an forth between the classic ownCloud 10 web UI and ownCloud web works as at our https://demo.owncloud.com.
|
||||
Ensure switching back an forth between the classic ownCloud 10 web UI and ownCloud web works as at our https://demo.owncloud.com.
|
||||
|
||||
#### Rollback
|
||||
Should there be problems with ownCloud web at this point it can simply be removed from the menu and be undeployed.
|
||||
Should there be problems with ownCloud web at this point it can simply be removed from the menu and be undeployed.
|
||||
|
||||
#### Notes
|
||||
<div style="break-after: avoid"></div>
|
||||
@@ -56,10 +56,10 @@ The ownCloud 10 demo instance uses OAuth to obtain a token for ownCloud web and
|
||||
|
||||
<div class="editpage">
|
||||
|
||||
_TODO make oauth2 in oc10 trust the new web ui, based on `redirect_uri` and CSRF so no explicit consent is needed_
|
||||
_TODO make oauth2 in oc10 trust the new web ui, based on `redirect_uri` and CSRF so no explicit consent is needed?_
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -68,15 +68,16 @@ _Feel free to add your question as a PR to this document using the link at the t
|
||||
### Stage 2: introduce OpenID Connect
|
||||
|
||||
Basic auth requires us to properly store and manage user credentials. Something we would rather like to delegate to a tool specifically built for that task.
|
||||
While SAML and Shibboleth are protocols that solve that problem, they are limited to web clients. Desktop and mobile clients were an afterthought and keep running into timeouts. For these reasons, we decided to move to [OpenID Connect as our primary authentication protocol](https://owncloud.com/news/openid-connect-oidc-app/).
|
||||
While SAML and Shibboleth are protocols that solve that problem, they are limited to web clients. Desktop and mobile clients were an afterthought and keep running into timeouts. For these reasons, we decided to move to [OpenID Connect as our primary authentication protocol](https://owncloud.com/news/openid-connect-oidc-app/).
|
||||
|
||||
<div class="editpage">
|
||||
|
||||
_TODO @butonic add ADR for OpenID Connect_
|
||||
_TODO @butonic add ADR for OpenID Connect and flesh out pros and cons of the above_
|
||||
|
||||
</div>
|
||||
|
||||
#### User impact
|
||||
|
||||
When introducing OpenID Connect, the clients will detect the new authentication scheme when their current way of authenticating returns an error. Users will then have to
|
||||
reauthorize at the OpenID Connect IdP, which again, may be configured to skip the consent step for trusted clients.
|
||||
|
||||
@@ -111,19 +112,19 @@ While OpenID Connect providers will send an `iss` and `sub` claim that relying p
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
<div style="break-after: page"></div>
|
||||
|
||||
### Stage 3: introduce oCIS interally
|
||||
### Stage 3: introduce oCIS internally
|
||||
|
||||
Before letting oCIS handle end user requests we will first make it available in the internal network. By subsequently adding services we can add functionality and verify the services work as intended.
|
||||
|
||||
Start oCIS backend and make read only tests on existing data using the `owncloudsql` storage driver which will read (and write)
|
||||
- blobs from the same data directory layout as in ownCloud 10
|
||||
- metadata from the ownCloud 10 database:
|
||||
- blobs from the same datadirectory layout as in ownCloud 10
|
||||
- metadata from the ownCloud 10 database:
|
||||
The oCIS share manager will read share information from the ownCloud database using an `owncloud` driver as well.
|
||||
|
||||
<div class="editpage">
|
||||
@@ -143,7 +144,7 @@ We are going to run and explore a series of services that will together handle t
|
||||
|
||||
|
||||
##### Storage provider for file metadata
|
||||
1. Deploy OCIS storage provider with the `owncloudsql` driver.
|
||||
1. Deploy OCIS storage provider with owncloudsql driver.
|
||||
2. Set `read_only: true` in the storage provider config. <div class="editpage">_TODO @butonic add read only flag to storage drivers_</div>
|
||||
3. Use cli tool to list files using the CS3 api
|
||||
|
||||
@@ -172,7 +173,7 @@ Enable spaces API in oc10:
|
||||
|
||||
{{< hint warning >}}
|
||||
**Alternative 2**
|
||||
An additional `uuid` property used only to detect moves. A lookup by uuid is not necessary for this. The `/dav/meta` endpoint would still take the fileid. Clients would use the `uuid` to detect moves and set up new sync pairs when migrating to a global namespace.
|
||||
An additional `uuid` property used only to detect moves. A lookup by uuid is not necessary for this. The `/dav/meta` endpoint would still take the fileid. Clients would use the `uuid` to detect moves and set up new sync pairs when migrating to a global namespace.
|
||||
### Stage-3.1
|
||||
Generate a `uuid` for every file as a file property. Clients can submit a `uuid` when creating files. The server will create a `uuid` if the client did not provide one.
|
||||
|
||||
@@ -181,7 +182,7 @@ Roll out new clients that understand the spaces API and know how to convert loca
|
||||
One pair for `/webdav/home` or `/dav/files/<username>/home` and another pair for every accepted share. The shares will be accessible at `/webdav/shares/` when the server side enables the spaces API. Files can be identified using the `uuid` and moved to the correct sync pair.
|
||||
|
||||
### Stage-4.1
|
||||
When reading the files from oCIS return the same `uuid`. It can be migrated to an extended attribute or it can be read from oc10. If users change it the client will not be able to detect a move and maybe other weird stuff happens. *What if the uuid gets lost on the server side due to a partial restore?*
|
||||
When reading the files from oCIS return the same `uuid`. It can be migrated to an extended attribute or it can be read from oc10. If users change it the client will not be able to detect a move and maybe other weird stuff happens. *What if the uuid gets lost on the server side due to a partial restore?*
|
||||
|
||||
{{< /hint >}}
|
||||
</div>
|
||||
@@ -223,7 +224,7 @@ Multiple ownCloud instances can be merged into one oCIS instance. The file ids w
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -261,7 +262,7 @@ With write access it becomes possible to manipulate existing files and shares.
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -273,10 +274,10 @@ In the previous stages oCIS was only accessible for administrators with access t
|
||||
#### User impact
|
||||
The IP address of the ownCloud host changes. There is no change for the file sync and share functionality when requests are handled by the oCIS codebase as it uses the same database and storage system as owncloud 10.
|
||||
|
||||
#### Steps and verifications
|
||||
#### Steps and verifications
|
||||
|
||||
##### Deploy oCIS proxy
|
||||
1. Deploy the `ocis proxy`
|
||||
1. Deploy the `ocis proxy`
|
||||
2. Verify the requests are routed based on the ownCloud 10 routing policy `oc10` by default
|
||||
|
||||
##### Test user based routing
|
||||
@@ -300,7 +301,7 @@ The proxy is stateless, multiple instances can be deployed as needed.
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -340,12 +341,13 @@ _TODO @butonic we need a canary app that allows users to decide for themselves w
|
||||
<div style="break-after: page"></div>
|
||||
|
||||
#### Notes
|
||||
Running the two systems in parallel requires additional maintenance effort. Try to keep the duration of this stage short. Until now, we only added services and made the system more complex. oCIS aims to reduce the maintenance cost of an ownCloud instance. You will not get there if you keep both systems alive.
|
||||
Running the two systems in parallel stage
|
||||
Try to keep the duration of this stage short. Until now we only added services and made the system more complex. oCIS aims to reduce the maintenance cost of an ownCloud instance. You will not get there if you keep both systems alive.
|
||||
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -355,8 +357,8 @@ _Feel free to add your question as a PR to this document using the link at the t
|
||||
To encourage users to switch you can promote the workspaces feature that is built into oCIS. The ownCloud 10 storage backend can be used for existing users. New users and group or project spaces can be provided by storage providers that better suit the underlying storage system.
|
||||
|
||||
#### Steps
|
||||
First, the admin needs to
|
||||
- deploy a storage provider with the storage driver that best fits the underlying storage system and requirements.
|
||||
First, the admin needs to
|
||||
- deploy a storage provider with the storage driver that best fits the underlying storage system and requirements.
|
||||
- register the storage in the storage registry with a new storage id (we recommend a uuid).
|
||||
|
||||
Then a user with the necessary create storage space role can create a storage space and assign Managers.
|
||||
@@ -373,7 +375,7 @@ The new storage space should show up in the `/graph/drives` endpoint for the man
|
||||
#### Notes
|
||||
Depending on the requirements and acceptable tradeoffs, a database less deployment using the ocis or s3ng storage driver is possible. There is also a [cephfs driver](https://github.com/cs3org/reva/pull/1209) on the way, that directly works on the API level instead of POSIX.
|
||||
|
||||
### Stage-8: shut down ownCloud 10
|
||||
### Stage-8: shut down ownCloud 10
|
||||
Disable ownCloud 10 in the proxy, all requests are now handled by oCIS, shut down oc10 web servers and redis (or keep for calendar & contacts only? rip out files from oCIS?)
|
||||
|
||||
#### User impact
|
||||
@@ -385,7 +387,7 @@ _TODO @butonic recommend alternatives_
|
||||
|
||||
</div>
|
||||
|
||||
#### Steps
|
||||
#### Steps
|
||||
1. Shut down the apache servers that are running the ownCloud 10 PHP code.
|
||||
2. DO NOT SHUT DOWN THE DATABASE, YET!
|
||||
|
||||
@@ -402,7 +404,7 @@ The database needs to remain online until the storage layer and share metadata h
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -414,7 +416,7 @@ To get rid of the database we will move the metadata from the old ownCloud 10 da
|
||||
#### User impact
|
||||
Noticeable performance improvements because we effectively shard the storage logic and persistence layer.
|
||||
|
||||
#### Steps
|
||||
#### Steps
|
||||
1. User by user storage migration from `owncloud` or `ownclouds3` driver to `ocis`/`s3ng`/`cephfs`... currently this means copying the metadata from one storage provider to another using the cs3 api.
|
||||
2. Change the responsible storage provider for a storage space (e.g. a user home, a group or project space are a workspace) in the storage registry.
|
||||
|
||||
@@ -441,7 +443,7 @@ The storage space migration will become a seamless feature in the future that al
|
||||
<div class="editpage">
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -457,7 +459,7 @@ Depending on chosen the share manager provider some sharing requests should be f
|
||||
- For non HA scenarios they can be served from memory, backed by a simple json file.
|
||||
- TODO: implement share manager with redis / nats / ... key value store backend: use the micro store interface please ...
|
||||
|
||||
#### Steps
|
||||
#### Steps
|
||||
1. Start new share manager
|
||||
2. Migrate metadata using the CS3 API (copy from old to new)
|
||||
3. Shut down old share manager
|
||||
@@ -482,7 +484,7 @@ _TODO let the gateway write updates to multiple share managers ... or rely on th
|
||||
</div>
|
||||
|
||||
#### Rollback
|
||||
To switch the share manager to the database one revert routing users to the new share manager. If you already shut down the old share manager start it again. Use the tiered/chained share manager provider in reverse configuration (new share provider as read only, old as write) and migrate the shares again. You can alse restore a database backup if needed.
|
||||
To switch the share manager to the database one revert routing users to the new share manager. If you already shut down the old share manager start it again. Use the tiered/chained share manager provider in reverse configuration (new share provider as read only, old as write) and migrate the shares again. You can also restore a database backup if needed.
|
||||
|
||||
<div class="editpage">
|
||||
|
||||
@@ -490,7 +492,7 @@ To switch the share manager to the database one revert routing users to the new
|
||||
Profit! Well, on the one hand you do not need to maintain a clustered database setup and can rely on the storage system. On the other hand you are now in microservice wonderland and will have to relearn how to identify bottlenecks and scale oCIS accordingly. The good thing is that tools like jaeger and prometheus have evolved and will help you understand what is going on. But this is a different topic. See you on the other side!
|
||||
|
||||
#### FAQ
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
_Feel free to add your question as a PR to this document using the link at the top of this page!_
|
||||
|
||||
</div>
|
||||
|
||||
@@ -503,7 +505,7 @@ The fundamental difference between ownCloud 10 and oCIS is that the file metadat
|
||||
|
||||
## Data that will be migrated
|
||||
|
||||
Currently, oCIS focuses on file sync and share use cases.
|
||||
Currently, oCIS focuses on file sync and share use cases.
|
||||
|
||||
### Blob data
|
||||
|
||||
@@ -533,7 +535,7 @@ data
|
||||
│ │ │ └── Notes.md.v1540305560
|
||||
│ │ └── ownCloud Manual.pdf.v1396628249
|
||||
│ ├── thumbnails
|
||||
│ │ └── 123
|
||||
│ │ └── 123
|
||||
│ │ │ ├── 2048-1536-max.png
|
||||
│ │ │ └── 32-32.png // the file id, eg. of /Photos/Portugal.jpg
|
||||
│ └── uploads
|
||||
@@ -553,9 +555,9 @@ The *data directory* may also contain subfolders for ownCloud 10 applications li
|
||||
|
||||
When an object storage is used as the primary storage all file blobs are stored by their file id and a prefix, eg.: `urn:oid:<fileid>`.
|
||||
|
||||
The three types of blobs we need to migrate are stored in
|
||||
The three types of blobs we need to migrate are stored in
|
||||
- `files` for file blobs, the current file content,
|
||||
- `files_trashbin` for trashed files (and their versions) and
|
||||
- `files_trashbin` for trashed files (and their versions) and
|
||||
- `files_versions` for file blobs of older versions.
|
||||
|
||||
<div style="break-after: page"></div>
|
||||
@@ -586,7 +588,7 @@ The `filecache` table itself has more metadata:
|
||||
| `checksum` | varchar(255) | YES | | NULL | | *same as blob checksum* | SHOULD become the checksum in the storage provider. eos calculates it itself, `ocis` driver stores it in extended attributes |
|
||||
|
||||
|
||||
> Note: for EOS a hot migration only works seamlessly if file ids in oc10 are already read from eos. otherwise either a mapping from the oc10 filecache file id to the new eos file id has to be created under the assumption that these id sets do not intersect or files and corresponding shares need to be exported and imported offline to generate a new set of ids. While this will preserve public links, user, group and even federated shares, old internal links may still point to different files because they contain the oc10 fileid
|
||||
> Note: for EOS a hot migration only works seamlessly if file ids in oc10 are already read from eos. otherwise either a mapping from the oc10 filecache file id to the new eos file id has to be created under the assumption that these id sets do not intersect or files and corresponding shares need to be exported and imported offline to generate a new set of ids. While this will preserve public links, user, group and even federated shares, old internal links may still point to different files because they contain the oc10 fileid
|
||||
|
||||
<div style="break-after: page"></div>
|
||||
|
||||
@@ -730,7 +732,7 @@ _TODO clarify if metadata from ldap & user_shibboleth needs to be migrated_
|
||||
|
||||
</div>
|
||||
|
||||
The `dn` -> *owncloud internal username* mapping that currently lives in the `oc_ldap_user_mapping` table needs to move into a dedicated ownclouduuid attribute in the LDAP server. The idp should send it as a claim so the proxy does not have to look up the user using LDAP again. The username cannot be changed in ownCloud 10 and the oCIS provisioning API will not allow changing it as well. When we introduce the graph api we may allow changing usernames when all clients have moved to that api.
|
||||
The `dn` -> *owncloud internal username* mapping that currently lives in the `oc_ldap_user_mapping` table needs to move into a dedicated `ownclouduuid` attribute in the LDAP server. The idp should send it as a claim so the proxy does not have to look up the user using LDAP again. The username cannot be changed in ownCloud 10 and the oCIS provisioning API will not allow changing it as well. When we introduce the graph api we may allow changing usernames when all clients have moved to that api.
|
||||
|
||||
The problem is that the username in owncloud 10 and in oCIS also need to be the same, which might not be the case when the ldap mapping used a different column. In that case we should add another owncloudusername attribute to the ldap server.
|
||||
|
||||
|
||||