Skip to content

Commit a13fdd0

Browse files
#1230 more unit tests, code cleanup
1 parent 5a61a95 commit a13fdd0

File tree

11 files changed

+143
-29
lines changed

11 files changed

+143
-29
lines changed

SoftLayer/CLI/tags/cleanup.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,7 @@
44
import click
55

66
from SoftLayer.CLI import environment
7-
from SoftLayer.CLI import formatting
8-
from SoftLayer.exceptions import SoftLayerAPIError
97
from SoftLayer.managers.tags import TagManager
10-
from SoftLayer import utils
11-
12-
from pprint import pprint as pp
13-
# pylint: disable=unnecessary-lambda
148

159

1610
@click.command()
@@ -22,12 +16,11 @@ def cli(env, dry_run):
2216

2317
tag_manager = TagManager(env.client)
2418
empty_tags = tag_manager.get_unattached_tags()
25-
19+
2620
for tag in empty_tags:
2721
if dry_run:
2822
click.secho("(Dry Run) Removing {}".format(tag.get('name')), fg='yellow')
2923
else:
3024
result = tag_manager.delete_tag(tag.get('name'))
3125
color = 'green' if result else 'red'
3226
click.secho("Removing {}".format(tag.get('name')), fg=color)
33-

SoftLayer/CLI/tags/delete.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33

44
import click
55

6-
from SoftLayer.CLI.exceptions import ArgumentError
7-
from SoftLayer.managers.tags import TagManager
86
from SoftLayer.CLI import environment
7+
from SoftLayer.managers.tags import TagManager
98

109

1110
@click.command()
@@ -23,9 +22,8 @@ def cli(env, identifier, name):
2322
tag = tag_manager.get_tag(identifier)
2423
tag_name = tag.get('name', None)
2524

26-
2725
result = tag_manager.delete_tag(tag_name)
2826
if result:
2927
click.secho("Tag {} has been removed".format(tag_name), fg='green')
3028
else:
31-
click.secho("Failed to remove tag {}".format(tag_name), fg='red')
29+
click.secho("Failed to remove tag {}".format(tag_name), fg='red')

SoftLayer/CLI/tags/list.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,3 @@ def get_resource_name(tag_manager, resource_id, tag_type):
7373
except SoftLayerAPIError as exception:
7474
name = "{}".format(exception.reason)
7575
return name
76-

SoftLayer/CLI/tags/set.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
@click.command()
11-
@click.option('--tags', '-t', type=click.STRING, required=True,
11+
@click.option('--tags', '-t', type=click.STRING, required=True,
1212
help='Comma seperated list of tags, enclosed in quotes. "tag1, tag2"')
1313
@click.option('--key-name', '-k', type=click.STRING, required=True,
1414
help="Key name of a tag type e.g. GUEST, HARDWARE. See slcli tags taggable output.")

SoftLayer/CLI/tags/taggable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33

44
import click
55

6+
from SoftLayer.CLI import environment
67
from SoftLayer.CLI import formatting
78
from SoftLayer.managers.tags import TagManager
8-
from SoftLayer.CLI import environment
9+
910

1011
@click.command()
1112
@environment.pass_env

SoftLayer/fixtures/SoftLayer_Search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@
2020
}
2121
}
2222
}
23-
]
23+
]

SoftLayer/fixtures/SoftLayer_Tag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
"description": "Hardware",
2929
"keyName": "HARDWARE"
3030
}
31-
]
31+
]

