Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/5022-lastpass-lookup-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
trivial:
- lastpass - use config manager API in tests; improve documentation.
23 changes: 14 additions & 9 deletions plugins/lookup/lastpass.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,24 @@
- Andrew Zenk (!UNKNOWN) <azenk@umn.edu>
requirements:
- lpass (command line utility)
- must have already logged into lastpass
short_description: fetch data from lastpass
- must have already logged into LastPass
short_description: fetch data from LastPass
description:
- use the lpass command line utility to fetch specific fields from lastpass
- Use the lpass command line utility to fetch specific fields from LastPass.
options:
_terms:
description: key from which you want to retrieve the field
required: True
description: Key from which you want to retrieve the field.
required: true
type: list
elements: str
field:
description: field to return from lastpass
description: Field to return from LastPass.
default: 'password'
type: str
'''

EXAMPLES = """
- name: get 'custom_field' from lastpass entry 'entry-name'
- name: get 'custom_field' from LastPass entry 'entry-name'
ansible.builtin.debug:
msg: "{{ lookup('community.general.lastpass', 'entry-name', field='custom_field') }}"
"""
Expand Down Expand Up @@ -88,12 +91,14 @@ def get_field(self, key, field):
class LookupModule(LookupBase):

def run(self, terms, variables=None, **kwargs):
self.set_options(var_options=variables, direct=kwargs)
field = self.get_option('field')

lp = LPass()

if not lp.logged_in:
raise AnsibleError("Not logged into lastpass: please run 'lpass login' first")
raise AnsibleError("Not logged into LastPass: please run 'lpass login' first")

field = kwargs.get('field', 'password')
values = []
for term in terms:
values.append(lp.get_field(term, field))
Expand Down
19 changes: 10 additions & 9 deletions tests/unit/plugins/lookup/test_lastpass.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

from ansible.errors import AnsibleError
from ansible.module_utils import six
from ansible.plugins.loader import lookup_loader
from ansible_collections.community.general.plugins.lookup.lastpass import LookupModule, LPass, LPassException


Expand Down Expand Up @@ -126,6 +127,9 @@ class LoggedOutMockLPass(MockLPass):

class TestLPass(unittest.TestCase):

def setUp(self):
self.lookup = lookup_loader.get('community.general.lastpass')

def test_lastpass_cli_path(self):
lp = MockLPass(path='/dev/null')
self.assertEqual('/dev/null', lp.cli_path)
Expand Down Expand Up @@ -158,30 +162,27 @@ def test_lastpass_show(self):

class TestLastpassPlugin(unittest.TestCase):

def setUp(self):
self.lookup = lookup_loader.get('community.general.lastpass')

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', new=MockLPass)
def test_lastpass_plugin_normal(self):
lookup_plugin = LookupModule()

for entry in MOCK_ENTRIES:
entry_id = entry.get('id')
for k, v in six.iteritems(entry):
self.assertEqual(v.strip(),
lookup_plugin.run([entry_id], field=k)[0])
self.lookup.run([entry_id], field=k)[0])

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', LoggedOutMockLPass)
def test_lastpass_plugin_logged_out(self):
lookup_plugin = LookupModule()

entry = MOCK_ENTRIES[0]
entry_id = entry.get('id')
with self.assertRaises(AnsibleError):
lookup_plugin.run([entry_id], field='password')
self.lookup.run([entry_id], field='password')

@patch('ansible_collections.community.general.plugins.lookup.lastpass.LPass', DisconnectedMockLPass)
def test_lastpass_plugin_disconnected(self):
lookup_plugin = LookupModule()

entry = MOCK_ENTRIES[0]
entry_id = entry.get('id')
with self.assertRaises(AnsibleError):
lookup_plugin.run([entry_id], field='password')
self.lookup.run([entry_id], field='password')