Source code for freckles.frecklet.vars
# -*- coding: utf-8 -*-
import abc
import logging
import six
from frutils import dict_merge
from ting.ting_attributes import TingAttribute
from ting.ting_cast import TingCast
log = logging.getLogger("freckles")
[docs]class VarPathAttribute(TingAttribute):
def __init__(self, prefix):
self.prefix = prefix
[docs] def provides(self):
return ["var_path"]
[docs] def requires(self):
return ["var", "prefix"]
[docs] def get_attribute(self, ting, attribute_name=None):
return "{}/{}".format(self.prefix, ting.var)
[docs]class VarCast(TingCast):
VAR_ATTRS = []
def __init__(self, prefix):
var_path_attr = VarPathAttribute(prefix)
super(VarCast, self).__init__(
"VarTing",
ting_attributes=[var_path_attr],
ting_id_attr="var_path",
mixins=[],
)
[docs]@six.add_metaclass(abc.ABCMeta)
class Inventory(object):
def __init__(self):
pass
[docs] @abc.abstractmethod
def retrieve_value(self, var_name, **task_context):
pass
[docs] def retrive_arg_schema(self, var_name, **task_context):
if not self.args:
return None
return self.args.get(var_name, None)
[docs] def get_secret_args(self):
if self.args is None:
return None
result = []
for arg_name, arg in self.args.items():
if arg.secret:
result.append(arg)
return result
[docs] @abc.abstractmethod
def get_all(self, hide_secret=False):
pass
[docs]class VarsInventory(Inventory):
def __init__(self, *vars):
super(VarsInventory, self).__init__()
self.vars_list = vars
self._secrets = []
self._vars = {}
for v in self.vars_list:
dict_merge(self.vars, v, copy_dct=False)
[docs] def retrieve_value(self, var_name, **task_context):
return self._vars.get(var_name, None)
[docs] def set_value(self, var_name, new_value, is_secret=False):
self._vars[var_name] = new_value
if is_secret:
self._secrets.append(var_name)
@property
def vars(self):
return self._vars
[docs] def get_all(self, hide_secret=False):
result = {}
for k, v in self.vars.items():
if hide_secret and k in self._secrets:
result[k] = "__secret__"
else:
result[k] = v
return result
# class TingsInventory(TingTings):
#
# # DEFAULT_TING_CAST = VarCast
#
# def __init__(self, repo_name, tingsets, load_config=None, **kwargs):
#
# super(Inventory, self).__init__(
# repo_name=repo_name,
# tingsets=tingsets,
# load_config=load_config,
# indexes=["var_path"],
# )
#
# def retrieve_value(self, var_name, **task_context):
#
# var = self.vars.get(var_name, None)
# if var is None:
# return None
#
# return var.get_value(**task_context)