Project Aquarium is a SUSE-sponsored open source project aiming at becoming an easy to use, rock solid storage appliance based on Ceph.

Overview

Project Aquarium

Website

GitHub Repo stars

GitHub last commit Lines of code GitHub contributors GitHub issues GitHub milestones

Project Aquarium is a SUSE-sponsored open source project aiming at becoming an easy to use, rock solid storage appliance based on Ceph.

We are investigating the beginnings of a new storage appliance project in an opinionated fashion. The Aquarium project is split into two clearly defined work streams: Gravel (backend) and Glass (frontend).

Aquarist Labs is licensed under LGPL version 2.1. We do not require assignment of a copyright to contribute code; code is contributed under the terms of the applicable license.

How do I get started?

Look at the issue list or check out our Slack channel (see below) and ask one of the friendly contributors. You can also view our project board and check our Review Guidelines.

If you want to get your hands dirty as soon as possible, you can also run the script at tools/setup-dev.sh. This will ensure you have a basic development environment as soon as possible so you can start hacking.

You will be able to find the backend bits in src/gravel, while the frontend bits are located in src/glass.

Check out our From Zero to Hacking quickstart to help you get off your feet.

Where can I get more help, if I need it?

Join us on Slack! You can sign up here.

We have the following channels:

  • #announcements: For all announcements related to Aquarist Labs and the Aquarium project
  • #aquarium: For all conversation and questions surrounding the Aquarium project
  • #general: Show us your best gif!
  • #github-notifications: Notifications from the github app.

If you have a new idea, or want to discuss any implementation details, we recommend using our Discussion page on GitHub.

Checking out the source

You can clone from github with

git clone [email protected]:aquarist-labs/aquarium

or, if you are not a github user,

