Santiago Gonzalez
11/12/2021, 8:44 PMAnna Geller
Kevin Kho
with Flow(...) as flow:
x = Parameter("x")
name = create_secret_name(x)
s1 = PrefectSecet(name)
Santiago Gonzalez
11/12/2021, 8:49 PMclass IDMappingDBSecret(PrefectSecret):
environment: str
def __init__(self, name=None, env=None, **kwargs):
self.environment = env
super().__init__(name, **kwargs)
def run(self, name: str = None):
logger = prefect.context.get("logger")
name: str = name or self.secret_name
if self.environment == "dev":
name = f'dev_{name}'
<http://logger.info|logger.info>(f'Secret {name} is going to be retrieved')
super().run(name)
PrefectSecret
env
with Flow('flow_sample', schedule=None) as flow:
env = Parameter('env', required=True)
env_secret = IDMappingDBSecret(name='STAGE_ID_MAPPING_DB_URL', env=env)
print_result()
Kevin Kho
class IDMappingDBSecret(PrefectSecret):
environment: str
def __init__(self, name=None, env=None, **kwargs):
self.environment = env
new_name = self.environment + name
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(f'Secret {new_name} is going to be retrieved')
super().__init__(new_name, **kwargs)
Anna Geller
prefect.context["parameters"]
Santiago Gonzalez
11/12/2021, 8:55 PM"'GraphQLResult' object has no attribute 'name'"
with this code:
class IDMappingDBSecret(PrefectSecret):
environment: str
def __init__(self, name=None, **kwargs):
self.environment = prefect.config.get("environment")
super().__init__(name=name, **kwargs)
def run(self, name: str = None):
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(f"Environment is {self.environment}")
name: str = name or self.secret_name
if self.environment == "dev":
name = f'{self.environment.upper}_{name}'
<http://logger.info|logger.info>(f'Secret {name} is going to be retrieved')
super().run(name=name)
@task
def print_result():
logger = prefect.context.get("logger")
<http://logger.info|logger.info>('Result is 6')
with Flow('flow_sample', schedule=None) as flow:
env_secret = IDMappingDBSecret(name='STAGE_ID_MAPPING_DB_URL')
print_result()
prefect.config.get("environment")
instead of create a new parameter. Is environment associated to the label
provided in the UI (the one that specifies which agent is going to take it)?Kevin Kho
from prefect.tasks.secrets import PrefectSecret
import prefect
from prefect import Flow, task
class IDMappingDBSecret(PrefectSecret):
def __init__(self, name=None, environment="dev", **kwargs):
self.environment = environment
if self.environment == "stage":
_name = f'{self.environment.upper()}_{name}'
else:
_name = name
super().__init__(name=_name, **kwargs)
@task
def print_result(secret):
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(secret)
return
with Flow('flow_sample', schedule=None) as flow:
env_secret = IDMappingDBSecret('ID_MAPPING_DB_URL', environment="stage")
print_result(env_secret)
flow.run()
Anna Geller
from prefect.tasks.secrets import PrefectSecret
import prefect
from prefect import Flow, task
class EnvSecret(PrefectSecret):
def __init__(self, name=None, **kwargs):
self.environment = prefect.config.get("environment")
if self.environment in ["stage", "dev"]:
_name = f"{self.environment.upper()}_{name}"
else:
_name = name
super().__init__(name=_name, **kwargs)
env_secret = EnvSecret("DB_NAME")
@task
def print_result(secret):
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(secret)
with Flow("flow_sample") as flow:
secret = env_secret(task_args={"name": "DB_NAME"})
print_result(secret)
if __name__ == "__main__":
flow.run()
Running with value “prod”:
[2021-11-13 13:11:35+0100] INFO - prefect.TaskRunner | Task 'DB_NAME': Starting task run...
[2021-11-13 13:11:36+0100] INFO - prefect.TaskRunner | Task 'DB_NAME': Finished task run for task with final state: 'Success'
[2021-11-13 13:11:36+0100] INFO - prefect.TaskRunner | Task 'print_result': Starting task run...
[2021-11-13 13:11:36+0100] INFO - prefect.print_result | PROD_DB
Running with value “dev” in config.toml:
[2021-11-13 13:11:47+0100] INFO - prefect.TaskRunner | Task 'DEV_DB_NAME': Starting task run...
[2021-11-13 13:11:47+0100] INFO - prefect.TaskRunner | Task 'DEV_DB_NAME': Finished task run for task with final state: 'Success'
[2021-11-13 13:11:47+0100] INFO - prefect.TaskRunner | Task 'print_result': Starting task run...
[2021-11-13 13:11:47+0100] INFO - prefect.print_result | DEV_DB
Is that what you intended to do?Santiago Gonzalez
11/13/2021, 12:24 PMAnna Geller
Santiago Gonzalez
11/18/2021, 2:18 PMos.environ.get('environment')
When I execute that command inside of a task, it gets the value configured in the agent. However, when I try to get the value (with the same command) inside of the PrefectSecret
class, it has no value. What do you think could be a way to get the value in the prefect secret class? I leave you a piece of the flow code:
class IDMappingDBSecret(PrefectSecret):
environment: str
def __init__(self, name=None, **kwargs):
env = os.environ.get('environment')
if env in ["dev"]:
_name = f"{env.upper()}_{name}"
else:
_name = name
super().__init__(name=_name, **kwargs)
@task
def print_result(secret):
env = os.environ.get('environment')
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(f"Environment {env}")
<http://logger.info|logger.info>(f'Result is {secret}')
with Flow('flow_sample', schedule=None) as flow:
secret = IDMappingDBSecret('DB_URL')
print_result(secret)
Kevin Kho
Anna Geller
elf.environment = prefect.config.get("environment")
Santiago Gonzalez
11/18/2021, 3:09 PMAnna Geller
Santiago Gonzalez
11/18/2021, 4:55 PMscreen -dmS prefect-screen python3.7 -m prefect agent docker start --token {TOKEN} --label dev --env environment=dev
Anna Geller
Santiago Gonzalez
11/18/2021, 5:00 PMenvironment = "dev"
[cloud]
[cloud.agent]
name = "agent"
labels = ["dev"]
# Set to `DEBUG` for verbose logging
level = "INFO"
With this piece of code:
class IDMappingDBSecret(PrefectSecret):
environment: str
def __init__(self, name=None, **kwargs):
env = prefect.config.get("environment")
if env in ["dev"]:
_name = f"{env.upper()}_{name}"
else:
_name = name
super().__init__(name=_name, **kwargs)
@task
def print_result(secret):
logger = prefect.context.get("logger")
<http://logger.info|logger.info>(f'Result is {secret}')
with Flow('flow_sample', schedule=None) as flow:
secret = IDMappingDBSecret('DB_URL')
print_result(secret)
Kevin Kho
Santiago Gonzalez
11/18/2021, 8:07 PMprefect.config.get('environment')
Kevin Kho
Anna Geller
from prefect.tasks.secrets import PrefectSecret
import prefect
from prefect import Flow, task
class IDMappingDBSecret(PrefectSecret):
def __init__(self, name=None, **kwargs):
env = prefect.config.get("environment")
if env in ["dev"]:
_name = f"{env.upper()}_{name}"
else:
_name = name
super().__init__(name=_name, **kwargs)
env_secret = IDMappingDBSecret("DB_NAME")
@task
def print_result(secret):
logger = prefect.context.get("logger")
<http://logger.info|logger.info>('Result is %s', secret)
with Flow('flow_sample') as flow:
secret = env_secret(task_args={"name": "DB_NAME"})
print_result(secret)
if __name__ == "__main__":
flow.run()
environment = "dev"
is set in the config.toml, it should work with the DEV_DB secret. You would need to set it in the environment from which you start the agentSantiago Gonzalez
11/19/2021, 6:29 PMNone
value as a result when I do prefect.config.get('environment')
.os.environ['environment']
in the run method. thanks