Files
mongo/tools/flag_sync/flag.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

100 lines
2.9 KiB
Python
Raw Normal View History

import io
import json
from typing import Optional
import boto3
import typer
from tools.flag_sync import util
app = typer.Typer()
@app.command()
def create(
namespace: str,
name: str,
value: str,
enabled: Optional[bool] = True,
validate: Optional[bool] = True,
):
if validate:
if not util.validate_bazel_flag(value):
print("Failed to create flag. Flag failed bazel verification.")
return
s3 = boto3.client("s3")
flags = util.get_flags(namespace)
flags[name] = {"value": value, "enabled": enabled}
print(f"Created flag in namespace {namespace}:")
print_flag(name, value, enabled)
flags_json = json.dumps(flags)
f = io.BytesIO(flags_json.encode("utf-8"))
s3.upload_fileobj(f, util.S3_BUCKET, f"flag_sync/{namespace}.json")
@app.command()
def get(namespace: str, name: Optional[str] = None):
flags = util.get_flags(namespace)
for cur_name, flag in flags.items():
if name and cur_name != name:
continue
print_flag(cur_name, flag["value"], flag["enabled"])
@app.command()
def update(
namespace: str,
name: str,
value: Optional[str] = None,
enabled: Optional[bool] = None,
validate: Optional[bool] = True,
):
if validate and value:
if not util.validate_bazel_flag(value):
print("Failed to update flag. Flag failed bazel verification.")
return
s3 = boto3.client("s3")
flags = util.get_flags(namespace)
if name not in flags:
print(f"Flag with name {name} does not exist.")
return
if value:
flags[name]["value"] = value
print(f"Updated {name} to {value} in namespace {namespace}")
if enabled is not None:
flags[name]["enabled"] = enabled
print(f"Updated enabled status of {name} to {enabled} in namespace {namespace}")
print(f"Updated flag in namespace {namespace}:")
print_flag(name, flags[name]["value"], flags[name]["enabled"])
flags_json = json.dumps(flags)
f = io.BytesIO(flags_json.encode("utf-8"))
s3.upload_fileobj(f, util.S3_BUCKET, f"flag_sync/{namespace}.json")
@app.command()
def toggle_on(namespace: str, name: str):
update(namespace=namespace, name=name, enabled=True)
@app.command()
def toggle_off(namespace: str, name: str):
update(namespace=namespace, name=name, enabled=False)
@app.command()
def delete(namespace: str, name: str):
s3 = boto3.client("s3")
flags = util.get_flags(namespace)
if name not in flags:
print(f"Flag with name {name} does not exist.")
return
del flags[name]
print(f"Deleted flag {name} in namespace {namespace}")
flags_json = json.dumps(flags)
f = io.BytesIO(flags_json.encode("utf-8"))
s3.upload_fileobj(f, util.S3_BUCKET, f"flag_sync/{namespace}.json")
def print_flag(name: str, value: str, enabled: bool):
print(f"{name}[{'+' if enabled else '-'}]: {value}")