Skip to content

Commit 76e5603

Browse files
authored
Upgrade Vault hvac and update Vault modules (#38)
1 parent 8708bc5 commit 76e5603

File tree

3 files changed

+53
-25
lines changed

3 files changed

+53
-25
lines changed

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ msrestazure==0.6.0
1212
Jinja2==2.10.1
1313
hashmerge
1414
python-consul
15-
hvac==0.8.2
15+
hvac==0.9.3
1616
passgen
1717
inflection==0.3.1
1818
kubernetes==9.0.0

src/ops/ansible/filter_plugins/commonfilters.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,27 @@ def flatten_tree(d, parent_key='', sep='/'):
6464
items.append((new_key, v))
6565
return dict(items)
6666

67-
def read_vault(secret_path, key='value', fetch_all=False, vault_user=None,vault_url=None, token=None, auto_prompt=True):
67+
def read_vault(
68+
secret_path, key='value', fetch_all=False, vault_user=None, vault_url=None,
69+
token=None, namespace=None, mount_point=None, auto_prompt=True):
70+
6871
from ops.simplevault import SimpleVault
69-
sv = SimpleVault(vault_user=vault_user, vault_addr=vault_url, vault_token=token,auto_prompt=auto_prompt)
72+
sv = SimpleVault(
73+
vault_user=vault_user, vault_addr=vault_url, vault_token=token,
74+
namespace=namespace, mount_point=mount_point, auto_prompt=auto_prompt)
7075
return sv.get(path=secret_path, key=key, fetch_all=fetch_all)
7176

72-
def write_vault(secret_path, key='value', data="", vault_user=None, vault_url=None, token=None, auto_prompt=True):
77+
def write_vault(
78+
secret_path, key='value', data="", vault_user=None, vault_url=None,
79+
namespace=None, mount_point=None, token=None, auto_prompt=True):
80+
7381
from ops.simplevault import SimpleVault
74-
sv = SimpleVault(vault_user=vault_user, vault_addr=vault_url, vault_token=token, auto_prompt=auto_prompt)
82+
sv = SimpleVault(
83+
vault_user=vault_user, vault_addr=vault_url, vault_token=token,
84+
namespace=None, mount_point=None, auto_prompt=auto_prompt)
7585
new_data = {}
7686
if isinstance(data, dict):
77-
for k,v in new_data.iteritems():
87+
for k,v in data.iteritems():
7888
new_data[k] = str(v)
7989
elif key:
8090
new_data[key] = str(data)
@@ -92,6 +102,8 @@ def managed_vault_secret(secret_path,key='value',
92102
vault_user=None,
93103
vault_addr=None,
94104
vault_token=None,
105+
namespace=None,
106+
mount_point=None,
95107
auto_prompt=True):
96108
from ops.simplevault import ManagedVaultSecret
97109
ms = ManagedVaultSecret(path=secret_path,
@@ -100,6 +112,8 @@ def managed_vault_secret(secret_path,key='value',
100112
vault_user=vault_user,
101113
vault_addr=vault_addr,
102114
vault_token=vault_token,
115+
namespace=namespace,
116+
mount_point=mount_point,
103117
auto_prompt=auto_prompt)
104118
return ms.get()
105119

@@ -112,6 +126,7 @@ def escape_json(input):
112126
return escaped
113127

114128
class FilterModule(object):
129+
115130
def filters(self):
116131
return {
117132
'escape_new_lines': escape_new_lines,

src/ops/simplevault.py

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
MAX_LDAP_ATTEMPTS = 3
2727
class SimpleVault(object):
2828
p_vault_conn = None
29-
# persistent vault connection
30-
def __init__(self, vault_user=None, vault_addr=None, vault_token=None, persistent_session=True, auto_prompt=True):
29+
# persistent vault connection
30+
def __init__(
31+
self, vault_user=None, vault_addr=None, vault_token=None, namespace=None,
32+
mount_point=None, persistent_session=True, auto_prompt=True):
3133
def try_reading_token_file():
3234
ret = None
3335
try:
@@ -49,13 +51,15 @@ def write_token(token=None):
4951
#with vault running on the provisioner's machine ?
5052
self.vault_token = vault_token or os.getenv('VAULT_TOKEN',None) or try_reading_token_file()
5153
self.vault_user = vault_user or os.getenv('VAULT_USER', None) or getpass.getuser()
54+
self.mount_point = mount_point
55+
self.namespace = namespace
5256
self.ldap_attempts = 0
5357

5458
if persistent_session:
5559
if SimpleVault.p_vault_conn:
5660
self.vault_conn = SimpleVault.p_vault_conn
5761
else:
58-
self.vault_conn = hvac.Client(url=self.vault_addr, token=self.vault_token)
62+
self.vault_conn = hvac.Client(url=self.vault_addr, namespace=self.namespace, token=self.vault_token)
5963

6064
while not self.vault_conn.is_authenticated() and auto_prompt:
6165
display("VAULT-LIB: Not authenticated to vault '%s'" % self.vault_addr, stderr=True, color='red')
@@ -65,7 +69,7 @@ def write_token(token=None):
6569
try:
6670
self.ldap_attempts +=1
6771
ldap_password = getpass.getpass(prompt='LDAP password for %s for server %s: ' % (self.vault_user, self.vault_addr))
68-
auth_response = self.vault_conn.auth_ldap(self.vault_user, ldap_password)
72+
auth_response = self.vault_conn.auth.ldap.login(username=self.vault_user, password=ldap_password)
6973
self.vault_conn.is_authenticated()
7074
self.vault_token = auth_response['auth']['client_token']
7175
write_token(self.vault_token)
@@ -81,25 +85,27 @@ def get(self, path, key='value', wrap_ttl=None, default=None, fetch_all=False, r
8185
if fetch_all:
8286
key=None
8387
try:
84-
raw_data = self.vault_conn.read(path, wrap_ttl=wrap_ttl) or {}
85-
data = raw_data.get('data') or {}
88+
raw_data = self.vault_conn.secrets.kv.v2.read_secret_version(
89+
path=path, mount_point=self.mount_point)
90+
# move this check earlier, and, if true, return immediately
91+
if raw:
92+
return raw_data
93+
data = raw_data.get('data')
8694
if isinstance(data, dict):
8795
if not fetch_all:
8896
if key:
89-
return data.get(key, default)
97+
# the actual secret k v pairs are nested under another dictionary key "data"
98+
return data.get("data").get(key, default)
9099
else:
91100
raise('VAULT-LIB: either key or fetch_all should be set!')
92-
93101
except Exception as e:
94102
if raise_exceptions:
95103
raise e
96104
else:
97105
data = default
98-
if raw:
99-
return raw_data
100-
else:
101-
return data
102-
def put(self,path,value,lease=None,wrap_ttl=None):
106+
return data
107+
108+
def put(self, path, value, lease=None, wrap_ttl=None):
103109
payload = {}
104110
if isinstance(value, (basestring, int, float, bool)):
105111
payload['value'] = str(value)
@@ -108,15 +114,20 @@ def put(self,path,value,lease=None,wrap_ttl=None):
108114
payload[k] = str(v)
109115
else:
110116
raise Exception('Unsupported data type for secret payload')
111-
self.vault_conn.write(path, wrap_ttl,**payload)
117+
self.vault_conn.secrets.kv.v2.create_or_update_secret(
118+
path=path, secret=payload, mount_point=self.mount_point)
119+
112120
def is_authenticated(self):
113121
return self.vault_conn.is_authenticated()
114122

115123

116124
class ManagedVaultSecret(object):
117125
p_sv = None
118-
# Persistent SimpleVault accessory object
119-
def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=None, vault_token=None, auto_prompt=True):
126+
# Persistent SimpleVault accessory object
127+
def __init__(
128+
self, path, key='value', policy={}, vault_user=None, vault_addr=None,
129+
vault_token=None, namespace=None, mount_point=None, auto_prompt=True):
130+
120131
self.__DEFAULT_POLICY__ = {
121132
'engine': 'passgen',
122133
'length': 24
@@ -125,6 +136,8 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
125136
self.already_initialized = False
126137
self.actual_policy = self.__DEFAULT_POLICY__.copy()
127138
self.key = key
139+
self.mount_point = mount_point
140+
self.namespace = namespace
128141
if isinstance(policy,int):
129142
self.actual_policy.update({'length': policy})
130143
elif isinstance(policy,dict):
@@ -140,7 +153,9 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
140153
self.sv = ManagedVaultSecret.p_sv
141154
else:
142155
try:
143-
self.sv = SimpleVault(vault_user=None, vault_addr=None, vault_token=None, auto_prompt=True)
156+
self.sv = SimpleVault(
157+
vault_user=None, vault_addr=None, vault_token=None, auto_prompt=True,
158+
namespace=self.namespace, mount_point=self.mount_point)
144159
ManagedVaultSecret.p_sv = self.sv
145160
except Exception as e:
146161
display('MANAGED-SECRET: could not obtain a proper Vault connection.\n{}'.format(e.message))
@@ -166,8 +181,6 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
166181
raise e
167182
try:
168183
#generating and storing the new secret
169-
170-
171184
self.new_data = self.current_data.copy()
172185
self.new_data[key] = passgen.passgen(**generator_args)
173186
self.sv.put(path, self.new_data)

0 commit comments

Comments
 (0)