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
Dynamica causal Bayesian optimisation

Dynamic Causal Bayesian Optimization This is a Python implementation of Dynamic Causal Bayesian Optimization as presented at NeurIPS 2021. Abstract Th

nd308 18 Nov 22, 2022
Python implementation of the multistate Bennett acceptance ratio (MBAR)

pymbar Python implementation of the multistate Bennett acceptance ratio (MBAR) method for estimating expectations and free energy differences from equ

Chodera lab // Memorial Sloan Kettering Cancer Center 169 Dec 02, 2022
A denoising autoencoder + adversarial losses and attention mechanisms for face swapping.

faceswap-GAN Adding Adversarial loss and perceptual loss (VGGface) to deepfakes'(reddit user) auto-encoder architecture. Updates Date Update 2018-08-2

3.2k Dec 30, 2022
Fuse radar and camera for detection

SAF-FCOS: Spatial Attention Fusion for Obstacle Detection using MmWave Radar and Vision Sensor This project hosts the code for implementing the SAF-FC

ChangShuo 18 Jan 01, 2023
RoMa: A lightweight library to deal with 3D rotations in PyTorch.

RoMa: A lightweight library to deal with 3D rotations in PyTorch. RoMa (which stands for Rotation Manipulation) provides differentiable mappings betwe

NAVER 90 Dec 27, 2022
Official PyTorch implementation of the paper: DeepSIM: Image Shape Manipulation from a Single Augmented Training Sample

DeepSIM: Image Shape Manipulation from a Single Augmented Training Sample (ICCV 2021 Oral) Project | Paper Official PyTorch implementation of the pape

Eliahu Horwitz 393 Dec 22, 2022
A PyTorch Implementation of FaceBoxes

FaceBoxes in PyTorch By Zisian Wong, Shifeng Zhang A PyTorch implementation of FaceBoxes: A CPU Real-time Face Detector with High Accuracy. The offici

Zi Sian Wong 797 Dec 17, 2022
Code for our ACL 2021 paper - ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer

ConSERT Code for our ACL 2021 paper - ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer Requirements torch==1.6.0

Yan Yuanmeng 478 Dec 25, 2022
Code of the paper "Shaping Visual Representations with Attributes for Few-Shot Learning (ASL)".

Shaping Visual Representations with Attributes for Few-Shot Learning This code implements the Shaping Visual Representations with Attributes for Few-S

chx_nju 9 Sep 01, 2022
RealFormer-Pytorch Implementation of RealFormer using pytorch

RealFormer-Pytorch Implementation of RealFormer using pytorch. Includes comparison with classical Transformer on image classification task (ViT) wrt C

Simo Ryu 90 Dec 08, 2022
Validated, scalable, community developed variant calling, RNA-seq and small RNA analysis

Validated, scalable, community developed variant calling, RNA-seq and small RNA analysis. You write a high level configuration file specifying your in

Blue Collar Bioinformatics 917 Jan 03, 2023
Implementation of Transformer in Transformer, pixel level attention paired with patch level attention for image classification, in Pytorch

Transformer in Transformer Implementation of Transformer in Transformer, pixel level attention paired with patch level attention for image c

Phil Wang 272 Dec 23, 2022
SCAAML is a deep learning framwork dedicated to side-channel attacks run on top of TensorFlow 2.x.

SCAAML (Side Channel Attacks Assisted with Machine Learning) is a deep learning framwork dedicated to side-channel attacks. It is written in python and run on top of TensorFlow 2.x.

Google 69 Dec 21, 2022
Affine / perspective transformation in Pose Estimation with Tensorflow 2

Pose Transformation Affine / Perspective transformation in Pose Estimation with Tensorflow 2 Introduction 이 repo는 pose estimation을 연구하고 개발하는 데 도움이 되기

Kim Junho 1 Dec 22, 2021
Genetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)

scikit-opt Swarm Intelligence in Python (Genetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Algorithm, Immune Algorithm,A

郭飞 3.7k Jan 03, 2023
Classifying cat and dog images using Kaggle dataset

PyTorch Image Classification Classifies an image as containing either a dog or a cat (using Kaggle's public dataset), but could easily be extended to

Robert Coleman 74 Nov 22, 2022
A demo of how to use JAX to create a simple gravity simulation

JAX Gravity This repo contains a demo of how to use JAX to create a simple gravity simulation. It uses JAX's experimental ode package to solve the dif

Cristian Garcia 16 Sep 22, 2022
TensorFlow GNN is a library to build Graph Neural Networks on the TensorFlow platform.

TensorFlow GNN This is an early (alpha) release to get community feedback. It's under active development and we may break API compatibility in the fut

889 Dec 30, 2022
A Keras implementation of CapsNet in the paper: Sara Sabour, Nicholas Frosst, Geoffrey E Hinton. Dynamic Routing Between Capsules

NOTE This implementation is fork of https://github.com/XifengGuo/CapsNet-Keras , applied to IMDB texts reviews dataset. CapsNet-Keras A Keras implemen

Lauro Moraes 5 Oct 23, 2022
AdaFocus (ICCV 2021) Adaptive Focus for Efficient Video Recognition

AdaFocus (ICCV 2021) This repo contains the official code and pre-trained models for AdaFocus. Adaptive Focus for Efficient Video Recognition Referenc

Rainforest Wang 115 Dec 21, 2022