SoftLayer/managers/tags.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def set_tags(self, tags, key_name, resource_id):
120120
def get_all_tag_types(self):
121121
"""Calls SoftLayer_Tag::getAllTagTypes()"""
122122
types = self.client.call('SoftLayer_Tag', 'getAllTagTypes')
123-
useable_types = []
123+
useable_types = []
124124
for tag_type in types:
125125
service = self.type_to_service(tag_type['keyName'])
126126
# Mostly just to remove the types that are not user taggable.
@@ -146,14 +146,14 @@ def taggable_by_type(self, tag_type):
146146
to_return = []
147147
# Fake search result output
148148
for resource in resources:
149-
to_return.append({'resourceType':service, 'resource':resource})
149+
to_return.append({'resourceType': service, 'resource': resource})
150150
return to_return
151151
elif tag_type == 'NETWORK_SUBNET':
152152
resources = self.client.call('SoftLayer_Account', 'getSubnets', iter=True)
153153
to_return = []
154154
# Fake search result output
155155
for resource in resources:
156-
to_return.append({'resourceType':service, 'resource':resource})
156+
to_return.append({'resourceType': service, 'resource': resource})
157157
return to_return
158158
resources = self.client.call('SoftLayer_Search', 'advancedSearch', search_term, iter=True)
159159
return resources
@@ -228,4 +228,3 @@ def get_resource_name(resource, tag_type):
228228
# datatye = 'blockDeviceTemplateGroups'
229229

230230
# return datatye
231-

docs/cli/tags.rst

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Tag Commands
44
============
55

6+
These commands will allow you to interact with the **IMS** provier tagging service. The `IBM Global Search and Tagging API <https://cloud.ibm.com/apidocs/tagging#related-apis>`_ can be used to interact with both the **GHOST** provider and **IMS** provider. The **GHOST** provider will handle tags for things outside of the Classic Infrastructure (aka SoftLayer) space.
67

78
.. click:: SoftLayer.CLI.tags.list:cli
89
:prog: tags list
@@ -14,4 +15,12 @@ Tag Commands
1415

1516
.. click:: SoftLayer.CLI.tags.details:cli
1617
:prog: tags details
17-
:show-nested:
18+
:show-nested:
19+
20+
.. click:: SoftLayer.CLI.tags.delete:cli
21+
:prog: tags delete
22+
:show-nested:
23+
24+
.. click:: SoftLayer.CLI.tags.taggable:cli
25+
:prog: tags taggable
26+
:show-nested:

