Skip to content

Commit 8d49cfd

Browse files
Merge pull request #1277 from ATGE/issue1273
Tags details
2 parents 29c1657 + 988185a commit 8d49cfd

File tree

8 files changed

+102
-5
lines changed

8 files changed

+102
-5
lines changed

SoftLayer/CLI/routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@
293293
('tags', 'SoftLayer.CLI.tags'),
294294
('tags:list', 'SoftLayer.CLI.tags.list:cli'),
295295
('tags:set', 'SoftLayer.CLI.tags.set:cli'),
296+
('tags:details', 'SoftLayer.CLI.tags.details:cli'),
296297

297298
('ticket', 'SoftLayer.CLI.ticket'),
298299
('ticket:create', 'SoftLayer.CLI.ticket.create:cli'),

SoftLayer/CLI/tags/details.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Details of a Tag."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI import environment
7+
from SoftLayer.CLI.tags.list import detailed_table
8+
from SoftLayer.managers.tags import TagManager
9+
10+
11+
@click.command()
12+
@click.argument('identifier')
13+
@environment.pass_env
14+
def cli(env, identifier):
15+
"""Get details for a Tag."""
16+
17+
tag_manager = TagManager(env.client)
18+
19+
if str.isdigit(identifier):
20+
tags = [tag_manager.get_tag(identifier)]
21+
else:
22+
tags = tag_manager.get_tag_by_name(identifier)
23+
table = detailed_table(tag_manager, tags)
24+
env.fout(table)

SoftLayer/CLI/tags/list.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def cli(env, detail):
2222
tag_manager = TagManager(env.client)
2323

2424
if detail:
25-
tables = detailed_table(tag_manager)
25+
tables = detailed_table(tag_manager, tag_manager.get_attached_tags())
2626
for table in tables:
2727
env.fout(table)
2828
else:
@@ -36,9 +36,8 @@ def tag_row(tag):
3636
return [tag.get('id'), tag.get('name'), tag.get('referenceCount', 0)]
3737

3838

39-
def detailed_table(tag_manager):
39+
def detailed_table(tag_manager, tags):
4040
"""Creates a table for each tag, with details about resources using it"""
41-
tags = tag_manager.get_attached_tags()
4241
tables = []
4342
for tag in tags:
4443
references = tag_manager.get_tag_references(tag.get('id'))
@@ -76,3 +75,4 @@ def get_resource_name(tag_manager, resource_id, tag_type):
7675
except SoftLayerAPIError as exception:
7776
resource_row = "{}".format(exception.reason)
7877
return resource_row
78+

SoftLayer/fixtures/SoftLayer_Tag.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@
1616
]
1717

1818
setTags = True
19+
20+
getObject = getAttachedTagsForCurrentUser[0]
21+
22+
getTagByTagName = getAttachedTagsForCurrentUser

SoftLayer/managers/tags.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,28 @@ def get_tag_references(self, tag_id, mask=None):
5353
mask = "mask[tagType]"
5454
return self.client.call('SoftLayer_Tag', 'getReferences', id=tag_id, mask=mask, iter=True)
5555