git clone git://github.com/aquarist-labs/aquarium
Comments
  • Rewrite the kiwi without MicroOS and remove non essential parts

    Rewrite the kiwi without MicroOS and remove non essential parts

    Same as #316 just remove all the commits by a new branch instead. Removing dependency from MicroOS Create LiveISO image type with persistent storage Updated vagrant image and add VirtualBox support.

    Signed-off-by: Alex Lau (AvengerMoJo) [email protected]

    enhancement tooling images 
    opened by AvengerMoJo 50
  • gravel: requires Python 3.7+ ?

    gravel: requires Python 3.7+ ?

    I'm not really sure if it's actually a bug and Python 3.7+ is required (and the issue can just be closed). Just in case it's not, I like to raise the issue here. So... on my local environment I noticed the following issue when running tox:

    tox
    py3 installed: aiofiles==0.6.0,attrs==20.3.0,click==7.1.2,dataclasses==0.8,fastapi==0.63.0,h11==0.12.0,importlib-metadata==3.10.0,iniconfig==1.1.1,packaging==20.9,pluggy==0.13.1,py==1.10.0,pydantic==1.7.3,pyfakefs==4.4.0,pyparsing==2.4.7,pytest==6.2.2,pytest-asyncio==0.14.0,pytest-datadir==1.3.1,pytest-mock==3.5.1,starlette==0.13.6,toml==0.10.2,typing-extensions==3.7.4.3,uvicorn==0.13.3,websockets==8.1,zipp==3.4.1
    py3 runtests: PYTHONHASHSEED='2579776963'
    py3 runtests: commands[0] | pytest gravel/
    ============================================================================================================ test session starts ============================================================================================================
    platform linux -- Python 3.6.12, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
    rootdir: /.../src/aquarium/src, configfile: tox.ini
    plugins: datadir-1.3.1, pyfakefs-4.4.0, asyncio-0.14.0, mock-3.5.1
    collected 17 items                                                                                                                                                                                                                          
    
    gravel/tests/unit/cephadm/test_cephadm.py .......                                                                                                                                                                                     [ 41%]
    gravel/tests/unit/controllers/test_config.py ...                                                                                                                                                                                      [ 58%]
    gravel/tests/unit/controllers/test_gstate.py .F                                                                                                                                                                                       [ 70%]
    gravel/tests/unit/controllers/orch/test_ceph.py .....                                                                                                                                                                                 [100%]
    
    ================================================================================================================= FAILURES ==================================================================================================================
    _______________________________________________________________________________________________________________ test_tickers ________________________________________________________________________________________________________________
    
    gstate = <gravel.controllers.gstate.GlobalState object at 0x7fdae58bfb00>
    
        @pytest.mark.asyncio
        async def test_tickers(gstate):
            from gravel.controllers.gstate import Ticker
        
            class TestTicker(Ticker):
                def __init__(self, name):
                    super().__init__(name, 1.0)
                    self.has_ticked = False
        
                async def _do_tick(self) -> None:
                    self.has_ticked = True
        
                async def _should_tick(self) -> bool:
                    return not self.has_ticked
        
            ticker = TestTicker("test")
            assert "test" in gstate.tickers
        
    >       await gstate._do_ticks()  # pyright: reportPrivateUsage=false
    
    gravel/tests/unit/controllers/test_gstate.py:31: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    
    self = <gravel.controllers.gstate.GlobalState object at 0x7fdae58bfb00>
    
        async def _do_ticks(self) -> None:
            for desc, ticker in self.tickers.items():
                logger.debug(f"tick {desc}")
    >           asyncio.create_task(ticker.tick())
    E           AttributeError: module 'asyncio' has no attribute 'create_task'
    
    gravel/controllers/gstate.py:147: AttributeError
    ========================================================================================================== short test summary info ==========================================================================================================
    FAILED gravel/tests/unit/controllers/test_gstate.py::test_tickers - AttributeError: module 'asyncio' has no attribute 'create_task'
    ======================================================================================================= 1 failed, 16 passed in 0.36s ========================================================================================================
    ERROR: InvocationError: '/.../src/aquarium/src/.tox/py3/bin/pytest gravel/'
    
    bug question milestone: recommended 
    opened by s0nea 42
  • deps: Fix potential dependency issues on dev machines

    deps: Fix potential dependency issues on dev machines

    Because setup-dev.sh is ran on the developers machine, it is not okay to use the system packages which may conflict with the requirements.txt aquarium is trying to install (for example, the system packages may already supply a dependency which will mean that pip will then not install it into the venv).

    Instead we should ensure the venv is created without system packages. This is what is eventually copied into the virtual machine. Before we copy it in though we need to re-enable the system packages for librados to work, so we do that manually with sed.

    Signed-off-by: Joshua Hesketh [email protected]

    documentation 
    opened by jhesketh 27
  • [tool] Remove repo install kiwi with pip for Debian and Ubuntu also update config.sh

    [tool] Remove repo install kiwi with pip for Debian and Ubuntu also update config.sh

    Replace the kiwi package install with pip instead. Update the config.sh remove baseCleanMount replace the vagrant setup with baseVagrantSetup

    Signed-off-by: Alex Lau (AvengerMoJo) [email protected]

    opened by AvengerMoJo 25
  • Introduce runtime python venv for dependencies, add Makefile

    Introduce runtime python venv for dependencies, add Makefile

    This is work towards being able to have an actual package (rpm, deb, ...) of Aquarium (see https://github.com/aquarist-labs/aquarium/issues/91).

    I've added a Makefile with a dist target, so you can now run make dist to get a tarball named something like aquarium-0.1.0-0-gc28eb76.tar.gz, which includes a built glass and all the necessary bits of gravel. It also includes all our python dependencies (per src/requirements.txt) in /usr/share/aquarium/venv, so we don't have to worry about not having packaged versions of these things on whatever distros we deploy on.

    This doesn't change the current dev workflow at all. You still build an image by running ./tools/build-image.sh, but that script will in turn call make dist to get a tarball to install in the image. In future (once I've got a spec file and rpm build sorted out), this can be changed so that the kiwi config uses that actual package, instead of the tarball.

    That said, if you don't want to build an image, but would rather try a manual Aquarium install on some random Linux, you could run make dist, then take the tarball and extract it on the system you want to deploy on. Might be a bit of fun ;-)

    Note: the version string used in the tarball name is based on the latest annotated tag in the form 'vX.Y.Z', which means I've suddenly introduced the notion of actual version numbers and releases to the project. Sorry.

    Fixes: https://github.com/aquarist-labs/aquarium/issues/277 Signed-off-by: Tim Serong [email protected]

    WIP feature glass needs-rebase tooling images 
    opened by tserong 25
  • tools/aqua: add multiple deployment types

    tools/aqua: add multiple deployment types

    Signed-off-by: Kyr Shatskyy [email protected]

    Checklist

    • [ ] References issues, create if required
    • [ ] Updates documentation if necessary
    • [ ] Includes tests for new functionality or reproducer for bug

    Show available Jenkins commands
    • jenkins test tumbleweed
    • jenkins run tumbleweed
    • jenkins test leap
    • jenkins run leap
    CI tooling 
    opened by kshtsk 24
  • tool: add tool to deal with vagrant deployments, drop 'setup.sh'

    tool: add tool to deal with vagrant deployments, drop 'setup.sh'

    Inspired by sesdev.

    Hopefully will consolidate things a bit more for us, and especially newcomers, than a bunch of scripts spread throughout.

    Stretch goal, eventually, will be to also get image builds going through this script.

    Signed-off-by: Joao Eduardo Luis <[email protected]>

    documentation feature tooling 
    opened by jecluis 24
  • gravel: replace etcd with kvstore backed by ceph itself

    gravel: replace etcd with kvstore backed by ceph itself

    This is a bit rough. There's all sorts of sharp corners you can cut your fingers on. Also, I haven't actually removed the etcd bootstrap bits yet, and I haven't touched any of the tests. Still, it does actually work. Well... Almost. I just tried adding a second node, and it's failing with "assert ntp_addr" in gravel/controllers/nodes/deployment.py's join() for some reason. I'm not sure yet if that's due to this change or not. Still, feedback on the general approach would be greatly appreciated :-)

    Signed-off-by: Tim Serong [email protected]

    Checklist

    • [ ] References issues, create if required
    • [ ] Updates documentation if necessary
    • [ ] Includes tests for new functionality or reproducer for bug

    Show available Jenkins commands
    • jenkins test tumbleweed
    • jenkins run tumbleweed
    • jenkins test leap
    • jenkins run leap
    documentation enhancement gravel 
    opened by tserong 20
  • Completely replace existing MicroOS kiwi

    Completely replace existing MicroOS kiwi

    MicroOS using cutomized liveiso persistent script that is not easy to debug. Since we are not using all the distribution profile in the MicroOS kiwi configuration. I rewrite the kiwi config with the liveiso being persistent by the driver available storage

    images 
    opened by AvengerMoJo 20
  • gravel/glass: user management

    gravel/glass: user management

    The default credentials set up during deployment are: admin/aquarium

    Peek 2021-06-25 17-27

    Peek 2021-06-25 17-40

    Fixes: https://github.com/aquarist-labs/aquarium/issues/421 Fixes: https://github.com/aquarist-labs/aquarium/issues/23 Fixes: https://github.com/aquarist-labs/aquarium/issues/26

    Signed-off-by: Volker Theile [email protected]

    Checklist

    • [x] References issues, create if required
    • [ ] Updates documentation if necessary
    • [ ] Includes tests for new functionality or reproducer for bug

    Show available Jenkins commands
    • jenkins test tumbleweed
    • jenkins run tumbleweed
    • jenkins test leap
    • jenkins run leap
    feature glass gravel prio: medium aqr: Must Have 
    opened by votdev 19
  • Use python black

    Use python black

    This change is purely to do with formatting and also likely purely subjective.

    However, there have been a few times in reviews that people have had different styles and that has caused either confusion or a desire to consolidate.

    Black takes all these arguments away by being the dictator in what is correct. Read more about it here: https://black.readthedocs.io/en/stable/index.html

    As this is very subjective, we should make sure people are onboard with this styling before merging it.

    gravel prio: high 
    opened by jhesketh 19
  • Join fails with

    Join fails with "Failed to bootstrap the system: SSL Error."

    Seen while testing #758. Tried to join a new node to the cluster, and got this:

    image

    From a quick grep through src/gravel/controllers/deployment/join.py, it looks like we might be trying to default to https:// when calling /api/deploy/join/request on the existing host, but that's never going to work until #759 goes in.

    bug 
    opened by tserong 0
  • Why allow custom container image to be specified when _joining_ node to existing cluster?

    Why allow custom container image to be specified when _joining_ node to existing cluster?

    Seen while testing #758. When joining a new node to an existing cluster, the Networking page asks if you want to use the default image, or a custom image. Why allow a different image to be specified for nodes that are joining? Shouldn't the image to use be a cluster-wide setting, and only need to be specified on the first node, when you create the cluster? Or am I missing something?

    bug glass gravel 
    opened by tserong 1
  • Storage page of installer should allow selecting all storage with one click

    Storage page of installer should allow selecting all storage with one click

    Seen while playing with #758. The Storage page shows a list of disks you can select to use for storage, and if you want to use all of them, you have to click each one individually. It'd be nice if there were a way to select all disks with one click (maybe a checkbox at the top in the header line?)

    feature glass 
    opened by tserong 0
  • Invalid container image name errors are also spectacularly inscrutable :-)

    Invalid container image name errors are also spectacularly inscrutable :-)

    While testing #758 I had a similar experience to #707 when specifying a bogus container image name:

    nonexistent-image

    This results in a brief "Http failure response for [...]/api/deploy/create: 400 Bad Request" when you hit the "Install" button:

    bad-request

    journalctl -u aquarium just says:

    Dec 21 07:52:40 node1 uvicorn[1446]: INFO:     2021-12-21 07:52:40 -- mgr -- Attempt to create a new deployment.
    Dec 21 07:52:42 node1 uvicorn[1446]: ERROR:    2021-12-21 07:52:42 -- create -- Unable to create deployment: pre-checks failed:
    Dec 21 07:52:42 node1 uvicorn[1446]: ERROR:    2021-12-21 07:52:42 -- mgr -- Error creating a new deployment: Pre-checks failed, unable to create.
    

    The debug log isn't really any more enlightening:

    DEBUG:    2021-12-21 07:56:18 -- deploy -- Create new deployment.
    INFO:     2021-12-21 07:56:18 -- mgr -- Attempt to create a new deployment.
    DEBUG:    2021-12-21 07:56:18 -- create -- Preflight checks: registry='registry.opensuse.org' image='filesystems/ceph/master/.../this-does-not-exist' secure=True
    DEBUG:    2021-12-21 07:56:18 -- connectionpool -- Starting new HTTPS connection (1): registry.opensuse.org:443
    DEBUG:    2021-12-21 07:56:19 -- connectionpool -- https://registry.opensuse.org:443 "GET /v2/ HTTP/1.1" 200 2
    ERROR:    2021-12-21 07:56:19 -- create -- Unable to create deployment: pre-checks failed: 
    ERROR:    2021-12-21 07:56:19 -- mgr -- Error creating a new deployment: Pre-checks failed, unable to create.
    

    Looking at registry_check() in src/gravel/controllers/containers.py, there seems to be plenty of good error messages attached to the various exceptions that are raised, but these don't seem to make it back into the log file, or to the UI.

    Also, semi-related: should we really be splitting the Image URL into "Image registry URL" and "Image Name" in the UI? Wouldn't it be more intuitive to just have the image URL as a single field?

    bug glass gravel 
    opened by tserong 0
  • [RFC] doc/spec: document host requirements

    [RFC] doc/spec: document host requirements

    Signed-off-by: Mykola Golub [email protected]

    Checklist

    • [ ] References issues, create if required
    • [ ] Updates documentation if necessary
    • [ ] Includes tests for new functionality or reproducer for bug

    Show available Jenkins commands
    • jenkins run tumbleweed
    • jenkins run leap
    • jenkins run ubuntu
    documentation 
    opened by trociny 4