tests/CLI/modules/tag_tests.py

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
"""
77
import mock
88

9+
from SoftLayer.exceptions import SoftLayerAPIError
910
from SoftLayer import testing
10-
from SoftLayer.managers.tags import TagManager
1111

1212

1313
class TagCLITests(testing.TestCase):
@@ -28,13 +28,23 @@ def test_list_detail(self):
2828
self.assert_called_with('SoftLayer_Tag', 'getReferences', identifier=1286571)
2929
self.assert_called_with('SoftLayer_Virtual_Guest', 'getObject', identifier=33488921)
3030

31+
def test_list_detail_ungettable(self):
32+
mock = self.set_mock('SoftLayer_Virtual_Guest', 'getObject')
33+
mock.side_effect = SoftLayerAPIError(404, "TEST ERROR")
34+
result = self.run_command(['tags', 'list', '-d'])
35+
self.assert_no_fail(result)
36+
self.assertIn("TEST ERROR", result.output) # From fixtures/virutal_guest.getObject
37+
# self.assert_called_with('SoftLayer_Tag', 'getUnattachedTagsForCurrentUser')
38+
self.assert_called_with('SoftLayer_Tag', 'getAttachedTagsForCurrentUser')
39+
self.assert_called_with('SoftLayer_Tag', 'getReferences', identifier=1286571)
40+
self.assert_called_with('SoftLayer_Virtual_Guest', 'getObject', identifier=33488921)
41+
3142
@mock.patch('SoftLayer.CLI.tags.set.click')
3243
def test_set_tags(self, click):
3344
result = self.run_command(['tags', 'set', '--tags=tag1,tag2', '--key-name=GUEST', '--resource-id=100'])
3445
click.secho.assert_called_with('Set tags successfully', fg='green')
3546
self.assert_no_fail(result)
36-
self.assert_called_with('SoftLayer_Tag', 'setTags',
37-
args=("tag1,tag2", "GUEST", 100), )
47+
self.assert_called_with('SoftLayer_Tag', 'setTags', args=("tag1,tag2", "GUEST", 100), )
3848

3949
@mock.patch('SoftLayer.CLI.tags.set.click')
4050
def test_set_tags_failure(self, click):
@@ -43,8 +53,7 @@ def test_set_tags_failure(self, click):
4353
result = self.run_command(['tags', 'set', '--tags=tag1,tag2', '--key-name=GUEST', '--resource-id=100'])
4454
click.secho.assert_called_with('Failed to set tags', fg='red')
4555
self.assert_no_fail(result)
46-
self.assert_called_with('SoftLayer_Tag', 'setTags',
47-
args=("tag1,tag2", "GUEST", 100), )
56+
self.assert_called_with('SoftLayer_Tag', 'setTags', args=("tag1,tag2", "GUEST", 100), )
4857

4958
def test_details_by_name(self):
5059
tag_name = 'bs_test_instance'
@@ -59,9 +68,46 @@ def test_details_by_id(self):
5968
self.assert_called_with('SoftLayer_Tag', 'getObject', identifier=tag_id)
6069

6170
def test_deleteTags_by_name(self):
62-
result = self.run_command(['tags', 'delete', '--name="test"'])
71+
result = self.run_command(['tags', 'delete', 'test'])
6372
self.assert_no_fail(result)
73+
self.assert_called_with('SoftLayer_Tag', 'deleteTag', args=('test',))
6474

6575
def test_deleteTags_by_id(self):
66-
result = self.run_command(['tags', 'delete', '-id=123456'])
76+
result = self.run_command(['tags', 'delete', '123456'])
77+
self.assert_no_fail(result)
78+
self.assert_called_with('SoftLayer_Tag', 'getObject', identifier='123456')
79+
self.assert_called_with('SoftLayer_Tag', 'deleteTag', args=('bs_test_instance',))
80+
81+
def test_deleteTags_by_number_name(self):
82+
result = self.run_command(['tags', 'delete', '123456', '--name'])
83+
self.assert_no_fail(result)
84+
self.assert_called_with('SoftLayer_Tag', 'deleteTag', args=('123456',))
85+
86+
@mock.patch('SoftLayer.CLI.tags.delete.click')
87+
def test_deleteTags_fail(self, click):
88+
mock = self.set_mock('SoftLayer_Tag', 'deleteTag')
89+
mock.return_value = False
90+
result = self.run_command(['tags', 'delete', '123456', '--name'])
91+
click.secho.assert_called_with('Failed to remove tag 123456', fg='red')
92+
self.assert_no_fail(result)
93+
self.assert_called_with('SoftLayer_Tag', 'deleteTag', args=('123456',))
94+
95+
def test_taggable(self):
96+
result = self.run_command(['tags', 'taggable'])
97+
self.assert_no_fail(result)
98+
self.assertIn('"host14.vmware.test.com', result.output)
99+
self.assert_called_with('SoftLayer_Tag', 'getAllTagTypes')
100+
self.assert_called_with('SoftLayer_Search', 'advancedSearch', args=('_objectType:SoftLayer_Hardware',))
101+
102+
def test_cleanup(self):
103+
result = self.run_command(['tags', 'cleanup'])
67104
self.assert_no_fail(result)
105+
self.assert_called_with('SoftLayer_Tag', 'getUnattachedTagsForCurrentUser')
106+
self.assert_called_with('SoftLayer_Tag', 'deleteTag', args=('coreos',))
107+
108+
def test_cleanup_dry(self):
109+
result = self.run_command(['tags', 'cleanup', '-d'])
110+
self.assert_no_fail(result)
111+
self.assertIn('(Dry Run)', result.output)
112+
self.assert_called_with('SoftLayer_Tag', 'getUnattachedTagsForCurrentUser')
113+
self.assertEqual([], self.calls(service='SoftLayer_Tag', method='deleteTag'))

0 commit comments

Comments
 (0)