56+
def get_tag(self, tag_id, mask=None):
57+
"""Calls SoftLayer_Tag::getObject(id=tag_id)
58+
59+
:params int tag_id: Tag id to get object from
60+
:params string mask: Mask to use.
61+
"""
62+
if mask is None:
63+
mask = "mask[id,name]"
64+
result = self.client.call('SoftLayer_Tag', 'getObject', id=tag_id, mask=mask)
65+
return result
66+
67+
def get_tag_by_name(self, tag_name, mask=None):
68+
"""Calls SoftLayer_Tag::getTagByTagName(tag_name)
69+
70+
:params string tag_name: Tag name to get object from
71+
:params string mask: Mask to use.
72+
"""
73+
if mask is None:
74+
mask = "mask[id,name]"
75+
result = self.client.call('SoftLayer_Tag', 'getTagByTagName', tag_name, mask=mask)
76+
return result
77+
5678
def reference_lookup(self, resource_table_id, tag_type):
5779
"""Returns the SoftLayer Service for the corresponding type
5880

docs/cli/tags.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,11 @@ Tag Commands
77
.. click:: SoftLayer.CLI.tags.list:cli
88
:prog: tags list
99
:show-nested:
10+
11+
.. click:: SoftLayer.CLI.tags.set:cli
12+
:prog: tags set
13+
:show-nested:
14+
15+
.. click:: SoftLayer.CLI.tags.details:cli
16+
:prog: tags details
17+
:show-nested:

tests/CLI/modules/tag_tests.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_set_tags(self, click):
3333
click.secho.assert_called_with('Set tags successfully', fg='green')
3434
self.assert_no_fail(result)
3535
self.assert_called_with('SoftLayer_Tag', 'setTags',
36-
args=("tag1,tag2", "GUEST", 100),)
36+
args=("tag1,tag2", "GUEST", 100), )
3737

3838
@mock.patch('SoftLayer.CLI.tags.set.click')
3939
def test_set_tags_failure(self, click):
@@ -43,4 +43,16 @@ def test_set_tags_failure(self, click):
4343
click.secho.assert_called_with('Failed to set tags', fg='red')
4444
self.assert_no_fail(result)
4545
self.assert_called_with('SoftLayer_Tag', 'setTags',
46-
args=("tag1,tag2", "GUEST", 100),)
46+
args=("tag1,tag2", "GUEST", 100), )
47+
48+
def test_details_by_name(self):
49+
tag_name = 'bs_test_instance'
50+
result = self.run_command(['tags', 'details', tag_name])
51+
self.assert_no_fail(result)
52+
self.assert_called_with('SoftLayer_Tag', 'getTagByTagName', args=(tag_name,))
53+
54+
def test_details_by_id(self):
55+
tag_id = '1286571'
56+
result = self.run_command(['tags', 'details', tag_id])
57+
self.assert_no_fail(result)
58+
self.assert_called_with('SoftLayer_Tag', 'getObject', identifier=tag_id)

tests/managers/tag_tests.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,29 @@ def test_set_tags(self):
111111

112112
self.tag_manager.set_tags(tags, key_name, resource_id)
113113
self.assert_called_with('SoftLayer_Tag', 'setTags')
114+
115+
def test_get_tag(self):
116+
tag_id = 1286571
117+
result = self.tag_manager.get_tag(tag_id)
118+
self.assertEqual(tag_id, result.get('id'))
119+
self.assert_called_with('SoftLayer_Tag', 'getObject', identifier=tag_id)
120+
121+
def test_get_tag_mask(self):
122+
tag_id = 1286571
123+
result = self.tag_manager.get_tag(tag_id, mask=self.test_mask)
124+
self.assertEqual(tag_id, result.get('id'))
125+
self.assert_called_with('SoftLayer_Tag', 'getObject', identifier=tag_id, mask=self.test_mask)
126+
127+
def test_get_tag_by_name(self):
128+
tag_name = 'bs_test_instance'
129+
result = self.tag_manager.get_tag_by_name(tag_name)
130+
args = (tag_name,)
131+
self.assertEqual(tag_name, result[0].get('name'))
132+
self.assert_called_with('SoftLayer_Tag', 'getTagByTagName', args=args)
133+
134+
def test_get_tag_by_name_mask(self):
135+
tag_name = 'bs_test_instance'
136+
result = self.tag_manager.get_tag_by_name(tag_name, mask=self.test_mask)
137+
args = (tag_name,)
138+
self.assertEqual(tag_name, result[0].get('name'))
139+
self.assert_called_with('SoftLayer_Tag', 'getTagByTagName', mask=self.test_mask, args=args)

0 commit comments

Comments
 (0)