Releases(v0.4.2)
Owner
Aquarist Labs
We perform experiments on Cephalopods and put them into pretty containers.
Aquarist Labs
Oriented Object Detection: Oriented RepPoints + Swin Transformer/ReResNet

Oriented RepPoints for Aerial Object Detection The code for the implementation of “Oriented RepPoints + Swin Transformer/ReResNet”. Introduction Based

96 Dec 13, 2022
Vehicle direction identification consists of three module detection , tracking and direction recognization.

Vehicle-direction-identification Vehicle direction identification consists of three module detection , tracking and direction recognization. Algorithm

5 Nov 15, 2022
Interpretable-contrastive-word-mover-s-embedding

Interpretable-contrastive-word-mover-s-embedding Paper Datasets Here is a Dropbox link to the datasets used in the paper: https://www.dropbox.com/sh/n

0 Nov 02, 2021
ShuttleNet: Position-aware Fusion of Rally Progress and Player Styles for Stroke Forecasting in Badminton (AAAI 2022)

ShuttleNet: Position-aware Rally Progress and Player Styles Fusion for Stroke Forecasting in Badminton (AAAI 2022) Official code of the paper ShuttleN

Wei-Yao Wang 11 Nov 30, 2022
Pre-Training Graph Neural Networks for Cold-Start Users and Items Representation.

