worked on pillar implementation
This commit is contained in:
parent
e9421790e1
commit
2bf884da0a
@ -12,14 +12,14 @@ def get_pillar_name_sequence(name: str) -> list[str]:
|
|||||||
return name.split(':')
|
return name.split(':')
|
||||||
|
|
||||||
def decode_pillar_value(pillar: Pillar) -> str | int | float | bool | list | dict:
|
def decode_pillar_value(pillar: Pillar) -> str | int | float | bool | list | dict:
|
||||||
match pillar.type:
|
match pillar.parameter_type:
|
||||||
case 'string': return pillar.value
|
case 'string': return pillar.value
|
||||||
case 'integer': return int(pillar.value)
|
case 'integer': return int(pillar.value)
|
||||||
case 'float': return float(pillar.value)
|
case 'float': return float(pillar.value)
|
||||||
case 'boolean': return bool(pillar.value)
|
case 'boolean': return bool(pillar.value)
|
||||||
case 'array': return json.loads(pillar.value)
|
case 'array': return json.loads(pillar.value)
|
||||||
case 'dict': return json.loads(pillar.value)
|
case 'dict': return json.loads(pillar.value)
|
||||||
raise RuntimeError(f"Failed to decode pillar value: Invalid type '{pillar.type}'")
|
raise RuntimeError(f"Failed to decode pillar value: Invalid type '{pillar.parameter_type}'")
|
||||||
|
|
||||||
|
|
||||||
def get_pillar_for_target(db: Session, target: UUID) -> dict:
|
def get_pillar_for_target(db: Session, target: UUID) -> dict:
|
||||||
@ -38,5 +38,4 @@ def get_pillar_for_target(db: Session, target: UUID) -> dict:
|
|||||||
if label not in current:
|
if label not in current:
|
||||||
current[label] = {} if i < l-1 else value
|
current[label] = {} if i < l-1 else value
|
||||||
|
|
||||||
print(json.dumps(out, indent=4))
|
return out
|
||||||
pass
|
|
||||||
|
|||||||
@ -1,4 +1,9 @@
|
|||||||
import base64
|
import base64
|
||||||
|
from importlib.metadata import PackageNotFoundError
|
||||||
|
from os.path import dirname, realpath
|
||||||
|
from sysconfig import get_python_version
|
||||||
|
from importlib import metadata
|
||||||
|
import tomllib
|
||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
||||||
@ -21,8 +26,21 @@ def base_url():
|
|||||||
global _base_url
|
global _base_url
|
||||||
return _base_url
|
return _base_url
|
||||||
|
|
||||||
|
def print_version_and_exit(ctx, _1, execute):
|
||||||
|
if not execute: return False
|
||||||
|
version_string = "version_undetectable"
|
||||||
|
try:
|
||||||
|
version_string = metadata.version('pillar_tool')
|
||||||
|
except PackageNotFoundError:
|
||||||
|
with (open(f"{realpath(dirname(__file__)) + '/../../..'}/pyproject.toml", "r") as f):
|
||||||
|
data = tomllib.loads(f.read())
|
||||||
|
version_string = data['project']['version']
|
||||||
|
print(f"pillar tool v{version_string}")
|
||||||
|
ctx.exit()
|
||||||
|
|
||||||
@click.group("command")
|
@click.group("command")
|
||||||
def main():
|
@click.option("--version", '-v', is_flag=True, is_eager=True, callback=print_version_and_exit)
|
||||||
|
def main(**kwargs) -> None:
|
||||||
global cfg, _base_url, _auth_header
|
global cfg, _base_url, _auth_header
|
||||||
|
|
||||||
# load the configuration and store it
|
# load the configuration and store it
|
||||||
|
|||||||
@ -34,9 +34,9 @@ def pillar_get(fqdn):
|
|||||||
@click.option("--value")
|
@click.option("--value")
|
||||||
def pillar_set(name: str, host: str | None, hostgroup: str | None, parameter_type: str | None, value: str | None):
|
def pillar_set(name: str, host: str | None, hostgroup: str | None, parameter_type: str | None, value: str | None):
|
||||||
try:
|
try:
|
||||||
if parameter_type == 'str':
|
if parameter_type == 'string':
|
||||||
pass # there is nothing to do here
|
pass # there is nothing to do here
|
||||||
elif parameter_type == 'int':
|
elif parameter_type == 'integer':
|
||||||
_ = int(value)
|
_ = int(value)
|
||||||
elif parameter_type == 'float':
|
elif parameter_type == 'float':
|
||||||
_ = float(value)
|
_ = float(value)
|
||||||
|
|||||||
@ -178,6 +178,7 @@ async def host_delete(request: Request, fqdn: str):
|
|||||||
Removes the host entry and associated data from the database.
|
Removes the host entry and associated data from the database.
|
||||||
TODO: Implement actual deletion logic - currently just a stub.
|
TODO: Implement actual deletion logic - currently just a stub.
|
||||||
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
request: FastAPI request object containing database session
|
request: FastAPI request object containing database session
|
||||||
fqdn: Fully qualified domain name of the host to delete
|
fqdn: Fully qualified domain name of the host to delete
|
||||||
|
|||||||
@ -55,9 +55,9 @@ def pillar_get(req: Request, fqdn: str):
|
|||||||
path.append(tmp)
|
path.append(tmp)
|
||||||
|
|
||||||
path.reverse()
|
path.reverse()
|
||||||
out = merge(get_pillar_for_target(db, host.id) for host in path)
|
out = merge([get_pillar_for_target(db, host.id) for host in path])
|
||||||
|
|
||||||
return JSONResponse(status_code=200, content={})
|
return JSONResponse(status_code=200, content=out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -88,8 +88,19 @@ def pillar_create(req: Request, name: str, params: PillarParams):
|
|||||||
target: Host = result[0][0]
|
target: Host = result[0][0]
|
||||||
elif params.hostgroup is not None:
|
elif params.hostgroup is not None:
|
||||||
path = split_and_validate_path(params.hostgroup)
|
path = split_and_validate_path(params.hostgroup)
|
||||||
|
if not path:
|
||||||
|
return JSONResponse(status_code=400, content={'message': "No target specified"})
|
||||||
last = None
|
last = None
|
||||||
group_stmt = select(Host).where(Host.is_hostgroup == True and Host.parent_id == bindparam('parent') )
|
current = None
|
||||||
|
group_stmt = select(Host).where(Host.is_hostgroup == True and Host.parent_id == bindparam('parent') and Host.name == bindparam('name') )
|
||||||
|
for label in path:
|
||||||
|
result = db.execute(group_stmt, {'name': label, 'parent': last}).fetchall()
|
||||||
|
if len(result) == 0:
|
||||||
|
return JSONResponse(status_code=404, content={'message': f"No hostgroup named: {params.hostgroup}"})
|
||||||
|
# Note: this should be enforced by the database
|
||||||
|
assert len(result) == 1
|
||||||
|
current: Host = result[0][0]
|
||||||
|
last = current.id
|
||||||
else:
|
else:
|
||||||
return JSONResponse(status_code=400, content={'message': "Neither host nor hostgroup set"})
|
return JSONResponse(status_code=400, content={'message': "Neither host nor hostgroup set"})
|
||||||
|
|
||||||
@ -133,6 +144,6 @@ def pillar_create(req: Request, name: str, params: PillarParams):
|
|||||||
|
|
||||||
|
|
||||||
@router.delete("/{name}")
|
@router.delete("/{name}")
|
||||||
def pillar_delete(req: Request, name: str):
|
def pillar_delete(req: Request, name: str, params: PillarParams):
|
||||||
# TODO: implement
|
# TODO: implement
|
||||||
db = req.state.db
|
db = req.state.db
|
||||||
|
|||||||
@ -24,7 +24,7 @@ def apply_layer(base: dict, layer: dict):
|
|||||||
base[key] = value
|
base[key] = value
|
||||||
|
|
||||||
|
|
||||||
def merge(*pillar_data, deep_copy=True) -> dict:
|
def merge(pillar_data, deep_copy=True) -> dict:
|
||||||
"""
|
"""
|
||||||
Merges multiple pillar data dictionaries into one.
|
Merges multiple pillar data dictionaries into one.
|
||||||
|
|
||||||
@ -48,5 +48,4 @@ def merge(*pillar_data, deep_copy=True) -> dict:
|
|||||||
for pillar in pillar_data[1:]:
|
for pillar in pillar_data[1:]:
|
||||||
apply_layer(merged_pillar, pillar)
|
apply_layer(merged_pillar, pillar)
|
||||||
|
|
||||||
|
|
||||||
return merged_pillar
|
return merged_pillar
|
||||||
Loading…
x
Reference in New Issue
Block a user