def test_ceph_conf(fs: fake_filesystem.FakeFilesystem): # default location fs.add_real_file( # pyright: reportUnknownMemberType=false os.path.join(TEST_DIR, 'data/default_ceph.conf'), target_path='/etc/ceph/ceph.conf' ) Mgr() Mon() # custom location conf_file = '/foo/bar/baz.conf' fs.add_real_file( os.path.join(TEST_DIR, 'data/default_ceph.conf'), target_path=conf_file ) Mgr(conf_file=conf_file) Mon(conf_file=conf_file) # invalid location conf_file = "missing.conf" with pytest.raises(FileNotFoundError, match=conf_file): Mgr(conf_file=conf_file) Mon(conf_file=conf_file)
async def aquarium_startup(_: FastAPI, aquarium_api: FastAPI): lvl = "INFO" if not os.getenv("AQUARIUM_DEBUG") else "DEBUG" setup_logging(lvl) logger.info("Aquarium startup!") gstate: GlobalState = GlobalState() # init node mgr logger.info("starting node manager") nodemgr: NodeMgr = NodeMgr(gstate) # Prep cephadm cephadm: Cephadm = Cephadm(gstate.config.options.containers) gstate.add_cephadm(cephadm) # Set up Ceph connections ceph: Ceph = Ceph() ceph_mgr: Mgr = Mgr(ceph) gstate.add_ceph_mgr(ceph_mgr) ceph_mon: Mon = Mon(ceph) gstate.add_ceph_mon(ceph_mon) # Set up all of the tickers devices: Devices = Devices( gstate.config.options.devices.probe_interval, nodemgr, ceph_mgr, ceph_mon, ) gstate.add_devices(devices) status: Status = Status(gstate.config.options.status.probe_interval, gstate, nodemgr) gstate.add_status(status) inventory: Inventory = Inventory( gstate.config.options.inventory.probe_interval, nodemgr, gstate) gstate.add_inventory(inventory) storage: Storage = Storage(gstate.config.options.storage.probe_interval, nodemgr, ceph_mon) gstate.add_storage(storage) await nodemgr.start() await gstate.start() # Add instances into FastAPI's state: aquarium_api.state.gstate = gstate aquarium_api.state.nodemgr = nodemgr
def __init__(self): self.cluster = Mgr()
def __init__(self): self.mgr = Mgr() self.mon = Mon() pass
async def startup(aquarium_app: FastAPI, aquarium_api: FastAPI): from fastapi.logger import logger as fastapi_logger from gravel.cephadm.cephadm import Cephadm from gravel.controllers.inventory.inventory import Inventory from gravel.controllers.nodes.deployment import NodeDeployment from gravel.controllers.nodes.errors import NodeCantDeployError from gravel.controllers.nodes.mgr import ( NodeError, NodeInitStage, NodeMgr, ) from gravel.controllers.orch.ceph import Ceph, Mgr, Mon from gravel.controllers.resources.devices import Devices from gravel.controllers.resources.status import Status from gravel.controllers.resources.storage import Storage logger: logging.Logger = fastapi_logger class FakeNodeDeployment(NodeDeployment): # Do we still need this thing since removing etcd? pass class FakeNodeMgr(NodeMgr): def __init__(self, gstate: GlobalState): super().__init__(gstate) self._deployment = FakeNodeDeployment(gstate, self._connmgr) async def start(self) -> None: assert self._state logger.debug(f"start > {self._state}") if not self.deployment_state.can_start(): raise NodeError("unable to start unstartable node") assert self._init_stage == NodeInitStage.NONE if self.deployment_state.nostage: await self._node_prepare() else: assert (self.deployment_state.ready or self.deployment_state.deployed) assert self._state.hostname assert self._state.address await self.gstate.store.ensure_connection() async def _obtain_images(self) -> bool: return True class FakeCephadm(Cephadm): def __init__(self): super().__init__(ContainersOptionsModel()) async def call( self, cmd: List[str], noimage: bool = False, outcb: Optional[Callable[[str], None]] = None, ) -> Tuple[str, str, int]: # Implement expected calls to cephadm with testable responses if cmd[0] == "pull": return "", "", 0 elif cmd[0] == "gather-facts": return ( get_data_contents(DATA_DIR, "gather_facts_real.json"), "", 0, ) elif cmd == ["ceph-volume", "inventory", "--format", "json"]: return ( get_data_contents(DATA_DIR, "inventory_real.json"), "", 0, ) else: print(cmd) print(outcb) raise Exception("Tests should not get here") class FakeCeph(Ceph): def __init__(self, conf_file: str = "/etc/ceph/ceph.conf"): self.conf_file = conf_file self._is_connected = False def connect(self): if not self.is_connected(): self.cluster = mocker.Mock() self._is_connected = True class FakeStorage(Storage): # type: ignore available = 2000 # type: ignore total = 2000 # type: ignore gstate: GlobalState = GlobalState(FakeKV) # init node mgr nodemgr: NodeMgr = FakeNodeMgr(gstate) # Prep cephadm cephadm: Cephadm = FakeCephadm() gstate.add_cephadm(cephadm) # Set up Ceph connections ceph: Ceph = FakeCeph() ceph_mgr: Mgr = Mgr(ceph) gstate.add_ceph_mgr(ceph_mgr) ceph_mon: Mon = Mon(ceph) gstate.add_ceph_mon(ceph_mon) # Set up all of the tickers devices: Devices = Devices( gstate.config.options.devices.probe_interval, nodemgr, ceph_mgr, ceph_mon, ) gstate.add_devices(devices) status: Status = Status(gstate.config.options.status.probe_interval, gstate, nodemgr) gstate.add_status(status) inventory: Inventory = Inventory( gstate.config.options.inventory.probe_interval, nodemgr, gstate) gstate.add_inventory(inventory) storage: Storage = FakeStorage( gstate.config.options.storage.probe_interval, nodemgr, ceph_mon) gstate.add_storage(storage) await nodemgr.start() await gstate.start() # Add instances into FastAPI's state: aquarium_api.state.gstate = gstate aquarium_api.state.nodemgr = nodemgr
def __init__(self): self.mgr = Mgr()
# project aquarium's backend # Copyright (C) 2021 SUSE, LLC. from gravel.controllers.orch.ceph import Ceph, Mgr, Mon from gravel.controllers.orch.cephfs import CephFS, CephFSError if __name__ == "__main__": ceph: Ceph = Ceph() ceph_mgr: Mgr = Mgr(ceph) ceph_mon: Mon = Mon(ceph) cephfs: CephFS = CephFS(ceph_mgr, ceph_mon) try: cephfs.create("foobarbaz") except CephFSError as e: print(f"error: {str(e)}") res = cephfs.volume_ls() print(res.json()) print(cephfs.ls())
def test_ceph_conf(self): with pytest.raises(FileNotFoundError, match="ceph.conf"): Mgr() Mon()