Pretrain-Recsys This is our Tensorflow implementation for our WSDM 2021 paper: Bowen Hao, Jing Zhang, Hongzhi Yin, Cuiping Li, Hong Chen. Pre-Training

30 Nov 14, 2022
A PyTorch implementation of Implicit Q-Learning

IQL-PyTorch This repository houses a minimal PyTorch implementation of Implicit Q-Learning (IQL), an offline reinforcement learning algorithm, along w

Garrett Thomas 30 Dec 12, 2022
scikit-learn inspired API for CRFsuite

sklearn-crfsuite sklearn-crfsuite is a thin CRFsuite (python-crfsuite) wrapper which provides interface simlar to scikit-learn. sklearn_crfsuite.CRF i

417 Dec 20, 2022
Face recognition. Redefined.

FaceFinder Use a powerful CNN to identify faces in images! TABLE OF CONTENTS About The Project Built With Getting Started Prerequisites Installation U

BleepLogger 20 Jun 16, 2021
A Game-Theoretic Perspective on Risk-Sensitive Reinforcement Learning

Officile code repository for "A Game-Theoretic Perspective on Risk-Sensitive Reinforcement Learning"

Mathieu Godbout 1 Nov 19, 2021
I tried to apply the CAM algorithm to YOLOv4 and it worked.

