demonstrates adding an instance-level endpoint for Conan to workhorse. You can also see the Maven project level endpoint
implemented in the same file.
Once the route has been added, you will need to add an additional `/authorize` version of the upload endpoint to your API file.
[Here is an example](https://gitlab.com/gitlab-org/gitlab/blob/398fef1ca26ae2b2c3dc89750f6b20455a1e5507/ee/lib/api/maven_packages.rb#L164)
of the additional endpoint added for Maven. The `/authorize` endpoint verifies and authorizes the request from workhorse,
then the normal upload endpoint is implemented below, consuming the metadata that workhorse provides in order to
create the package record. Workhorse provides a variety of file metadata such as type, size, and different checksum formats.
For testing purposes, you may want to [enable object storage](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/object_storage.md)
in your local development environment.
## Services and finders
Logic for performing tasks such as creating package or package file records or finding packages should not live
within the API file, but should live in services and finders. Existing services and finders should be used or
extended when possible to keep the common package logic grouped as much as possible.
## Configuration
## Configuration
...
@@ -56,7 +96,7 @@ to add anything there.
...
@@ -56,7 +96,7 @@ to add anything there.
Packages can be configured to use object storage, therefore your code must support it.
Packages can be configured to use object storage, therefore your code must support it.
## Database
## Database and handling metadata
The current database model allows you to store a name and a version for each package.
The current database model allows you to store a name and a version for each package.
Every time you upload a new package, you can either create a new record of `Package`
Every time you upload a new package, you can either create a new record of `Package`
...
@@ -65,4 +105,58 @@ information like the file `name`, `side`, `sha1`, etc.
...
@@ -65,4 +105,58 @@ information like the file `name`, `side`, `sha1`, etc.
If there is specific data necessary to be stored for only one package system support,
If there is specific data necessary to be stored for only one package system support,
consider creating a separate metadata model. See `packages_maven_metadata` table
consider creating a separate metadata model. See `packages_maven_metadata` table
and `Packages::MavenMetadatum` model as example for package specific data.
and `Packages::MavenMetadatum` model as an example for package specific data, and `packages_conan_file_metadata` table
and `Packages::ConanFileMetadatum` model as an example for package file specific data.
If there is package specific behavior for a given package manager, add those methods to the metadata models and
delegate from the package model.
Note that the existing package UI only displays information within the `packages_packages` and `packages_package_files`
tables. If the data stored in the metadata tables need to be displayed, a ~frontend change will be required.
## Authorization
There are project and group level permissions for `read_package`, `create_package`, and `destroy_package`. Each
endpoint should
[authorize the requesting user](https://gitlab.com/gitlab-org/gitlab/blob/398fef1ca26ae2b2c3dc89750f6b20455a1e5507/ee/lib/api/conan_packages.rb#L84)
against the project or group before continuing.
## Keep iterations small
When implementing a new package manager, it is easy to end up creating one large merge request containing all of the
necessary endpoints and services necessary to support basic usage. If this is the case, consider putting the
API endpoints behind a [feature flag](feature_flags/development.md) and
submitting each endpoint or behavior (download, upload, etc) in different merge requests to shorten the review
process.
### Potential MRs for any given package system
#### MVC MRs
These changes represent all that is needed to deliver a minimally usable package management system.
1. Empty file structure (api file, base service for this package)
1. Authentication system for 'logging in' to the package manager
1. Identify metadata and create applicable tables
1. Workhorse route for [object storage accelerated uploads](uploads.md#workhorse-object-storage-acceleration)
1. Endpoints required for upload/publish
1. Endpoints required for install/download
1. Endpoints required for remove/delete
#### Possible post-MVC MRs
These updates are not essential to be able to publish and consume packages, but may be desired as the system is
released for general use.
1. Endpoints required for search
1. Front end updates to display additional package information and metadata
1. Limits on file sizes
1. Tracking for metrics
## Exceptions
This documentation is just guidelines on how to implement a package manager to match the existing structure and logic
already present within GitLab. While the structure is intended to be extendable and flexible enough to allow for
any given package manager, if there is good reason to stray due to the constraints or needs of a given package
manager, then it should be raised and discussed within the implementation issue or merge request to work towards
@@ -705,6 +705,43 @@ For more information about the available options, run:
...
@@ -705,6 +705,43 @@ For more information about the available options, run:
/chatops run explain --help
/chatops run explain --help
```
```
### `#database-lab`
Another tool GitLab employees can use is a chatbot powered by [Joe](https://gitlab.com/postgres-ai/joe), available in the [`#database-lab`](https://gitlab.slack.com/archives/CLJMDRD8C) channel on Slack.
Unlike chatops, it gives you a way to execute DDL statements (like creating indexes and tables) and get query plan not only for `SELECT` but also `UPDATE` and `DELETE`.
For example, in order to test new index you can do the following:
Create the index:
```
exec CREATE INDEX index_projects_marked_for_deletion ON projects (marked_for_deletion_at) WHERE marked_for_deletion_at IS NOT NULL
```
Analyze the table to update its statistics:
```
exec ANALYZE projects
```
Get the query plan:
```
explain SELECT * FROM projects WHERE marked_for_deletion_at < CURRENT_DATE
```
Once done you can rollback your changes:
```
reset
```
For more information about the available options, run:
```
help
```
## Further reading
## Further reading
A more extensive guide on understanding query plans can be found in
A more extensive guide on understanding query plans can be found in
@@ -20,6 +20,7 @@ You will need at least Maintainer [permissions](../../permissions.md) to enable
...
@@ -20,6 +20,7 @@ You will need at least Maintainer [permissions](../../permissions.md) to enable
GitLab provides an easy way to connect Sentry to your project:
GitLab provides an easy way to connect Sentry to your project:
1. Sign up to Sentry.io or [deploy your own](#deploying-sentry) Sentry instance.
1. Sign up to Sentry.io or [deploy your own](#deploying-sentry) Sentry instance.
1.[Create](https://docs.sentry.io/guides/integrate-frontend/create-new-project/) a new Sentry project. For each GitLab project that you want to integrate, we recommend that you create a new Sentry project.
1.[Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project.
1.[Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project.
Make sure to give the token at least the following scopes: `event:read` and `project:read`.
Make sure to give the token at least the following scopes: `event:read` and `project:read`.
1. Navigate to your project’s **Settings > Operations**.
1. Navigate to your project’s **Settings > Operations**.
msgid "Security Reports|While it's rare to have no vulnerabilities for your group, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgid "Security Reports|While it's rare to have no vulnerabilities for your group, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgid "SecurityDashboard| The security dashboard displays the latest security report. Use it to find and fix vulnerabilities."
msgid "SecurityDashboard| The security dashboard displays the latest security report. Use it to find and fix vulnerabilities."
msgstr ""
msgstr ""
...
@@ -16376,6 +16403,15 @@ msgstr ""
...
@@ -16376,6 +16403,15 @@ msgstr ""
msgid "Subscription"
msgid "Subscription"
msgstr ""
msgstr ""
msgid "Subscription deletion failed."
msgstr ""
msgid "Subscription successfully created."
msgstr ""
msgid "Subscription successfully deleted."
msgstr ""
msgid "SubscriptionTable|Billing"
msgid "SubscriptionTable|Billing"
msgstr ""
msgstr ""
...
@@ -16873,6 +16909,9 @@ msgstr ""
...
@@ -16873,6 +16909,9 @@ msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
msgstr ""
msgid "The configuration status of the table below only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've configured a scan for the default branch, any subsequent feature branch you create will include the scan."
msgstr ""
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
msgstr ""
...
@@ -17527,6 +17566,9 @@ msgstr ""
...
@@ -17527,6 +17566,9 @@ msgstr ""
msgid "This project does not have billing enabled. To create a cluster, <a href=%{linkToBilling} target=\"_blank\" rel=\"noopener noreferrer\">enable billing <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i></a> and try again."
msgid "This project does not have billing enabled. To create a cluster, <a href=%{linkToBilling} target=\"_blank\" rel=\"noopener noreferrer\">enable billing <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i></a> and try again."
msgstr ""
msgstr ""
msgid "This project path either does not exist or is private."