YOLOV4:You Only Look Once目标检测模型在pytorch当中的实现 2021年2月7日更新: 加入letterbox_image的选项,关闭letterbox_image后网络的map得到大幅度提升。 目录 性能情况 Performance 实现的内容 Achievement

55 Dec 05, 2022
Jarvis Project is a basic virtual assistant that uses TensorFlow for learning.

Jarvis_proyect Jarvis Project is a basic virtual assistant that uses TensorFlow for learning. Latest version 0.1 Features: Good morning protocol Tell

Anze Kovac 3 Aug 31, 2022
Open-L2O: A Comprehensive and Reproducible Benchmark for Learning to Optimize Algorithms

Open-L2O This repository establishes the first comprehensive benchmark efforts of existing learning to optimize (L2O) approaches on a number of proble

VITA 161 Jan 02, 2023
This repo includes the CUB-GHA (Gaze-based Human Attention) dataset and code of the paper "Human Attention in Fine-grained Classification".

HA-in-Fine-Grained-Classification This repo includes the CUB-GHA (Gaze-based Human Attention) dataset and code of the paper "Human Attention in Fine-g

16 Oct 29, 2022
The codes reproduce the figures and statistics in the paper, "Controlling for multiple covariates," by Mark Tygert.

The accompanying codes reproduce all figures and statistics presented in "Controlling for multiple covariates" by Mark Tygert. This repository also pr

Meta Research 1 Dec 02, 2021
This program creates a formatted excel file which highlights the undervalued stock according to Graham's number.

Over-and-Undervalued-Stocks Of Nepse Using Graham's Number Scrap the latest data using different websites and creates a formatted excel file that high

6 May 03, 2022
Monitora la qualità della ricezione dei segnali radio nelle province siciliane.

FMap-server Monitora la qualità della ricezione dei segnali radio nelle province siciliane. Conversion data Frequency - StationName maps are stored in

Triglie 5 May 24, 2021
Many Class Activation Map methods implemented in Pytorch for CNNs and Vision Transformers. Including Grad-CAM, Grad-CAM++, Score-CAM, Ablation-CAM and XGrad-CAM

Class Activation Map methods implemented in Pytorch pip install grad-cam ⭐ Tested on many Common CNN Networks and Vision Transformers. ⭐ Includes smoo

Jacob Gildenblat 6.6k Jan 06, 2023
TensorFlow implementation of AlexNet and its training and testing on ImageNet ILSVRC 2012 dataset

AlexNet training on ImageNet LSVRC 2012 This repository contains an implementation of AlexNet convolutional neural network and its training and testin

Matteo Dunnhofer 161 Nov 25, 2022
Generalized Random Forests

generalized random forests A pluggable package for forest-based statistical estimation and inference. GRF currently provides non-parametric methods fo

GRF Labs 781 Dec 25, 2022
Efficient 3D human pose estimation in video using 2D keypoint trajectories

3D human pose estimation in video with temporal convolutions and semi-supervised training This is the implementation of the approach described in the

Meta Research 3.1k Dec 29, 2022